libfdisk: (sun) enhance searching of free space

Potential partition start should be aligned to cylinders. So fdisk
wouldn't consider partition's last cylinder remains as eligible space
for new partition start.
This commit is contained in:
Mikhail Vorobyov 2017-11-09 06:47:16 +03:00 committed by Karel Zak
parent 45ce148778
commit 9e6ccaab5b
1 changed files with 9 additions and 4 deletions

View File

@ -326,6 +326,7 @@ static void fetch_sun(struct fdisk_context *cxt,
struct sun_disklabel *sunlabel;
int continuous = 1;
size_t i;
int sectors_per_cylinder = cxt->geom.heads * cxt->geom.sectors;
assert(cxt);
assert(cxt);
@ -335,7 +336,7 @@ static void fetch_sun(struct fdisk_context *cxt,
sunlabel = self_disklabel(cxt);
*start = 0;
*stop = cxt->geom.cylinders * cxt->geom.heads * cxt->geom.sectors;
*stop = cxt->geom.cylinders * sectors_per_cylinder;
for (i = 0; i < cxt->label->nparts_max; i++) {
struct sun_partition *part = &sunlabel->partitions[i];
@ -345,12 +346,16 @@ static void fetch_sun(struct fdisk_context *cxt,
be16_to_cpu(info->id) != SUN_TAG_UNASSIGNED &&
be16_to_cpu(info->id) != SUN_TAG_WHOLEDISK) {
starts[i] = be32_to_cpu(part->start_cylinder) *
cxt->geom.heads * cxt->geom.sectors;
sectors_per_cylinder;
lens[i] = be32_to_cpu(part->num_sectors);
if (continuous) {
if (starts[i] == *start)
if (starts[i] == *start) {
*start += lens[i];
else if (starts[i] + lens[i] >= *stop)
int remained_sectors = *start % sectors_per_cylinder;
if (remained_sectors) {
*start += sectors_per_cylinder - remained_sectors;
}
} else if (starts[i] + lens[i] >= *stop)
*stop = starts[i];
else
continuous = 0;