diff mbox series

smb: client: fix chmod(2) regression with ATTR_READONLY

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

Commit Message

Paulo Alcantara Feb. 16, 2025, 9:02 p.m. UTC
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(-)

Comments

Steve French Feb. 16, 2025, 11:20 p.m. UTC | #1
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 mbox series

Patch

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;
 	}