]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: fix cylinders and sector buffer usage
authorKarel Zak <kzak@redhat.com>
Wed, 18 Sep 2013 12:50:54 +0000 (14:50 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 18 Sep 2013 12:50:54 +0000 (14:50 +0200)
 - sector buffer has to be correctly deallocated
 - round to cylinders when use cylinder units in dos driver

Signed-off-by: Karel Zak <kzak@redhat.com>
libfdisk/src/alignment.c
libfdisk/src/dos.c
libfdisk/src/fdiskP.h
libfdisk/src/sgi.c
libfdisk/src/sun.c

index ae6d30cef7bd218c65aa2e0d4c2b68937699bd90..0f445acc3cd54659dad7dd41b5bbeb3c36c33945 100644 (file)
@@ -492,6 +492,12 @@ sector_t fdisk_scround(struct fdisk_context *cxt, sector_t num)
        return (num + un - 1) / un;
 }
 
+sector_t fdisk_cround(struct fdisk_context *cxt, sector_t num)
+{
+       return fdisk_context_use_cylinders(cxt) ?
+                       (num / fdisk_context_get_units_per_sector(cxt)) + 1 : num;
+}
+
 int fdisk_reread_partition_table(struct fdisk_context *cxt)
 {
        int i;
index d83da432e6ebcaece3410ca95b58babd8ae49666..d9b1e745b2e970366af87d06ef27ea40a8747615 100644 (file)
@@ -82,7 +82,7 @@ static struct fdisk_parttype dos_parttypes[] = {
                   (fdisk_is_disklabel(_x, DOS) && \
                     fdisk_dos_is_compatible(fdisk_context_get_label(_x, NULL)))
 
-#define cround(c, n)   fdisk_scround(c, n)
+#define cround(c, n)   fdisk_cround(c, n)
 
 
 static inline struct fdisk_dos_label *self_label(struct fdisk_context *cxt)
@@ -722,6 +722,10 @@ static void set_partition(struct fdisk_context *cxt,
        struct dos_partition *p;
        sector_t offset;
 
+       DBG(LABEL, dbgprint("DOS: setting partition %d%s, start=%zu, stop=%zu, sysid=%02x",
+                               i, doext ? " [extended]" : "",
+                               (size_t) start, (size_t) stop, sysid));
+
        if (doext) {
                struct fdisk_dos_label *l = self_label(cxt);
                p = pe->ex_entry;
@@ -830,9 +834,10 @@ static int add_partition(struct fdisk_context *cxt, int n, struct fdisk_parttype
                        + dos_partition_get_size(q) - 1;
        }
        if (fdisk_context_use_cylinders(cxt))
-               for (i = 0; i < cxt->label->nparts_max; i++)
+               for (i = 0; i < cxt->label->nparts_max; i++) {
                        first[i] = (cround(cxt, first[i]) - 1)
                                * fdisk_context_get_units_per_sector(cxt);
+               }
 
        /*
         * Ask for first sector
@@ -950,6 +955,11 @@ static int add_partition(struct fdisk_context *cxt, int n, struct fdisk_parttype
 
                stop = fdisk_ask_number_get_result(ask);
 
+               if (fdisk_context_use_cylinders(cxt)) {
+                       stop = stop * fdisk_context_get_units_per_sector(cxt) - 1;
+                        if (stop >limit)
+                                stop = limit;
+               }
                if (fdisk_ask_number_is_relative(ask)
                    && alignment_required(cxt)) {
                        /* the last sector has not been exactly requested (but
index 45a93c8c3d31f71696240e656f834ad305e579a9..b03586fae21d3a6aeacdf5df142723d1bdab0c73 100644 (file)
@@ -315,6 +315,7 @@ extern int fdisk_context_listonly(struct fdisk_context *cxt);
 
 /* alignment.c */
 extern sector_t fdisk_scround(struct fdisk_context *cxt, sector_t num);
+extern sector_t fdisk_cround(struct fdisk_context *cxt, sector_t num);
 
 extern sector_t fdisk_topology_get_first_lba(struct fdisk_context *cxt);
 extern unsigned long fdisk_topology_get_grain(struct fdisk_context *cxt);
index 17ed6a8393814d8dc0c60c0ce6a18c37f0be368f..1e8402eecd4e872e4193fc70e6efc007db61e78d 100644 (file)
@@ -933,6 +933,9 @@ static int sgi_add_partition(struct fdisk_context *cxt,
        if (rc)
                return rc;
 
+       if (fdisk_context_use_cylinders(cxt))
+               last *= fdisk_context_get_units_per_sector(cxt);
+
        if (sys == SGI_TYPE_ENTIRE_DISK
            && (first != 0 || last != sgi_get_lastblock(cxt)))
                fdisk_info(cxt, _("It is highly recommended that eleventh "
index 846af58ecc49e277e4e4829fce6872479384ed5c..41c156767a00a3a13dcf9f5cccc093deabaa5cf8 100644 (file)
@@ -607,6 +607,9 @@ static int sun_add_partition(
        if (rc)
                return rc;
 
+       if (fdisk_context_use_cylinders(cxt))
+               last *= fdisk_context_get_units_per_sector(cxt);
+
        if (n == 2 && !first) {
                if (last >= stop2) {
                    whole_disk = 1;