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@xxxxxxxxxx> > --- > 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) -- Trond Myklebust Linux NFS client maintainer, Hammerspace trond.myklebust@xxxxxxxxxxxxxxx