aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/cifs/dir.c13
-rw-r--r--fs/cifs/inode.c18
2 files changed, 25 insertions, 6 deletions
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
index 634cf330fe04..e962e75e6f7b 100644
--- a/fs/cifs/dir.c
+++ b/fs/cifs/dir.c
@@ -236,12 +236,14 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
236 236
237 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) { 237 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
238 args.uid = (__u64) current->fsuid; 238 args.uid = (__u64) current->fsuid;
239 args.gid = (__u64) current->fsgid; 239 if (inode->i_mode & S_ISGID)
240 args.gid = (__u64) inode->i_gid;
241 else
242 args.gid = (__u64) current->fsgid;
240 } else { 243 } else {
241 args.uid = NO_CHANGE_64; 244 args.uid = NO_CHANGE_64;
242 args.gid = NO_CHANGE_64; 245 args.gid = NO_CHANGE_64;
243 } 246 }
244
245 CIFSSMBUnixSetInfo(xid, pTcon, full_path, &args, 247 CIFSSMBUnixSetInfo(xid, pTcon, full_path, &args,
246 cifs_sb->local_nls, 248 cifs_sb->local_nls,
247 cifs_sb->mnt_cifs_flags & 249 cifs_sb->mnt_cifs_flags &
@@ -270,7 +272,12 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
270 (cifs_sb->mnt_cifs_flags & 272 (cifs_sb->mnt_cifs_flags &
271 CIFS_MOUNT_SET_UID)) { 273 CIFS_MOUNT_SET_UID)) {
272 newinode->i_uid = current->fsuid; 274 newinode->i_uid = current->fsuid;
273 newinode->i_gid = current->fsgid; 275 if (inode->i_mode & S_ISGID)
276 newinode->i_gid =
277 inode->i_gid;
278 else
279 newinode->i_gid =
280 current->fsgid;
274 } 281 }
275 } 282 }
276 } 283 }
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index d952914dfc4c..6d911896d74c 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -985,7 +985,12 @@ mkdir_get_info:
985 * failed to get it from the server or was set bogus */ 985 * failed to get it from the server or was set bogus */
986 if ((direntry->d_inode) && (direntry->d_inode->i_nlink < 2)) 986 if ((direntry->d_inode) && (direntry->d_inode->i_nlink < 2))
987 direntry->d_inode->i_nlink = 2; 987 direntry->d_inode->i_nlink = 2;
988
988 mode &= ~current->fs->umask; 989 mode &= ~current->fs->umask;
990 /* must turn on setgid bit if parent dir has it */
991 if (inode->i_mode & S_ISGID)
992 mode |= S_ISGID;
993
989 if (pTcon->unix_ext) { 994 if (pTcon->unix_ext) {
990 struct cifs_unix_set_info_args args = { 995 struct cifs_unix_set_info_args args = {
991 .mode = mode, 996 .mode = mode,
@@ -996,7 +1001,10 @@ mkdir_get_info:
996 }; 1001 };
997 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) { 1002 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
998 args.uid = (__u64)current->fsuid; 1003 args.uid = (__u64)current->fsuid;
999 args.gid = (__u64)current->fsgid; 1004 if (inode->i_mode & S_ISGID)
1005 args.gid = (__u64)inode->i_gid;
1006 else
1007 args.gid = (__u64)current->fsgid;
1000 } else { 1008 } else {
1001 args.uid = NO_CHANGE_64; 1009 args.uid = NO_CHANGE_64;
1002 args.gid = NO_CHANGE_64; 1010 args.gid = NO_CHANGE_64;
@@ -1026,8 +1034,12 @@ mkdir_get_info:
1026 CIFS_MOUNT_SET_UID) { 1034 CIFS_MOUNT_SET_UID) {
1027 direntry->d_inode->i_uid = 1035 direntry->d_inode->i_uid =
1028 current->fsuid; 1036 current->fsuid;
1029 direntry->d_inode->i_gid = 1037 if (inode->i_mode & S_ISGID)
1030 current->fsgid; 1038 direntry->d_inode->i_gid =
1039 inode->i_gid;
1040 else
1041 direntry->d_inode->i_gid =
1042 current->fsgid;
1031 } 1043 }
1032 } 1044 }
1033 } 1045 }