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(bitmask, server->cache_consistency_bitmask, inode, - NFS_INO_INVALID_BLOCKS); + mask); res.falloc_fattr = nfs_alloc_fattr(); if (!res.falloc_fattr) -- 2.39.3