]> err.no Git - util-linux/commitdiff
umount: add --fake option to umount(8)
authorMiklos Szeredi <miklos@szeredi.hu>
Mon, 8 Mar 2010 18:01:13 +0000 (19:01 +0100)
committerKarel Zak <kzak@redhat.com>
Thu, 11 Mar 2010 13:32:36 +0000 (14:32 +0100)
Add --fake option to umount(8), which omits calling the actual umount
syscall (and the loop device deletion) but modifies /etc/mtab.  This
is similar to the -f or --fake option to mount(8).

This would allow some simplifications in fuse by allowing it to call
the umount syscall and letting umount(8) just update mtab.

[kzak@redhat.com: - initialize 'res' variable in umount_one() ]

Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Signed-off-by: Karel Zak <kzak@redhat.com>
mount/umount.8
mount/umount.c

index aa9041128e290142668aa102585993231ae413e8..5ef861aaaeb5f2fbad3bc644d122c7a618edddab 100644 (file)
@@ -123,6 +123,12 @@ anymore.
 Don't canonicalize paths. For more details about this option see the
 .B mount(8)
 man page.
+.IP "\fB\-\-fake\fP"
+Causes everything to be done except for the actual system call; this
+``fakes'' unmounting the filesystem.  It can  be used to remove
+entries from
+.I /etc/mtab
+that were unmounted earlier with the -n option.
 
 .SH "THE LOOP DEVICE"
 The
index 7f146558731165663f5f3d533d31146bda69e616..6786ac57ccd6191bf46023687a8dc7acaa2b74eb 100644 (file)
@@ -81,6 +81,9 @@ int restricted = 1;
 int complained_err = 0;
 char *complained_dev = NULL;
 
+/* True for fake umount (--fake).  */
+static int fake = 0;
+
 /*
  * check_special_umountprog()
  *     If there is a special umount program for this type, exec it.
@@ -187,7 +190,7 @@ umount_one (const char *spec, const char *node, const char *type,
            const char *opts, struct mntentchn *mc) {
        int umnt_err = 0;
        int isroot;
-       int res;
+       int res = 0;
        int status;
        const char *loopdev;
        int myloop = 0;
@@ -210,6 +213,9 @@ umount_one (const char *spec, const char *node, const char *type,
        if (check_special_umountprog(spec, node, type, &status))
                return status;
 
+       /* Skip the actual umounting for --fake */
+       if (fake)
+               goto writemtab;
        /*
         * Ignore the option "-d" for non-loop devices and loop devices with
         * LO_FLAGS_AUTOCLEAR flag.
@@ -390,6 +396,7 @@ static struct option longopts[] =
   { "types", 1, 0, 't' },
 
   { "no-canonicalize", 0, 0, 144 },
+  { "fake", 0, 0, 145 },
   { NULL, 0, 0, 0 }
 };
 
@@ -679,6 +686,9 @@ main (int argc, char *argv[]) {
                case 144:
                        nocanonicalize = 1;
                        break;
+               case 145:
+                       fake = 1;
+                       break;
                case 0:
                        break;
                case '?':
@@ -697,7 +707,8 @@ main (int argc, char *argv[]) {
        }
 
        if (restricted &&
-           (all || types || nomtab || force || remount || nocanonicalize)) {
+           (all || types || nomtab || force || remount || nocanonicalize ||
+            fake)) {
                die (2, _("umount: only root can do that"));
        }