aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/cifs/inode.c')
-rw-r--r--fs/cifs/inode.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index db091c516c2a..e387ed3f9446 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -729,7 +729,10 @@ cifs_set_file_info(struct inode *inode, struct iattr *attrs, int xid,
729 &info_buf, cifs_sb->local_nls, 729 &info_buf, cifs_sb->local_nls,
730 cifs_sb->mnt_cifs_flags & 730 cifs_sb->mnt_cifs_flags &
731 CIFS_MOUNT_MAP_SPECIAL_CHR); 731 CIFS_MOUNT_MAP_SPECIAL_CHR);
732 if (rc != -EOPNOTSUPP && rc != -EINVAL) 732 if (rc == 0) {
733 cifsInode->cifsAttrs = dosattr;
734 goto out;
735 } else if (rc != -EOPNOTSUPP && rc != -EINVAL)
733 goto out; 736 goto out;
734 } 737 }
735 738
@@ -805,6 +808,7 @@ cifs_rename_pending_delete(char *full_path, struct inode *inode, int xid)
805 kfree(info_buf); 808 kfree(info_buf);
806 if (rc != 0) 809 if (rc != 0)
807 goto out_close; 810 goto out_close;
811 cifsInode->cifsAttrs = dosattr;
808 812
809 /* silly-rename the file */ 813 /* silly-rename the file */
810 CIFSSMBRenameOpenFile(xid, tcon, netfid, NULL, cifs_sb->local_nls, 814 CIFSSMBRenameOpenFile(xid, tcon, netfid, NULL, cifs_sb->local_nls,
@@ -905,7 +909,6 @@ psx_del_no_retry:
905 if (rc == 0) 909 if (rc == 0)
906 drop_nlink(inode); 910 drop_nlink(inode);
907 } 911 }
908 cifsInode->cifsAttrs = dosattr;
909 } 912 }
910out_reval: 913out_reval:
911 if (inode) { 914 if (inode) {
@@ -963,7 +966,7 @@ static void posix_fill_in_inode(struct inode *tmp_inode,
963 966
964int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) 967int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
965{ 968{
966 int rc = 0; 969 int rc = 0, tmprc;
967 int xid; 970 int xid;
968 struct cifs_sb_info *cifs_sb; 971 struct cifs_sb_info *cifs_sb;
969 struct cifsTconInfo *pTcon; 972 struct cifsTconInfo *pTcon;
@@ -1025,6 +1028,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
1025 kfree(pInfo); 1028 kfree(pInfo);
1026 goto mkdir_get_info; 1029 goto mkdir_get_info;
1027 } 1030 }
1031
1028 /* Is an i_ino of zero legal? */ 1032 /* Is an i_ino of zero legal? */
1029 /* Are there sanity checks we can use to ensure that 1033 /* Are there sanity checks we can use to ensure that
1030 the server is really filling in that field? */ 1034 the server is really filling in that field? */
@@ -1113,12 +1117,20 @@ mkdir_get_info:
1113 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) && 1117 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) &&
1114 (mode & S_IWUGO) == 0) { 1118 (mode & S_IWUGO) == 0) {
1115 FILE_BASIC_INFO pInfo; 1119 FILE_BASIC_INFO pInfo;
1120 struct cifsInodeInfo *cifsInode;
1121 u32 dosattrs;
1122
1116 memset(&pInfo, 0, sizeof(pInfo)); 1123 memset(&pInfo, 0, sizeof(pInfo));
1117 pInfo.Attributes = cpu_to_le32(ATTR_READONLY); 1124 cifsInode = CIFS_I(newinode);
1118 CIFSSMBSetPathInfo(xid, pTcon, full_path, 1125 dosattrs = cifsInode->cifsAttrs|ATTR_READONLY;
1119 &pInfo, cifs_sb->local_nls, 1126 pInfo.Attributes = cpu_to_le32(dosattrs);
1127 tmprc = CIFSSMBSetPathInfo(xid, pTcon,
1128 full_path, &pInfo,
1129 cifs_sb->local_nls,
1120 cifs_sb->mnt_cifs_flags & 1130 cifs_sb->mnt_cifs_flags &
1121 CIFS_MOUNT_MAP_SPECIAL_CHR); 1131 CIFS_MOUNT_MAP_SPECIAL_CHR);
1132 if (tmprc == 0)
1133 cifsInode->cifsAttrs = dosattrs;
1122 } 1134 }
1123 if (direntry->d_inode) { 1135 if (direntry->d_inode) {
1124 if (cifs_sb->mnt_cifs_flags & 1136 if (cifs_sb->mnt_cifs_flags &