]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: (sun) enhance searching of free space
authorMikhail Vorobyov <m.vorobyov@cs.msu.ru>
Thu, 9 Nov 2017 03:47:16 +0000 (06:47 +0300)
committerKarel Zak <kzak@redhat.com>
Thu, 16 Nov 2017 13:11:19 +0000 (14:11 +0100)
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.

libfdisk/src/sun.c

index 7ffd364f46768a7a62208cc6e55dfe40fc16d675..923b73e326cdd2be8baeda5e082bf98ae57466be 100644 (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;