diff mbox series

[1/1] nfs42: client needs to update file mode after ALLOCATE op

Message ID 1692890290-2772-1-git-send-email-dai.ngo@oracle.com (mailing list archive)
State New, archived
Headers show
Series [1/1] nfs42: client needs to update file mode after ALLOCATE op | expand

Commit Message

Dai Ngo Aug. 24, 2023, 3:18 p.m. UTC
The Linux NFS server strips the SUID and SGID from the file mode
on ALLOCATE op. The GETATTR op in the ALLOCATE compound needs to
request the file mode from the server to update its file mode in
case the SUID/SGUI bit were stripped.

Signed-off-by: Dai Ngo <dai.ngo@oracle.com>
---
 fs/nfs/nfs42proc.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Trond Myklebust Aug. 24, 2023, 3:38 p.m. UTC | #1
On Thu, 2023-08-24 at 08:18 -0700, Dai Ngo wrote:
> The Linux NFS server strips the SUID and SGID from the file mode
> on ALLOCATE op. The GETATTR op in the ALLOCATE compound needs to
> request the file mode from the server to update its file mode in
> case the SUID/SGUI bit were stripped.
> 
> Signed-off-by: Dai Ngo <dai.ngo@oracle.com>
> ---
>  fs/nfs/nfs42proc.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c
> index 63802d195556..ba2b83bfb37c 100644
> --- a/fs/nfs/nfs42proc.c
> +++ b/fs/nfs/nfs42proc.c
> @@ -57,6 +57,9 @@ static int _nfs42_proc_fallocate(struct rpc_message
> *msg, struct file *filep,
>                 .falloc_server  = server,
>         };
>         int status;
> +       struct super_block *sb = inode->i_sb;
> +       u64 fattr_supported = NFS_SB(sb)->fattr_valid;
> +       unsigned long mask = NFS_INO_INVALID_BLOCKS;
>  
>         msg->rpc_argp = &args;
>         msg->rpc_resp = &res;
> @@ -69,8 +72,10 @@ static int _nfs42_proc_fallocate(struct
> rpc_message *msg, struct file *filep,
>                 return status;
>         }
>  
> +       if (fattr_supported & NFS_ATTR_FATTR_MODE)
> +               mask |= NFS_INO_INVALID_MODE;

nfs4_bitmask_set() will take care of masking out bits that are not
supported, so the condition above is redundant.

>         nfs4_bitmask_set(bitmask, server->cache_consistency_bitmask,
> inode,
> -                        NFS_INO_INVALID_BLOCKS);
> +                               mask);
>  
>         res.falloc_fattr = nfs_alloc_fattr();
>         if (!res.falloc_fattr)
diff mbox series

Patch

diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c
index 63802d195556..ba2b83bfb37c 100644
--- a/fs/nfs/nfs42proc.c
+++ b/fs/nfs/nfs42proc.c
@@ -57,6 +57,9 @@  static int _nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep,
 		.falloc_server	= server,
 	};
 	int status;
+	struct super_block *sb = inode->i_sb;
+	u64 fattr_supported = NFS_SB(sb)->fattr_valid;
+	unsigned long mask = NFS_INO_INVALID_BLOCKS;
 
 	msg->rpc_argp = &args;
 	msg->rpc_resp = &res;
@@ -69,8 +72,10 @@  static int _nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep,
 		return status;
 	}
 
+	if (fattr_supported & NFS_ATTR_FATTR_MODE)
+		mask |= NFS_INO_INVALID_MODE;
 	nfs4_bitmask_set(bitmask, server->cache_consistency_bitmask, inode,
-			 NFS_INO_INVALID_BLOCKS);
+				mask);
 
 	res.falloc_fattr = nfs_alloc_fattr();
 	if (!res.falloc_fattr)