diff --git a/HACKING b/HACKING index 6704ffc6..3f2d29fa 100644 --- a/HACKING +++ b/HACKING @@ -17,3 +17,45 @@ even when it's only one character. =) Thanks, Curtis + + + +partition usage and unallocated space +===================================== + +After addressing bug #499202 GParted now also displays unallocated space +as well as used and unused space for recognised file systems. The +unallocated space is shown graphically and the numeric figure is shown +in the Information Dialog if it is greater than zero. Additionally a +warning is reported if the unallocated space is considered too much. +See the code and commit messages for more details. + +Worked example of partition and file system usage for a newly created +jfs file system in a 200 MiB partition reporting a small amount of +unallocated space: + +# sfdisk -s /dev/sda9 +204800 + +# echo dm | jfs_debugfs /dev/sda9 | egrep 'Block Size:|dn_mapsize:|dn_nfree:' +Aggregate Block Size: 4096 +[1] dn_mapsize: 0x0000000c6cb [9] dn_agheigth: 0 +[2] dn_nfree: 0x0000000c6a3 [10] dn_agwidth: 1 + +Partition size = 204800 (1K blocks) = 409600 (512 byte sectors) +FS size = 0x0c6cb (4K blocks) + = 50891 (4K blocks) = 407128 (512 byte sectors) +FS free = 0x0c6a3 (4K blocks) + = 50851 (4K blocks) = 406808 (512 byte sectors) + +Calculation: +size = ptn_size = 409600 = 200.00 MiB +used = fs_size - fs_free = 407128 - 406808 = 320 = 160.00 KiB +unused = fs_free = 406808 = 198.64 MiB +unallocated = ptn_size - fs_size = 409600 - 407128 = 2472 = 1.21 MiB + +Figures displayed in the Information dialog: +Size: 200.00 MiB +Used: 160.00 KiB ( 0% ) +Unused: 198.64 MiB ( 99% ) +Unallocated: 1.21 MiB ( 1% ) diff --git a/src/Partition.cc b/src/Partition.cc index c7631619..d37d6f58 100644 --- a/src/Partition.cc +++ b/src/Partition.cc @@ -21,8 +21,6 @@ namespace GParted { -#define SIGNIFICANT_UNALLOCATED_FRACTION 0.05 - Partition::Partition() { Reset() ; @@ -293,13 +291,38 @@ bool Partition::compare_paths( const Glib::ustring & A, const Glib::ustring & B } //Return threshold of sectors which is considered above the intrinsic -// level for a file system which "fills" the partition. +// level for a file system which "fills" the partition. Calculation +// is: +// %age of partition size , when +// 5% , ptn size <= 100 MiB +// linear scaling from 5% down to 2%, 100 MiB < ptn size <= 1 GiB +// 2% , 1 GiB < ptn size Sector Partition::get_significant_unallocated_sectors() const { - Sector length = get_sector_length() ; - if ( length >= 0 ) - return Utils::round( length * SIGNIFICANT_UNALLOCATED_FRACTION ) ; - return 0 ; + const double HIGHER_UNALLOCATED_FRACTION = 0.05 ; + const double LOWER_UNALLOCATED_FRACTION = 0.02 ; + Sector length = get_sector_length() ; + Byte_Value byte_len = length * sector_size ; + if ( byte_len <= 0 ) + { + return 0 ; + } + else if ( byte_len <= 100 * MEBIBYTE ) + { + return Utils::round( length * HIGHER_UNALLOCATED_FRACTION ) ; + } + else if ( byte_len <= 1 * GIBIBYTE ) + { + double fraction = ( HIGHER_UNALLOCATED_FRACTION - LOWER_UNALLOCATED_FRACTION ) - + ( byte_len - 100 * MEBIBYTE ) * ( HIGHER_UNALLOCATED_FRACTION - LOWER_UNALLOCATED_FRACTION ) / + ( 1 * GIBIBYTE - 100 * MEBIBYTE ) + + LOWER_UNALLOCATED_FRACTION ; + return Utils::round( length * fraction ) ; + } + else + { + return Utils::round( length * LOWER_UNALLOCATED_FRACTION ) ; + } } Partition::~Partition()