diff options
-rw-r--r-- | daemon/mount.c | 31 | ||||
-rw-r--r-- | generator/generator_actions.ml | 23 | ||||
-rw-r--r-- | gobject/Makefile.inc | 2 | ||||
-rw-r--r-- | po/POTFILES | 1 |
4 files changed, 41 insertions, 16 deletions
diff --git a/daemon/mount.c b/daemon/mount.c index 0661eb87..b5b932d8 100644 --- a/daemon/mount.c +++ b/daemon/mount.c @@ -29,6 +29,8 @@ #include "daemon.h" #include "actions.h" +#define MAX_ARGS 64 + /* You must mount something on "/" first before many operations. * Hence we have an internal function which can test if something is * mounted on *or under* the sysroot directory. (It has to be *or @@ -183,16 +185,17 @@ do_mount_options (const char *options, const char *device, return do_mount_vfs (options, NULL, device, mountpoint); } -/* Again, use the external /bin/umount program, so that /etc/mtab - * is kept updated. - */ +/* Takes optional arguments, consult optargs_bitmask. */ int -do_umount (const char *pathordevice) +do_umount (const char *pathordevice, + int force, int lazyunmount) { int r; char *err; char *buf; int is_dev; + const char *argv[MAX_ARGS]; + size_t i = 0; is_dev = STREQLEN (pathordevice, "/dev/", 5); buf = is_dev ? strdup (pathordevice) @@ -205,7 +208,25 @@ do_umount (const char *pathordevice) if (is_dev) RESOLVE_DEVICE (buf, , { free (buf); return -1; }); - r = command (NULL, &err, "umount", buf, NULL); + if (!(optargs_bitmask & GUESTFS_UMOUNT_FORCE_BITMASK)) + force = 0; + if (!(optargs_bitmask & GUESTFS_UMOUNT_LAZYUNMOUNT_BITMASK)) + lazyunmount = 0; + + /* Use the external /bin/umount program, so that /etc/mtab is kept + * updated. + */ + ADD_ARG (argv, i, "umount"); + + if (force) + ADD_ARG (argv, i, "-f"); + if (lazyunmount) + ADD_ARG (argv, i, "-l"); + + ADD_ARG (argv, i, buf); + ADD_ARG (argv, i, NULL); + + r = commandv (NULL, &err, argv); free (buf); if (r == -1) { diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml index 70fd6e3c..d512d7ce 100644 --- a/generator/generator_actions.ml +++ b/generator/generator_actions.ml @@ -2772,9 +2772,10 @@ characters does I<not> work, even if the length is specified." }; { defaults with name = "umount"; - style = RErr, [String "pathordevice"], []; + style = RErr, [String "pathordevice"], [OBool "force"; OBool "lazyunmount"]; proc_nr = Some 45; fish_alias = ["unmount"]; + once_had_no_optargs = true; tests = [ InitEmpty, Always, TestOutputListOfDevices ( [["part_disk"; "/dev/sda"; "mbr"]; @@ -2785,7 +2786,7 @@ characters does I<not> work, even if the length is specified." }; [["part_disk"; "/dev/sda"; "mbr"]; ["mkfs"; "ext2"; "/dev/sda1"; ""; "NOARG"; ""; ""]; ["mount_options"; ""; "/dev/sda1"; "/"]; - ["umount"; "/"]; + ["umount"; "/"; "false"; "false"]; ["mounts"]], []) ]; shortdesc = "unmount a filesystem"; @@ -3467,12 +3468,12 @@ To download an uncompressed tarball, use C<guestfs_tar_out>." }; proc_nr = Some 73; tests = [ InitBasicFS, Always, TestLastFail ( - [["umount"; "/"]; + [["umount"; "/"; "false"; "false"]; ["mount_ro"; "/dev/sda1"; "/"]; ["touch"; "/new"]]); InitBasicFS, Always, TestOutput ( [["write"; "/new"; "data"]; - ["umount"; "/"]; + ["umount"; "/"; "false"; "false"]; ["mount_ro"; "/dev/sda1"; "/"]; ["cat"; "/new"]], "data") ]; @@ -3715,10 +3716,10 @@ C<device>." }; fish_output = Some FishOutputHexadecimal; tests = [ InitBasicFS, Always, TestOutputInt ( - [["umount"; "/dev/sda1"]; + [["umount"; "/dev/sda1"; "false"; "false"]; ["fsck"; "ext2"; "/dev/sda1"]], 0); InitBasicFS, Always, TestOutputInt ( - [["umount"; "/dev/sda1"]; + [["umount"; "/dev/sda1"; "false"; "false"]; ["zero"; "/dev/sda1"]; ["fsck"; "ext2"; "/dev/sda1"]], 8) ]; @@ -3759,7 +3760,7 @@ This command is entirely equivalent to running C<fsck -a -t fstype device>." }; progress = true; tests = [ InitBasicFS, Always, TestRun ( - [["umount"; "/dev/sda1"]; + [["umount"; "/dev/sda1"; "false"; "false"]; ["zero"; "/dev/sda1"]]) ]; shortdesc = "write zeroes to the device"; @@ -4081,7 +4082,7 @@ the human-readable, canonical hex dump of the file." }; ["mkfs"; "ext3"; "/dev/sda1"; ""; "NOARG"; ""; ""]; ["mount_options"; ""; "/dev/sda1"; "/"]; ["write"; "/new"; "test file"]; - ["umount"; "/dev/sda1"]; + ["umount"; "/dev/sda1"; "false"; "false"]; ["zerofree"; "/dev/sda1"]; ["mount_options"; ""; "/dev/sda1"; "/"]; ["cat"; "/new"]], "test file") @@ -4205,7 +4206,7 @@ are activated or deactivated." }; ["mkfs"; "ext2"; "/dev/VG/LV"; ""; "NOARG"; ""; ""]; ["mount_options"; ""; "/dev/VG/LV"; "/"]; ["write"; "/new"; "test content"]; - ["umount"; "/"]; + ["umount"; "/"; "false"; "false"]; ["lvresize"; "/dev/VG/LV"; "20"]; ["e2fsck_f"; "/dev/VG/LV"]; ["e2fsck"; "/dev/VG/LV"; "true"; "false"]; @@ -6564,7 +6565,7 @@ Rename a logical volume C<logvol> with the new name C<newlogvol>." }; proc_nr = Some 220; tests = [ InitBasicFSonLVM, Always, TestOutputList ( - [["umount"; "/"]; + [["umount"; "/"; "false"; "false"]; ["vg_activate"; "false"; "VG"]; ["vgrename"; "VG"; "VG2"]; ["vg_activate"; "true"; "VG2"]; @@ -7685,7 +7686,7 @@ it contains all zero bytes." }; proc_nr = Some 284; tests = [ InitBasicFS, Always, TestOutputTrue ( - [["umount"; "/dev/sda1"]; + [["umount"; "/dev/sda1"; "false"; "false"]; ["zero_device"; "/dev/sda1"]; ["is_zero_device"; "/dev/sda1"]]); InitBasicFS, Always, TestOutputFalse ( diff --git a/gobject/Makefile.inc b/gobject/Makefile.inc index c73e5df0..230d1140 100644 --- a/gobject/Makefile.inc +++ b/gobject/Makefile.inc @@ -45,6 +45,7 @@ guestfs_gobject_headers= \ include/guestfs-gobject/optargs-inspect_get_icon.h \ include/guestfs-gobject/optargs-mount_local.h \ include/guestfs-gobject/optargs-umount_local.h \ + include/guestfs-gobject/optargs-umount.h \ include/guestfs-gobject/optargs-mkfs.h \ include/guestfs-gobject/optargs-mount_9p.h \ include/guestfs-gobject/optargs-ntfsresize.h \ @@ -90,6 +91,7 @@ guestfs_gobject_sources= \ src/optargs-inspect_get_icon.c \ src/optargs-mount_local.c \ src/optargs-umount_local.c \ + src/optargs-umount.c \ src/optargs-mkfs.c \ src/optargs-mount_9p.c \ src/optargs-ntfsresize.c \ diff --git a/po/POTFILES b/po/POTFILES index ad00cd4c..228aa39d 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -157,6 +157,7 @@ gobject/src/optargs-ntfsfix.c gobject/src/optargs-ntfsresize.c gobject/src/optargs-set_e2attrs.c gobject/src/optargs-tune2fs.c +gobject/src/optargs-umount.c gobject/src/optargs-umount_local.c gobject/src/session.c gobject/src/struct-application.c |