diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2012-08-28 04:00:52 -0400 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2012-08-28 04:44:05 -0400 |
commit | f23a5c468e959f86df89e2a4e8aa9160eca532f8 (patch) | |
tree | 9af42fe1783d6c550f0764bb9df84d6a6e730341 | |
parent | c2ac512f12cc87d27d04f69cb70b2c5e4c4a9bc5 (diff) | |
download | libguestfs-f23a5c468e959f86df89e2a4e8aa9160eca532f8.tar.gz libguestfs-f23a5c468e959f86df89e2a4e8aa9160eca532f8.tar.xz libguestfs-f23a5c468e959f86df89e2a4e8aa9160eca532f8.zip |
Modified API: mkswap now takes optional arguments.
Add optional label and uuid arguments, and deprecate mkswap-L and
mkswap-U.
This also adds a call to udev_settle after creating the swap device.
This is an attempt to workaround the following problem seen in Koji
and Rawhide:
libguestfs: trace: mkswap_L "swapit" "/dev/sda1"
libguestfs: send_to_daemon: 72 bytes: 00 00 00 44 | 20 00 f5 f5 | 00 00 00 04 | 00 00 00 83 | 00 00 00 00 | ...
guestfsd: main_loop: proc 210 (part_disk) took 2.28 seconds
guestfsd: main_loop: new request, len 0x44
mkswap -f -L swapit /dev/sda1
libguestfs: recv_from_daemon: 40 bytes: 20 00 f5 f5 | 00 00 00 04 | 00 00 00 83 | 00 00 00 01 | 00 12 37 cf | ...
libguestfs: trace: mkswap_L = 0
libguestfs: trace: swapon_label "swapit"
libguestfs: send_to_daemon: 56 bytes: 00 00 00 34 | 20 00 f5 f5 | 00 00 00 04 | 00 00 00 ae | 00 00 00 00 | ...
guestfsd: main_loop: proc 131 (mkswap_L) took 0.77 seconds
guestfsd: main_loop: new request, len 0x34
swapon -L swapit
swapon: cannot find the device for swapit
guestfsd: error: swapit: swapon: cannot find the device for swapit
libguestfs: recv_from_daemon: 100 bytes: 20 00 f5 f5 | 00 00 00 04 | 00 00 00 ae | 00 00 00 01 | 00 12 37 d0 | ...
libguestfs: trace: swapon_label = -1 (error)
swapon_label: swapit: swapon: cannot find the device for swapit
test_swapon_label_0 FAILED
-rw-r--r-- | daemon/swap.c | 70 | ||||
-rw-r--r-- | generator/generator_actions.ml | 31 | ||||
-rw-r--r-- | gobject/Makefile.inc | 2 | ||||
-rw-r--r-- | po/POTFILES | 1 |
4 files changed, 73 insertions, 31 deletions
diff --git a/daemon/swap.c b/daemon/swap.c index 51dbbe48..8f1b59de 100644 --- a/daemon/swap.c +++ b/daemon/swap.c @@ -56,56 +56,71 @@ optgroup_linuxfsuuid_available (void) return av; } -static int -mkswap (const char *device, const char *flag, const char *value) +/* Takes optional arguments, consult optargs_bitmask. */ +int +do_mkswap (const char *device, const char *label, const char *uuid) { - char *err; + const size_t MAX_ARGS = 64; + const char *argv[MAX_ARGS]; + size_t i = 0; int r; + char *err; - if (!flag) - r = command (NULL, &err, "mkswap", "-f", device, NULL); - else - r = command (NULL, &err, "mkswap", "-f", flag, value, device, NULL); + ADD_ARG (argv, i, "mkswap"); + ADD_ARG (argv, i, "-f"); + + if (optargs_bitmask & GUESTFS_MKSWAP_LABEL_BITMASK) { + if (strlen (label) > SWAP_LABEL_MAX) { + reply_with_error ("%s: Linux swap labels are limited to %d bytes", + label, SWAP_LABEL_MAX); + return -1; + } + + ADD_ARG (argv, i, "-L"); + ADD_ARG (argv, i, label); + } + if (optargs_bitmask & GUESTFS_MKSWAP_UUID_BITMASK) { + ADD_ARG (argv, i, "-U"); + ADD_ARG (argv, i, uuid); + } + + ADD_ARG (argv, i, device); + ADD_ARG (argv, i, NULL); + + r = commandv (NULL, &err, argv); if (r == -1) { - reply_with_error ("%s", err); + reply_with_error ("%s: %s", device, err); free (err); return -1; } free (err); - return 0; -} + udev_settle (); -int -do_mkswap (const char *device) -{ - return mkswap (device, NULL, NULL); + return 0; } int do_mkswap_L (const char *label, const char *device) { - if (strlen (label) > SWAP_LABEL_MAX) { - reply_with_error ("%s: Linux swap labels are limited to %d bytes", - label, SWAP_LABEL_MAX); - return -1; - } - - return mkswap (device, "-L", label); + optargs_bitmask = GUESTFS_MKSWAP_LABEL_BITMASK; + return do_mkswap (device, label, NULL); } int do_mkswap_U (const char *uuid, const char *device) { - return mkswap (device, "-U", uuid); + optargs_bitmask = GUESTFS_MKSWAP_UUID_BITMASK; + return do_mkswap (device, NULL, uuid); } int do_mkswap_file (const char *path) { char *buf; + char *err; int r; buf = sysroot_path (path); @@ -114,8 +129,17 @@ do_mkswap_file (const char *path) return -1; } - r = mkswap (buf, NULL, NULL); + r = command (NULL, &err, "mkswap", "-f", buf, NULL); free (buf); + + if (r == -1) { + reply_with_error ("%s: %s", path, err); + free (err); + return -1; + } + + free (err); + return r; } diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml index 8cc9bb39..dbf5d000 100644 --- a/generator/generator_actions.ml +++ b/generator/generator_actions.ml @@ -4908,21 +4908,35 @@ the command C<mount -o loop file mountpoint>." }; { defaults with name = "mkswap"; - style = RErr, [Device "device"], []; + style = RErr, [Device "device"], [OString "label"; OString "uuid"]; proc_nr = Some 130; - tests = [ + once_had_no_optargs = true; + tests = (let uuid = uuidgen () in [ InitEmpty, Always, TestRun ( [["part_disk"; "/dev/sda"; "mbr"]; - ["mkswap"; "/dev/sda1"]]) - ]; + ["mkswap"; "/dev/sda1"; "NOARG"; "NOARG"]]); + InitEmpty, Always, TestRun ( + [["part_disk"; "/dev/sda"; "mbr"]; + ["mkswap"; "/dev/sda1"; "hello"; "NOARG"]]); + InitEmpty, Always, TestRun ( + [["part_disk"; "/dev/sda"; "mbr"]; + ["mkswap"; "/dev/sda1"; "NOARG"; uuid]]); + InitEmpty, Always, TestRun ( + [["part_disk"; "/dev/sda"; "mbr"]; + ["mkswap"; "/dev/sda1"; "hello"; uuid]]) + ]); shortdesc = "create a swap partition"; longdesc = "\ -Create a swap partition on C<device>." }; +Create a Linux swap partition on C<device>. + +The option arguments C<label> and C<uuid> allow you to set the +label and/or UUID of the new swap partition." }; { defaults with name = "mkswap_L"; style = RErr, [String "label"; Device "device"], []; proc_nr = Some 131; + deprecated_by = Some "mkswap"; tests = [ InitEmpty, Always, TestRun ( [["part_disk"; "/dev/sda"; "mbr"]; @@ -4940,6 +4954,7 @@ a limitation of the kernel or swap tools." }; name = "mkswap_U"; style = RErr, [String "uuid"; Device "device"], []; proc_nr = Some 132; + deprecated_by = Some "mkswap"; optional = Some "linuxfsuuid"; tests = (let uuid = uuidgen () in [ @@ -5660,7 +5675,7 @@ attaches it as a device." }; proc_nr = Some 170; tests = [ InitPartition, Always, TestRun ( - [["mkswap"; "/dev/sda1"]; + [["mkswap"; "/dev/sda1"; "NOARG"; "NOARG"]; ["swapon_device"; "/dev/sda1"]; ["swapoff_device"; "/dev/sda1"]]) ]; @@ -5720,7 +5735,7 @@ This command disables the libguestfs appliance swap on file." }; tests = [ InitEmpty, Always, TestRun ( [["part_disk"; "/dev/sda"; "mbr"]; - ["mkswap_L"; "swapit"; "/dev/sda1"]; + ["mkswap"; "/dev/sda1"; "swapit"; "NOARG"]; ["swapon_label"; "swapit"]; ["swapoff_label"; "swapit"]; ["zero"; "/dev/sda"]; @@ -5748,7 +5763,7 @@ labeled swap partition." }; tests = (let uuid = uuidgen () in [ InitEmpty, Always, TestRun ( - [["mkswap_U"; uuid; "/dev/sdc"]; + [["mkswap"; "/dev/sdc"; "NOARG"; uuid]; ["swapon_uuid"; uuid]; ["swapoff_uuid"; uuid]]) ]); diff --git a/gobject/Makefile.inc b/gobject/Makefile.inc index 9f81cd2c..13dc3e3d 100644 --- a/gobject/Makefile.inc +++ b/gobject/Makefile.inc @@ -49,6 +49,7 @@ guestfs_gobject_headers= \ include/guestfs-gobject/optargs-umount.h \ include/guestfs-gobject/optargs-tar_in.h \ include/guestfs-gobject/optargs-tar_out.h \ + include/guestfs-gobject/optargs-mkswap.h \ include/guestfs-gobject/optargs-grep.h \ include/guestfs-gobject/optargs-mkfs.h \ include/guestfs-gobject/optargs-mount_9p.h \ @@ -104,6 +105,7 @@ guestfs_gobject_sources= \ src/optargs-umount.c \ src/optargs-tar_in.c \ src/optargs-tar_out.c \ + src/optargs-mkswap.c \ src/optargs-grep.c \ src/optargs-mkfs.c \ src/optargs-mount_9p.c \ diff --git a/po/POTFILES b/po/POTFILES index d961ac12..65dea19c 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -153,6 +153,7 @@ gobject/src/optargs-internal_test.c gobject/src/optargs-md_create.c gobject/src/optargs-mkfs.c gobject/src/optargs-mkfs_btrfs.c +gobject/src/optargs-mkswap.c gobject/src/optargs-mount_9p.c gobject/src/optargs-mount_local.c gobject/src/optargs-ntfsclone_out.c |