diff options
author | Karel Zak | 2015-09-02 14:49:36 +0200 |
---|---|---|
committer | Karel Zak | 2015-09-07 10:18:46 +0200 |
commit | 9a17d9460a163abdce01276450864dcfe7b2b5d6 (patch) | |
tree | 439c8bd289ed73ec641a89ab6b0a94408ac5b6f0 | |
parent | build-sys: release++ (v2.27) (diff) | |
download | kernel-qcow2-util-linux-9a17d9460a163abdce01276450864dcfe7b2b5d6.tar.gz kernel-qcow2-util-linux-9a17d9460a163abdce01276450864dcfe7b2b5d6.tar.xz kernel-qcow2-util-linux-9a17d9460a163abdce01276450864dcfe7b2b5d6.zip |
sfdisk: add --reorder
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1232707
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r-- | disk-utils/sfdisk.8 | 3 | ||||
-rw-r--r-- | disk-utils/sfdisk.c | 40 | ||||
-rwxr-xr-x | tests/ts/sfdisk/gpt | 22 |
3 files changed, 63 insertions, 2 deletions
diff --git a/disk-utils/sfdisk.8 b/disk-utils/sfdisk.8 index f35eadd07..0991f6962 100644 --- a/disk-utils/sfdisk.8 +++ b/disk-utils/sfdisk.8 @@ -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 diff --git a/disk-utils/sfdisk.c b/disk-utils/sfdisk.c index c2ef44d89..21e90835b 100644 --- a/disk-utils/sfdisk.c +++ b/disk-utils/sfdisk.c @@ -73,6 +73,7 @@ enum { ACT_LIST, ACT_LIST_FREE, ACT_LIST_TYPES, + ACT_REORDER, ACT_SHOW_SIZE, ACT_SHOW_GEOM, ACT_VERIFY, @@ -644,6 +645,35 @@ static int command_activate(struct sfdisk *sf, int argc, char **argv) } /* + * 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> */ static int command_dump(struct sfdisk *sf, int argc, char **argv) @@ -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); diff --git a/tests/ts/sfdisk/gpt b/tests/ts/sfdisk/gpt index bb0243d30..2c3d5ccc6 100755 --- a/tests/ts/sfdisk/gpt +++ b/tests/ts/sfdisk/gpt @@ -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 |