Message ID | 20250216210247.190316-1-pc@manguebit.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | smb: client: fix chmod(2) regression with ATTR_READONLY | expand |
tentatively merged into cifs-2.6.git for-next pending more testing and review On Sun, Feb 16, 2025 at 3:02 PM Paulo Alcantara <pc@manguebit.com> wrote: > > 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. > > Commit a18280e7fdea ("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: a18280e7fdea ("smb: cilent: set reparse mount points as automounts") > Signed-off-by: Paulo Alcantara (Red Hat) <pc@manguebit.com> > --- > fs/smb/client/inode.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c > index 214240612549..616149c7f0a5 100644 > --- a/fs/smb/client/inode.c > +++ b/fs/smb/client/inode.c > @@ -1421,7 +1421,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; > } > @@ -1520,7 +1520,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; > } > -- > 2.48.1 >
diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c index 214240612549..616149c7f0a5 100644 --- a/fs/smb/client/inode.c +++ b/fs/smb/client/inode.c @@ -1421,7 +1421,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; } @@ -1520,7 +1520,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; }
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. Commit a18280e7fdea ("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: a18280e7fdea ("smb: cilent: set reparse mount points as automounts") Signed-off-by: Paulo Alcantara (Red Hat) <pc@manguebit.com> --- fs/smb/client/inode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)