diff options
Diffstat (limited to 'fs/cifs/inode.c')
-rw-r--r-- | fs/cifs/inode.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index d34325c887c4..053c1cadf703 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -710,7 +710,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) | |||
710 | char *full_path = NULL; | 710 | char *full_path = NULL; |
711 | struct inode *newinode = NULL; | 711 | struct inode *newinode = NULL; |
712 | 712 | ||
713 | cFYI(1, ("In cifs_mkdir, mode = 0x%x inode = 0x%p ", mode, inode)); | 713 | cFYI(1, ("In cifs_mkdir, mode = 0x%x inode = 0x%p", mode, inode)); |
714 | 714 | ||
715 | xid = GetXid(); | 715 | xid = GetXid(); |
716 | 716 | ||
@@ -768,7 +768,16 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) | |||
768 | /* BB to be implemented via Windows secrty descriptors | 768 | /* BB to be implemented via Windows secrty descriptors |
769 | eg CIFSSMBWinSetPerms(xid, pTcon, full_path, mode, | 769 | eg CIFSSMBWinSetPerms(xid, pTcon, full_path, mode, |
770 | -1, -1, local_nls); */ | 770 | -1, -1, local_nls); */ |
771 | } | 771 | if(direntry->d_inode) { |
772 | direntry->d_inode->i_mode = mode; | ||
773 | if(cifs_sb->mnt_cifs_flags & | ||
774 | CIFS_MOUNT_SET_UID) { | ||
775 | direntry->d_inode->i_uid = | ||
776 | current->fsuid; | ||
777 | direntry->d_inode->i_gid = | ||
778 | current->fsgid; | ||
779 | } | ||
780 | } | ||
772 | } | 781 | } |
773 | kfree(full_path); | 782 | kfree(full_path); |
774 | FreeXid(xid); | 783 | FreeXid(xid); |
@@ -1111,9 +1120,20 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
1111 | 1120 | ||
1112 | cFYI(1, ("In cifs_setattr, name = %s attrs->iavalid 0x%x ", | 1121 | cFYI(1, ("In cifs_setattr, name = %s attrs->iavalid 0x%x ", |
1113 | direntry->d_name.name, attrs->ia_valid)); | 1122 | direntry->d_name.name, attrs->ia_valid)); |
1123 | |||
1114 | cifs_sb = CIFS_SB(direntry->d_inode->i_sb); | 1124 | cifs_sb = CIFS_SB(direntry->d_inode->i_sb); |
1115 | pTcon = cifs_sb->tcon; | 1125 | pTcon = cifs_sb->tcon; |
1116 | 1126 | ||
1127 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM == 0) { | ||
1128 | /* check if we have permission to change attrs */ | ||
1129 | rc = inode_change_ok(direntry->d_inode, attrs); | ||
1130 | if(rc < 0) { | ||
1131 | FreeXid(xid); | ||
1132 | return rc; | ||
1133 | } else | ||
1134 | rc = 0; | ||
1135 | } | ||
1136 | |||
1117 | down(&direntry->d_sb->s_vfs_rename_sem); | 1137 | down(&direntry->d_sb->s_vfs_rename_sem); |
1118 | full_path = build_path_from_dentry(direntry); | 1138 | full_path = build_path_from_dentry(direntry); |
1119 | up(&direntry->d_sb->s_vfs_rename_sem); | 1139 | up(&direntry->d_sb->s_vfs_rename_sem); |
@@ -1153,7 +1173,9 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
1153 | 1 /* 45 seconds */); | 1173 | 1 /* 45 seconds */); |
1154 | cFYI(1,("Wrt seteof rc %d", rc)); | 1174 | cFYI(1,("Wrt seteof rc %d", rc)); |
1155 | } | 1175 | } |
1156 | } | 1176 | } else |
1177 | rc = -EINVAL; | ||
1178 | |||
1157 | if (rc != 0) { | 1179 | if (rc != 0) { |
1158 | /* Set file size by pathname rather than by handle | 1180 | /* Set file size by pathname rather than by handle |
1159 | either because no valid, writeable file handle for | 1181 | either because no valid, writeable file handle for |