Subject: Re: bug#20909: incorrect partition size calculation

From: Gena Makhomed <[email-masked]>
Date: Mon, 29 Jun 2015 21:37:34 +0300

On 29.06.2015 20:43, Brian C. Lane wrote:

>> incorrect partition size calculation
>>
>> # parted -v
>> parted (GNU parted) 2.3
>>
>> Model: ATA HGST HUS724040AL (scsi)
>> Disk /dev/sda: 7814037168s
>>
>> how to reproduce:
>>
>> parted -s /dev/sda mklabel gpt
>> parted -s /dev/sda -a none mkpart primary 34s 2047s
>> parted -s /dev/sda set 1 bios_grub on
>> parted -s /dev/sda mkpart primary 2048s 2099199s
>> parted -s /dev/sda set 2 raid on
>> parted -s /dev/sda mkpart primary 2099200s 102764543s
>> parted -s /dev/sda set 3 raid on
>> parted -s /dev/sda mkpart primary zfs 102764544s 7814037134s
>>
>> parted
>> (parted) unit s
>> (parted) print free
>> Model: ATA HGST HUS724040AL (scsi)
>> Disk /dev/sda: 7814037168s
>> Sector size (logical/physical): 512B/512B
>> Partition Table: gpt
>>
>> Number  Start       End          Size         File system  Name     Flags
>>   1      34s         2047s        2014s                     primary bios_grub
>>   2      2048s       2099199s     2097152s                  primary  raid
>>   3      2099200s    102764543s   100665344s                primary  raid
>>   4      102764544s  7814037134s  7711272591s               primary
>>
>> (parted)
>>
>> =======================================
>>
>> parted reports what /dev/sda4 partition has size of 7711272591s
>> but this is not true, partition size is 7711272590s:
>>
>> 7814037168 - 2014 -  2097152 - 100665344 - 34 - 34 == 7711272590
>
> You are off by 1. start and end are inclusive so the size of sda4 is:
>
> 1 + (7814037134 - 102764544) = 7711272591
>

yes, you are right, sorry.
7814037168 - 2014 -  2097152 - 100665344 - 33 - 33 -1 == 7711272591

2014s,  2097152s, 100665344s and 7711272591s is size of partitions,
1s size of MBR and 33s + 33s is size of two copies of GPT.

BTW, "start and end are inclusive" - IMHO is very bad decision,
because now it is not possible to partition disk using MiB units
and always need use sectors and make all calculations manually.

for example, parted -s /dev/sda mkpart primary 34s 1MiB
now use one sector from second MiB and next partition
will be created as unaligned.

if use common scheme as in java - start index inclusive
and end index exclusive, - disk partitioning
will be very easy and obvious:

parted -s /dev/sda mkpart primary 34s 1MiB
parted -s /dev/sda mkpart primary 1MiB 1025MiB
parted -s /dev/sda mkpart primary 1025MiB 50178MiB
parted -s /dev/sda mkpart primary 50178MiB -- -34s

1-MiB alignment boundary recommended
for all GPT partitions except bios_grub one,
which contains core.img for read-only access:
https://en.wikipedia.org/wiki/BIOS_boot_partition

-- 
Best regards,
  Gena