]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
cifs: add "multiuser" mount option
authorJeff Layton <jlayton@redhat.com>
Wed, 6 Oct 2010 23:51:12 +0000 (19:51 -0400)
committerSteve French <sfrench@us.ibm.com>
Thu, 7 Oct 2010 18:30:45 +0000 (18:30 +0000)
This allows someone to declare a mount as a multiuser mount.

Multiuser mounts also imply "noperm" since we want to allow the server
to handle permission checking. It also (for now) requires Kerberos
authentication. Eventually, we could expand this to other authtypes, but
that requires a scheme to allow per-user credential stashing in some
form.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/connect.c

index 3156a9de947da36f2a5a417123880d5b02dce043..e65f72d1f23bc4532f387762388cacd254e999b9 100644 (file)
@@ -100,6 +100,7 @@ struct smb_vol {
        bool nostrictsync:1; /* do not force expensive SMBflush on every sync */
        bool fsc:1;     /* enable fscache */
        bool mfsymlinks:1; /* use Minshall+French Symlinks */
+       bool multiuser:1;
        unsigned int rsize;
        unsigned int wsize;
        bool sockopt_tcp_nodelay:1;
@@ -1347,6 +1348,8 @@ cifs_parse_mount_options(char *options, const char *devname,
                        vol->fsc = true;
                } else if (strnicmp(data, "mfsymlinks", 10) == 0) {
                        vol->mfsymlinks = true;
+               } else if (strnicmp(data, "multiuser", 8) == 0) {
+                       vol->multiuser = true;
                } else
                        printk(KERN_WARNING "CIFS: Unknown mount option %s\n",
                                                data);
@@ -1378,6 +1381,13 @@ cifs_parse_mount_options(char *options, const char *devname,
                        return 1;
                }
        }
+
+       if (vol->multiuser && !(vol->secFlg & CIFSSEC_MAY_KRB5)) {
+               cERROR(1, "Multiuser mounts currently require krb5 "
+                         "authentication!");
+               return 1;
+       }
+
        if (vol->UNCip == NULL)
                vol->UNCip = &vol->UNC[2];
 
@@ -2563,6 +2573,9 @@ static void setup_cifs_sb(struct smb_vol *pvolume_info,
                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
        if (pvolume_info->fsc)
                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
+       if (pvolume_info->multiuser)
+               cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
+                                           CIFS_MOUNT_NO_PERM);
        if (pvolume_info->direct_io) {
                cFYI(1, "mounting share using direct i/o");
                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;