]> err.no Git - util-linux/commitdiff
mount: add --no-canonicalize option
authorKarel Zak <kzak@redhat.com>
Thu, 3 Dec 2009 14:30:53 +0000 (15:30 +0100)
committerKarel Zak <kzak@redhat.com>
Thu, 3 Dec 2009 14:30:53 +0000 (15:30 +0100)
For example the /sbin/mount.fuse command calls

mount -i -f /dev/foo /absolut/path

and it does not make sense to canonicalize already absolute paths. The
new --no-canonicalize option allows to avoid unwanted readlink()
calls.

Signed-off-by: Karel Zak <kzak@redhat.com>
mount/mount.8
mount/mount.c
mount/sundries.c
mount/sundries.h

index 57b3571ce106036c51ce2a6d1f5f2c0a1c7f0adb..66f9256347d50da4e470a0a41dd5541508bd7c1f 100644 (file)
@@ -449,6 +449,13 @@ Mount without writing in
 This is necessary for example when
 .I /etc
 is on a read-only filesystem.
+.IP "\fB\-\-no\-canonicalize\fP"
+Don't canonicalize paths. The mount command canonicalizes all paths 
+(from command line or fstab) and stores canonicalized paths to the 
+.IR /etc/mtab
+file. This option can be used together with the
+.B \-f
+flag for already canonicalized absolut paths.
 .IP "\fB\-p, \-\-pass\-fd \fInum\fP"
 In case of a loop mount with encryption, read the passphrase from
 file descriptor
index 3eafa92ac64244fe2d3822225ce034a2ffd9264d..f3f8910ed65418795965d20e566c27f02ac2088a 100644 (file)
@@ -1924,6 +1924,7 @@ static struct option longopts[] = {
        { "make-rslave", 0, 0, 141 },
        { "make-rprivate", 0, 0, 142 },
        { "make-runbindable", 0, 0, 143 },
+       { "no-canonicalize", 0, 0, 144 },
        { "internal-only", 0, 0, 'i' },
        { NULL, 0, 0, 0 }
 };
@@ -2216,7 +2217,9 @@ main(int argc, char *argv[]) {
                case 143:
                        mounttype = (MS_UNBINDABLE | MS_REC);
                        break;
-
+               case 144:
+                       nocanonicalize = 1;
+                       break;
                case '?':
                default:
                        usage (stderr, EX_USAGE);
index 5c33b113e8900aae27d8075668b16c85fbf07d24..1d9eb88ef7b3d64a8c8f47bd06f4b40c54db88a4 100644 (file)
@@ -21,6 +21,7 @@
 
 int mount_quiet;
 int verbose;
+int nocanonicalize;
 char *progname;
 
 char *
@@ -270,9 +271,9 @@ canonicalize_spec (const char *path)
 {
        char *res;
 
-       if (path == NULL)
+       if (!path)
                return NULL;
-       if (is_pseudo_fs(path))
+       if (nocanonicalize || is_pseudo_fs(path))
                return xstrdup(path);
 
        res = canonicalize_path(path);
@@ -283,8 +284,14 @@ canonicalize_spec (const char *path)
 
 char *canonicalize (const char *path)
 {
-       char *res = canonicalize_path(path);
+       char *res;
 
+       if (!path)
+               return NULL;
+       else if (nocanonicalize)
+               return xstrdup(path);
+
+       res = canonicalize_path(path);
        if (!res)
                die(EX_SYSERR, _("not enough memory"));
        return res;
index 6d576e9d020c047b7bb2925c5297d154ec90a7e5..3b6a4644dba31354376a0bb2fae23b5ae226376e 100644 (file)
@@ -16,6 +16,7 @@
 /* global mount, umount, and losetup variables */
 extern int mount_quiet;
 extern int verbose;
+extern int nocanonicalize;
 extern char *progname;
 
 #define streq(s, t)    (strcmp ((s), (t)) == 0)