]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
sfdisk: add --reorder
authorKarel Zak <kzak@redhat.com>
Wed, 2 Sep 2015 12:49:36 +0000 (14:49 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 7 Sep 2015 08:18:46 +0000 (10:18 +0200)
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1232707
Signed-off-by: Karel Zak <kzak@redhat.com>
disk-utils/sfdisk.8
disk-utils/sfdisk.c
tests/ts/sfdisk/gpt

index f35eadd079bc28b502c2e6995b28db4539caaa99..0991f696285c00b87ce514980fb00f762043cbeb 100644 (file)
@@ -110,6 +110,9 @@ or a GUID for GPT.  For backward compatibility the options \fB\-c\fR and
 Change the GPT partition UUID.  If \fIuuid\fR is not specified,
 then print the current partition UUID.
 .TP
+.BR \-r , " \-\-reorder " \fIdevice
+Fix partitions order by start offset.
+.TP
 .BR \-s , " \-\-show\-size " [ \fIdevice ...]
 List the sizes of all or the specified devices.
 .TP
index c2ef44d892bd5d308cd7b3288c8401784e0738e5..21e90835b5fef9d4e10f6201d9d2fac627f63c4f 100644 (file)
@@ -73,6 +73,7 @@ enum {
        ACT_LIST,
        ACT_LIST_FREE,
        ACT_LIST_TYPES,
+       ACT_REORDER,
        ACT_SHOW_SIZE,
        ACT_SHOW_GEOM,
        ACT_VERIFY,
@@ -643,6 +644,35 @@ static int command_activate(struct sfdisk *sf, int argc, char **argv)
        return rc;
 }
 
+/*
+ * sfdisk --reorder <device>
+ */
+static int command_reorder(struct sfdisk *sf, int argc, char **argv)
+{
+       const char *devname = NULL;
+       int rc;
+
+       if (argc)
+               devname = argv[0];
+       if (!devname)
+               errx(EXIT_FAILURE, _("no disk device specified"));
+
+       rc = fdisk_assign_device(sf->cxt, devname, 0);  /* read-write */
+       if (rc)
+               err(EXIT_FAILURE, _("cannot open %s"), devname);
+
+       if (sf->backup)
+               backup_partition_table(sf, devname);
+
+       if (fdisk_reorder_partitions(sf->cxt) == 1)     /* unchnaged */
+               rc = fdisk_deassign_device(sf->cxt, 1);
+       else
+               rc = write_changes(sf);
+
+       return rc;
+}
+
+
 /*
  * sfdisk --dump <device>
  */
@@ -1436,6 +1466,7 @@ static void __attribute__ ((__noreturn__)) usage(FILE *out)
        fputs(_(" -g, --show-geometry [<dev> ...]   list geometry of all or specified devices\n"), out);
        fputs(_(" -l, --list [<dev> ...]            list partitions of each device\n"), out);
        fputs(_(" -F, --list-free [<dev> ...]       list unpartitions free areas of each device\n"), out);
+       fputs(_(" -r, --reorder <dev>               fix partitions order (by start offset)\n"), out);
        fputs(_(" -s, --show-size [<dev> ...]       list sizes of all or specified devices\n"), out);
        fputs(_(" -T, --list-types                  print the recognized types (see -X)\n"), out);
        fputs(_(" -V, --verify [<dev> ...]          test whether partitions seem correct\n"), out);
@@ -1525,6 +1556,7 @@ int main(int argc, char *argv[])
                { "no-reread", no_argument,     NULL, OPT_NOREREAD },
                { "output",  required_argument, NULL, 'o' },
                { "partno",  required_argument, NULL, 'N' },
+               { "reorder", no_argument,       NULL, 'r' },
                { "show-size", no_argument,     NULL, 's' },
                { "show-geometry", no_argument, NULL, 'g' },
                { "quiet",   no_argument,       NULL, 'q' },
@@ -1551,7 +1583,7 @@ int main(int argc, char *argv[])
        textdomain(PACKAGE);
        atexit(close_stdout);
 
-       while ((c = getopt_long(argc, argv, "aAbcdfFghJlLo:O:nN:qsTu:vVX:Y:",
+       while ((c = getopt_long(argc, argv, "aAbcdfFghJlLo:O:nN:qrsTu:vVX:Y:",
                                        longopts, &longidx)) != -1) {
                switch(c) {
                case 'A':
@@ -1614,6 +1646,9 @@ int main(int argc, char *argv[])
                case 'q':
                        sf->quiet = 1;
                        break;
+               case 'r':
+                       sf->act = ACT_REORDER;
+                       break;
                case 's':
                        sf->act = ACT_SHOW_SIZE;
                        break;
@@ -1734,6 +1769,9 @@ int main(int argc, char *argv[])
                rc = command_partattrs(sf, argc - optind, argv + optind);
                break;
 
+       case ACT_REORDER:
+               rc = command_reorder(sf, argc - optind, argv + optind);
+               break;
        }
 
        sfdisk_deinit(sf);
index bb0243d30be184c6f0288f96765c35aa5ad8d979..2c3d5ccc6d3f729b1f428fc4861b1309b9286cee 100755 (executable)
@@ -97,7 +97,6 @@ ${TS_DEVICE}2 : start=8192,  size=6144, uuid=44b51def-5f04-465a-91aa-2889a62d8e4
 ${TS_DEVICE}3 : start=14336, size=6144, uuid=643e1d0d-bc02-4ced-b83b-86121062858f
 ${TS_DEVICE}4 : start=20480, size=81887,uuid=d2a29b0a-fdee-40c3-9bae-b9fa782c986c, name="GPT is the best"
 EOF
-ts_fdisk_clean $TS_DEVICE
 udevadm settle
 $TS_CMD_SFDISK --list -o START,END,SIZE,UUID,TYPE,NAME ${TS_DEVICE} >> $TS_OUTPUT 2>&1
 ts_fdisk_clean $TS_DEVICE
@@ -136,5 +135,26 @@ udevadm settle
 ts_finalize_subtest
 
 
+ts_init_subtest "reorder"
+$TS_CMD_WIPEFS -a ${TS_DEVICE} &> /dev/null
+udevadm settle
+$TS_CMD_SFDISK ${TS_DEVICE} >> $TS_OUTPUT 2>&1 <<EOF
+unit: sectors
+label: gpt
+label-id: 3b8559db-33af-43e9-befc-c331d829b539
+
+${TS_DEVICE}1 : start=8192,  size=6144
+${TS_DEVICE}2 : start=2048,  size=6144
+${TS_DEVICE}3 : start=20480, size=81887
+${TS_DEVICE}4 : start=14336, size=6144
+EOF
+udevadm settle
+$TS_CMD_SFDISK --reorder ${TS_DEVICE} >> $TS_OUTPUT 2>&1
+$TS_CMD_SFDISK --list ${TS_DEVICE} >> $TS_OUTPUT 2>&1
+ts_fdisk_clean $TS_DEVICE
+udevadm settle
+ts_finalize_subtest
+
+
 rmmod scsi_debug
 ts_finalize