aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve French <smfrench@gmail.com>2016-09-23 02:36:34 -0400
committerSteve French <smfrench@gmail.com>2016-10-14 15:22:01 -0400
commit9593265531fa66177a0547e63abd99907ec0a687 (patch)
tree81350498ef2188029c0555163b60899ee029e372
parentde74025052ef63852d80a444ea19f2bdd7bec63f (diff)
CIFS: Add new mount option to set owner uid and gid from special sids in acl
Add "idsfromsid" mount option to indicate to cifs.ko that it should try to retrieve the uid and gid owner fields from special sids in the ACL if present. This first patch just adds the parsing for the mount option. Signed-off-by: Steve French <steve.french@primarydata.com> Reviewed-by: Shirish Pargaonkar <shirishpargaonkar@gmail.com> Reviewed-by: Pavel Shilovsky <pshilov@microsoft.com>
-rw-r--r--fs/cifs/cifs_fs_sb.h1
-rw-r--r--fs/cifs/cifsfs.c2
-rw-r--r--fs/cifs/cifsglob.h1
-rw-r--r--fs/cifs/connect.c8
4 files changed, 11 insertions, 1 deletions
diff --git a/fs/cifs/cifs_fs_sb.h b/fs/cifs/cifs_fs_sb.h
index 1418daa03d95..07ed81cf1552 100644
--- a/fs/cifs/cifs_fs_sb.h
+++ b/fs/cifs/cifs_fs_sb.h
@@ -49,6 +49,7 @@
49#define CIFS_MOUNT_USE_PREFIX_PATH 0x1000000 /* make subpath with unaccessible 49#define CIFS_MOUNT_USE_PREFIX_PATH 0x1000000 /* make subpath with unaccessible
50 * root mountable 50 * root mountable
51 */ 51 */
52#define CIFS_MOUNT_UID_FROM_ACL 0x2000000 /* try to get UID via special SID */
52 53
53struct cifs_sb_info { 54struct cifs_sb_info {
54 struct rb_root tlink_tree; 55 struct rb_root tlink_tree;
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
index f963c880c72d..15261ba464c5 100644
--- a/fs/cifs/cifsfs.c
+++ b/fs/cifs/cifsfs.c
@@ -469,6 +469,8 @@ cifs_show_options(struct seq_file *s, struct dentry *root)
469 seq_puts(s, ",posixpaths"); 469 seq_puts(s, ",posixpaths");
470 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) 470 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID)
471 seq_puts(s, ",setuids"); 471 seq_puts(s, ",setuids");
472 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UID_FROM_ACL)
473 seq_puts(s, ",idsfromsid");
472 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) 474 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
473 seq_puts(s, ",serverino"); 475 seq_puts(s, ",serverino");
474 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD) 476 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index 0c828d3c48c3..1f17f6bd7a60 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -478,6 +478,7 @@ struct smb_vol {
478 bool retry:1; 478 bool retry:1;
479 bool intr:1; 479 bool intr:1;
480 bool setuids:1; 480 bool setuids:1;
481 bool setuidfromacl:1;
481 bool override_uid:1; 482 bool override_uid:1;
482 bool override_gid:1; 483 bool override_gid:1;
483 bool dynperm:1; 484 bool dynperm:1;
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 657369db76df..aab5227979e2 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -75,7 +75,7 @@ enum {
75 Opt_noposixpaths, Opt_nounix, 75 Opt_noposixpaths, Opt_nounix,
76 Opt_nocase, 76 Opt_nocase,
77 Opt_brl, Opt_nobrl, 77 Opt_brl, Opt_nobrl,
78 Opt_forcemandatorylock, Opt_setuids, 78 Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids,
79 Opt_nosetuids, Opt_dynperm, Opt_nodynperm, 79 Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
80 Opt_nohard, Opt_nosoft, 80 Opt_nohard, Opt_nosoft,
81 Opt_nointr, Opt_intr, 81 Opt_nointr, Opt_intr,
@@ -147,6 +147,7 @@ static const match_table_t cifs_mount_option_tokens = {
147 { Opt_forcemandatorylock, "forcemand" }, 147 { Opt_forcemandatorylock, "forcemand" },
148 { Opt_setuids, "setuids" }, 148 { Opt_setuids, "setuids" },
149 { Opt_nosetuids, "nosetuids" }, 149 { Opt_nosetuids, "nosetuids" },
150 { Opt_setuidfromacl, "idsfromsid" },
150 { Opt_dynperm, "dynperm" }, 151 { Opt_dynperm, "dynperm" },
151 { Opt_nodynperm, "nodynperm" }, 152 { Opt_nodynperm, "nodynperm" },
152 { Opt_nohard, "nohard" }, 153 { Opt_nohard, "nohard" },
@@ -1376,6 +1377,9 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
1376 case Opt_nosetuids: 1377 case Opt_nosetuids:
1377 vol->setuids = 0; 1378 vol->setuids = 0;
1378 break; 1379 break;
1380 case Opt_setuidfromacl:
1381 vol->setuidfromacl = 1;
1382 break;
1379 case Opt_dynperm: 1383 case Opt_dynperm:
1380 vol->dynperm = true; 1384 vol->dynperm = true;
1381 break; 1385 break;
@@ -3279,6 +3283,8 @@ int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3279 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM; 3283 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3280 if (pvolume_info->setuids) 3284 if (pvolume_info->setuids)
3281 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID; 3285 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3286 if (pvolume_info->setuidfromacl)
3287 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
3282 if (pvolume_info->server_ino) 3288 if (pvolume_info->server_ino)
3283 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM; 3289 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3284 if (pvolume_info->remap) 3290 if (pvolume_info->remap)