diff options
| author | Paulo Alcantara <pc@manguebit.com> | 2025-02-16 18:02:47 -0300 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2025-03-13 12:58:20 +0100 |
| commit | 2c55d671849a29afa7f1b6958c2927745fa1d38a (patch) | |
| tree | 134c6f6cbc340bf1ac46559db3a0f5a34c42e9ed /fs | |
| parent | 75cc3357a3318d951d32085939de0491514f5fe5 (diff) | |
| download | linux-2c55d671849a29afa7f1b6958c2927745fa1d38a.tar.gz linux-2c55d671849a29afa7f1b6958c2927745fa1d38a.tar.bz2 linux-2c55d671849a29afa7f1b6958c2927745fa1d38a.zip | |
smb: client: fix chmod(2) regression with ATTR_READONLY
[ Upstream commit 654292a0b264e9b8c51b98394146218a21612aa1 ]
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")
Cc: stable@vger.kernel.org
Signed-off-by: Paulo Alcantara (Red Hat) <pc@manguebit.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/smb/client/inode.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c index b3e59a7c7120..dbb407d5e6da 100644 --- a/fs/smb/client/inode.c +++ b/fs/smb/client/inode.c @@ -1320,7 +1320,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; } @@ -1419,7 +1419,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; } |
