Opt_udp, Opt_tcp,
        Opt_acl, Opt_noacl,
        Opt_rdirplus, Opt_nordirplus,
+       Opt_sharecache, Opt_nosharecache,
 
        /* Mount options that take integer arguments */
        Opt_port,
        { Opt_noacl, "noacl" },
        { Opt_rdirplus, "rdirplus" },
        { Opt_nordirplus, "nordirplus" },
+       { Opt_sharecache, "sharecache" },
+       { Opt_nosharecache, "nosharecache" },
 
        { Opt_port, "port=%u" },
        { Opt_rsize, "rsize=%u" },
                { NFS_MOUNT_NONLM, ",nolock", "" },
                { NFS_MOUNT_NOACL, ",noacl", "" },
                { NFS_MOUNT_NORDIRPLUS, ",nordirplus", "" },
+               { NFS_MOUNT_UNSHARED, ",nosharecache", ""},
                { 0, NULL, NULL }
        };
        const struct proc_nfs_info *nfs_infop;
                case Opt_nordirplus:
                        mnt->flags |= NFS_MOUNT_NORDIRPLUS;
                        break;
+               case Opt_sharecache:
+                       mnt->flags &= ~NFS_MOUNT_UNSHARED;
+                       break;
+               case Opt_nosharecache:
+                       mnt->flags |= NFS_MOUNT_UNSHARED;
+                       break;
 
                case Opt_port:
                        if (match_int(args, &option))
 
        if (old->nfs_client != server->nfs_client)
                return 0;
+       /* Note: NFS_MOUNT_UNSHARED == NFS4_MOUNT_UNSHARED */
+       if (old->flags & NFS_MOUNT_UNSHARED)
+               return 0;
        if (memcmp(&old->fsid, &server->fsid, sizeof(old->fsid)) != 0)
                return 0;
        return 1;
        struct nfs_fh mntfh;
        struct nfs_mount_data *data = raw_data;
        struct dentry *mntroot;
+       int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
        int error;
 
        /* Validate the mount data */
                goto out;
        }
 
+       if (server->flags & NFS_MOUNT_UNSHARED)
+               compare_super = NULL;
+
        /* Get a superblock - note that we may end up sharing one that already exists */
-       s = sget(fs_type, nfs_compare_super, nfs_set_super, server);
+       s = sget(fs_type, compare_super, nfs_set_super, server);
        if (IS_ERR(s)) {
                error = PTR_ERR(s);
                goto out_err_nosb;
        struct super_block *s;
        struct nfs_server *server;
        struct dentry *mntroot;
+       int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
        int error;
 
        dprintk("--> nfs_xdev_get_sb()\n");
                goto out_err_noserver;
        }
 
+       if (server->flags & NFS_MOUNT_UNSHARED)
+               compare_super = NULL;
+
        /* Get a superblock - note that we may end up sharing one that already exists */
-       s = sget(&nfs_fs_type, nfs_compare_super, nfs_set_super, server);
+       s = sget(&nfs_fs_type, compare_super, nfs_set_super, server);
        if (IS_ERR(s)) {
                error = PTR_ERR(s);
                goto out_err_nosb;
        struct nfs_fh mntfh;
        struct dentry *mntroot;
        char *mntpath = NULL, *hostname = NULL, *ip_addr = NULL;
+       int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
        int error;
 
        /* Validate the mount data */
                goto out;
        }
 
+       if (server->flags & NFS4_MOUNT_UNSHARED)
+               compare_super = NULL;
+
        /* Get a superblock - note that we may end up sharing one that already exists */
-       s = sget(fs_type, nfs_compare_super, nfs_set_super, server);
+       s = sget(fs_type, compare_super, nfs_set_super, server);
        if (IS_ERR(s)) {
                error = PTR_ERR(s);
                goto out_free;
        struct super_block *s;
        struct nfs_server *server;
        struct dentry *mntroot;
+       int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
        int error;
 
        dprintk("--> nfs4_xdev_get_sb()\n");
                goto out_err_noserver;
        }
 
+       if (server->flags & NFS4_MOUNT_UNSHARED)
+               compare_super = NULL;
+
        /* Get a superblock - note that we may end up sharing one that already exists */
-       s = sget(&nfs_fs_type, nfs_compare_super, nfs_set_super, server);
+       s = sget(&nfs_fs_type, compare_super, nfs_set_super, server);
        if (IS_ERR(s)) {
                error = PTR_ERR(s);
                goto out_err_nosb;
        struct nfs_server *server;
        struct dentry *mntroot;
        struct nfs_fh mntfh;
+       int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
        int error;
 
        dprintk("--> nfs4_referral_get_sb()\n");
                goto out_err_noserver;
        }
 
+       if (server->flags & NFS4_MOUNT_UNSHARED)
+               compare_super = NULL;
+
        /* Get a superblock - note that we may end up sharing one that already exists */
-       s = sget(&nfs_fs_type, nfs_compare_super, nfs_set_super, server);
+       s = sget(&nfs_fs_type, compare_super, nfs_set_super, server);
        if (IS_ERR(s)) {
                error = PTR_ERR(s);
                goto out_err_nosb;