]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: (gpt) don't align last possible LBA
authorKarel Zak <kzak@redhat.com>
Mon, 1 Sep 2014 12:42:12 +0000 (14:42 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 1 Sep 2014 12:42:12 +0000 (14:42 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
libfdisk/src/alignment.c
libfdisk/src/gpt.c

index 9e1e722c8777b6eef6b9e8ba51b2dd34c485fbaa..22be7a106c4cc2c8c817a93cdd4f40fd61d55bcf 100644 (file)
@@ -106,15 +106,25 @@ sector_t fdisk_align_lba(struct fdisk_context *cxt, sector_t lba, int direction)
 sector_t fdisk_align_lba_in_range(struct fdisk_context *cxt,
                                  sector_t lba, sector_t start, sector_t stop)
 {
+       sector_t res;
+
        start = fdisk_align_lba(cxt, start, FDISK_ALIGN_UP);
        stop = fdisk_align_lba(cxt, stop, FDISK_ALIGN_DOWN);
        lba = fdisk_align_lba(cxt, lba, FDISK_ALIGN_NEAREST);
 
        if (lba < start)
-               return start;
+               res = start;
        else if (lba > stop)
-               return stop;
-       return lba;
+               res = stop;
+       else
+               res = lba;
+
+       DBG(CXT, ul_debugobj(cxt, "LBA %ju range:<%ju..%ju>, result: %ju",
+                               (uintmax_t) lba,
+                               (uintmax_t) start,
+                               (uintmax_t) stop,
+                               (uintmax_t) res));
+       return res;
 }
 
 /**
index bfdcd7adc1e75a0edc52966cda7e738910a76aae..5b06159a48bc6770fe250556c8b96879e9aeaf4f 100644 (file)
@@ -1803,6 +1803,7 @@ static int gpt_add_partition(
 
        /* first sector */
        if (pa && pa->start) {
+               DBG(LABEL, ul_debug("first sector defined: %ju", pa->start));
                if (pa->start != find_first_available(pheader, ents, pa->start)) {
                        fdisk_warnx(cxt, _("Sector %ju already used."), pa->start);
                        return -ERANGE;
@@ -1843,13 +1844,11 @@ static int gpt_add_partition(
        dflt_l = find_last_free(pheader, ents, user_f);
 
        if (pa && pa->size) {
-               user_l = user_f + pa->size;
-               user_l = fdisk_align_lba_in_range(cxt, user_l, user_f, dflt_l) - 1;
-
-               /* no space for anything useful, use all space
-               if (user_l + (cxt->grain / cxt->sector_size) > dflt_l)
-                       user_l = dflt_l;
-               */
+               user_l = user_f + pa->size - 1;
+               DBG(LABEL, ul_debug("size defined: %ju, end: %ju (last possible: %ju)",
+                                       pa->size, user_l, dflt_l));
+               if (user_l != dflt_l)
+                       user_l = fdisk_align_lba_in_range(cxt, user_l, user_f, dflt_l) - 1;
 
        } else if (pa && pa->end_follow_default) {
                user_l = dflt_l;
@@ -1885,8 +1884,6 @@ static int gpt_add_partition(
                }
        }
 
-       DBG(LABEL, ul_debug("GPT new partition: partno=%zu, start=%ju, end=%ju",
-                               partnum, user_f, user_l));
 
        if (user_f > user_l || partnum >= cxt->label->nparts_max) {
                fdisk_warnx(cxt, _("Could not create partition %zu"), partnum + 1);
@@ -1919,6 +1916,12 @@ static int gpt_add_partition(
        if (pa && pa->name && *pa->name)
                gpt_entry_set_name(e, pa->name);
 
+       DBG(LABEL, ul_debug("GPT new partition: partno=%zu, start=%ju, end=%ju, size=%ju",
+                               partnum,
+                               gpt_partition_start(e),
+                               gpt_partition_end(e),
+                               gpt_partition_size(e)));
+
        gpt_recompute_crc(gpt->pheader, ents);
        gpt_recompute_crc(gpt->bheader, ents);