smb: client: fix chmod(2) regression with ATTR_READONLY
When the user sets a file or directory as read-only (e.g. ~S_IWUGO), the client will set the ATTR_READONLY attribute by sending an SMB2_SET_INFO request to the server in cifs_setattr_{,nounix}(), but cifsInodeInfo::cifsAttrs will be left unchanged as the client will only update the new file attributes in the next call to {smb311_posix,cifs}_get_inode_info() with the new metadata filled in @data parameter. Commita18280e7fd
("smb: cilent: set reparse mount points as automounts") mistakenly removed the @data NULL check when calling is_inode_cache_good(), which broke the above case as the new ATTR_READONLY attribute would end up not being updated on files with a read lease. Fix this by updating the inode whenever we have cached metadata in @data parameter. Reported-by: Horst Reiterer <horst.reiterer@fabasoft.com> Closes: https://lore.kernel.org/r/85a16504e09147a195ac0aac1c801280@fabasoft.com Fixes:a18280e7fd
("smb: cilent: set reparse mount points as automounts") Cc: stable@vger.kernel.org Signed-off-by: Paulo Alcantara (Red Hat) <pc@manguebit.com> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
0ad2507d5d
commit
654292a0b2
1 changed files with 2 additions and 2 deletions
|
@ -1408,7 +1408,7 @@ int cifs_get_inode_info(struct inode **inode,
|
|||
struct cifs_fattr fattr = {};
|
||||
int rc;
|
||||
|
||||
if (is_inode_cache_good(*inode)) {
|
||||
if (!data && is_inode_cache_good(*inode)) {
|
||||
cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
|
||||
return 0;
|
||||
}
|
||||
|
@ -1507,7 +1507,7 @@ int smb311_posix_get_inode_info(struct inode **inode,
|
|||
struct cifs_fattr fattr = {};
|
||||
int rc;
|
||||
|
||||
if (is_inode_cache_good(*inode)) {
|
||||
if (!data && is_inode_cache_good(*inode)) {
|
||||
cifs_dbg(FYI, "No need to revalidate cached inode sizes\n");
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue