diff mbox series

NFSv4.2: Update mode bits after ALLOCATE and DEALLOCATE

Message ID 20220830205821.641180-1-anna@kernel.org (mailing list archive)
State New, archived
Headers show
Series NFSv4.2: Update mode bits after ALLOCATE and DEALLOCATE | expand

Commit Message

Anna Schumaker Aug. 30, 2022, 8:58 p.m. UTC
From: Anna Schumaker <Anna.Schumaker@Netapp.com>

The fallocate call invalidates suid and sgid bits as part of normal
operation. We need to mark the mode bits as invalid when using fallocate
so these will be updated the next time the user looks at them.

This fixes xfstests generic/683 and generic/684.

Reported-by: Yue Cui <cuiyue-fnst@fujitsu.com>
Fixes: 913eca1aea87 ("NFS: Fallocate should use the nfs4_fattr_bitmap")
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
 fs/nfs/nfs42proc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Trond Myklebust Aug. 30, 2022, 11:15 p.m. UTC | #1
On Tue, 2022-08-30 at 16:58 -0400, Anna Schumaker wrote:
> From: Anna Schumaker <Anna.Schumaker@Netapp.com>
> 
> The fallocate call invalidates suid and sgid bits as part of normal
> operation. We need to mark the mode bits as invalid when using
> fallocate
> so these will be updated the next time the user looks at them.
> 
> This fixes xfstests generic/683 and generic/684.
> 
> Reported-by: Yue Cui <cuiyue-fnst@fujitsu.com>
> Fixes: 913eca1aea87 ("NFS: Fallocate should use the
> nfs4_fattr_bitmap")
> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
> ---
>  fs/nfs/nfs42proc.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c
> index 068c45b3bc1a..a1b264b1a09f 100644
> --- a/fs/nfs/nfs42proc.c
> +++ b/fs/nfs/nfs42proc.c
> @@ -70,7 +70,7 @@ static int _nfs42_proc_fallocate(struct rpc_message
> *msg, struct file *filep,
>         }
>  
>         nfs4_bitmask_set(bitmask, server->cache_consistency_bitmask,
> inode,
> -                        NFS_INO_INVALID_BLOCKS);
> +                        NFS_INO_INVALID_BLOCKS |
> NFS_INO_INVALID_MODE);

Hmm... Could we please set NFS_INO_INVALID_MODE only in the case where
we see that either the S_ISUID or S_ISGID bits are set, just like we do
in nfs_writeback_done()?

>  
>         res.falloc_fattr = nfs_alloc_fattr();
>         if (!res.falloc_fattr)

Note also that you really should (conditionally!) call
nfs_set_cache_invalid() at some point between the RPC call completing,
and the call to nfs_post_op_update_inode_force_wcc(), just in case the
server fails to return the attributes.
diff mbox series

Patch

diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c
index 068c45b3bc1a..a1b264b1a09f 100644
--- a/fs/nfs/nfs42proc.c
+++ b/fs/nfs/nfs42proc.c
@@ -70,7 +70,7 @@  static int _nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep,
 	}
 
 	nfs4_bitmask_set(bitmask, server->cache_consistency_bitmask, inode,
-			 NFS_INO_INVALID_BLOCKS);
+			 NFS_INO_INVALID_BLOCKS | NFS_INO_INVALID_MODE);
 
 	res.falloc_fattr = nfs_alloc_fattr();
 	if (!res.falloc_fattr)