]> git.decadent.org.uk Git - nfs-utils.git/commitdiff
mount.nfs: Add the mount option "nosharecache"
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 10 Jul 2007 00:03:22 +0000 (10:03 +1000)
committerNeil Brown <neilb@suse.de>
Tue, 10 Jul 2007 00:03:22 +0000 (10:03 +1000)
Prior to David Howell's mount changes in 2.6.18, users who mounted
different directories which happened to be from the same filesystem on the
server would get different super blocks, and hence could choose different
mount options. As long as there were no hard linked files that crossed from
one subtree to another, this was quite safe.
Post the changes, if the two directories are on the same filesystem (have
the same 'fsid'), they will share the same super block, and hence the same
mount options.

Add a flag to allow users to elect not to share the NFS super block with
another mount point, even if the fsids are the same. This will allow
users to set different mount options for the two different super blocks, as
was previously possible. It is still up to the user to ensure that there
are no cache coherency issues when doing this, however the default
behaviour will be to share super blocks whenever two paths result in
the same fsid.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: Neil Brown <neilb@suse.de>
utils/mount/nfs.man
utils/mount/nfs4_mount.h
utils/mount/nfs4mount.c
utils/mount/nfs_mount.h
utils/mount/nfsmount.c

index 673556ca6c37a6b6baf33b1200645a08c1240ada..e66daba57886bd7ff31a9abe3ee7aa57f0cd8d77 100644 (file)
@@ -288,6 +288,23 @@ Mount the NFS filesystem using the UDP protocol.
 Disables NFSv3 READDIRPLUS RPCs. Use this option when
 mounting servers that don't support or have broken
 READDIRPLUS implementations.
+.TP 1.5i
+.I nosharecache
+As of kernel 2.6.18, it is no longer possible to mount the same
+same filesystem with different mount options to a new mountpoint.
+It was deemed unsafe to do so, since cached data cannot be shared
+between the two mountpoints. In consequence, files or directories
+that were common to both mountpoint subtrees could often be seen to
+be out of sync following an update.
+.br
+This option allows administrators to select the pre-2.6.18 behaviour,
+permitting the same filesystem to be mounted with different mount
+options.
+.br
+.B Beware:
+Use of this option is not recommended unless you are certain that there
+are no hard links or subtrees of this mountpoint that are mounted
+elsewhere.
 .P
 All of the non-value options have corresponding nooption forms.
 For example, nointr means don't allow file operations to be
@@ -444,6 +461,23 @@ This extracts a
 server performance penalty but it allows two different NFS clients
 to get reasonable good results when both clients are actively
 writing to common filesystem on the server.
+.TP 1.5i
+.I nosharecache
+As of kernel 2.6.18, it is no longer possible to mount the same
+same filesystem with different mount options to a new mountpoint.
+It was deemed unsafe to do so, since cached data cannot be shared
+between the two mountpoints. In consequence, files or directories
+that were common to both mountpoint subtrees could often be seen to
+be out of sync following an update.
+.br
+This option allows administrators to select the pre-2.6.18 behaviour,
+permitting the same filesystem to be mounted with different mount
+options.
+.br
+.B Beware:
+Use of this option is not recommended unless you are certain that there
+are no hard links or subtrees of this mountpoint that are mounted
+elsewhere.
 .P
 All of the non-value options have corresponding nooption forms.
 For example, nointr means don't allow file operations to be
index 74c9b950d6f86b1570d876a359c48e705e4d206f..2fcca6def13a9a22d0a26b412c3ce0f9312b935f 100644 (file)
@@ -65,6 +65,7 @@ struct nfs4_mount_data {
 #define NFS4_MOUNT_NOCTO       0x0010  /* 1 */
 #define NFS4_MOUNT_NOAC                0x0020  /* 1 */
 #define NFS4_MOUNT_STRICTLOCK  0x1000  /* 1 */
+#define NFS4_MOUNT_UNSHARED    0x8000  /* 5 */
 #define NFS4_MOUNT_FLAGMASK    0xFFFF
 
 /* pseudoflavors: */
index 2a58d0ae08e1208479d85f0c72987022f01bd97c..0376f32da6df684a1a3ef64fb8fa26dcbcba4f44 100644 (file)
@@ -201,7 +201,7 @@ int nfs4mount(const char *spec, const char *node, int *flags,
        char *s;
        int val;
        int bg, soft, intr;
-       int nocto, noac;
+       int nocto, noac, unshared;
        int retry;
        int retval;
        time_t timeout, t;
@@ -252,6 +252,7 @@ int nfs4mount(const char *spec, const char *node, int *flags,
        intr = NFS4_MOUNT_INTR;
        nocto = 0;
        noac = 0;
+       unshared = 0;
        retry = 10000;          /* 10000 minutes ~ 1 week */
 
        /*
@@ -336,6 +337,8 @@ int nfs4mount(const char *spec, const char *node, int *flags,
                                nocto = !val;
                        else if (!strcmp(opt, "ac"))
                                noac = !val;
+                       else if (!strcmp(opt, "sharecache"))
+                               unshared = !val;
                        else if (!sloppy) {
                                printf(_("unknown nfs mount option: "
                                         "%s%s\n"), val ? "" : "no", opt);
@@ -347,7 +350,8 @@ int nfs4mount(const char *spec, const char *node, int *flags,
        data.flags = (soft ? NFS4_MOUNT_SOFT : 0)
                | (intr ? NFS4_MOUNT_INTR : 0)
                | (nocto ? NFS4_MOUNT_NOCTO : 0)
-               | (noac ? NFS4_MOUNT_NOAC : 0);
+               | (noac ? NFS4_MOUNT_NOAC : 0)
+               | (unshared ? NFS4_MOUNT_UNSHARED : 0);
 
        /*
         * Give a warning if the rpc.idmapd daemon is not running
@@ -388,11 +392,13 @@ int nfs4mount(const char *spec, const char *node, int *flags,
               data.acregmin, data.acregmax, data.acdirmin, data.acdirmax);
        printf("port = %d, bg = %d, retry = %d, flags = %.8x\n",
               ntohs(server_addr.sin_port), bg, retry, data.flags);
-       printf("soft = %d, intr = %d, nocto = %d, noac = %d\n",
+       printf("soft = %d, intr = %d, nocto = %d, noac = %d, "
+              "nosharecache = %d\n",
               (data.flags & NFS4_MOUNT_SOFT) != 0,
               (data.flags & NFS4_MOUNT_INTR) != 0,
               (data.flags & NFS4_MOUNT_NOCTO) != 0,
-              (data.flags & NFS4_MOUNT_NOAC) != 0);
+              (data.flags & NFS4_MOUNT_NOAC) != 0,
+              (data.flags & NFS4_MOUNT_UNSHARED) != 0);
 
        if (num_flavour > 0) {
                int pf_cnt, i;
index 4a061d834f4f20081bd7447d0948e22bcfcbe440..50ce2a8300f9d5085130e0b41dc64f1ce7f43ef5 100644 (file)
@@ -64,6 +64,7 @@ struct nfs_mount_data {
 #define NFS_MOUNT_NOACL     0x0800  /* 4 */
 #define NFS_MOUNT_SECFLAVOUR   0x2000  /* 5 */
 #define NFS_MOUNT_NORDIRPLUS   0x4000  /* 5 */
+#define NFS_MOUNT_UNSHARED     0x8000  /* 5 */
 
 /* security pseudoflavors */
 
index 815064a593e4ad917fe18a09124e6d0ee7e53c62..f21aaff410133ef0262f78432d1f21c97a38a937 100644 (file)
@@ -804,6 +804,10 @@ parse_options(char *old_opts, struct nfs_mount_data *data,
                                data->flags &= ~NFS_MOUNT_NORDIRPLUS;
                                if (!val)
                                        data->flags |= NFS_MOUNT_NORDIRPLUS;
+                       } else if (!strcmp(opt, "sharecache")) {
+                               data->flags &= ~NFS_MOUNT_UNSHARED;
+                               if (!val)
+                                       data->flags |= NFS_MOUNT_UNSHARED;
 #endif
                        } else {
                        bad_option: