| From f1872776cd84b4702ee10052bb200bc9580ee004 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 28 Mar 2021 18:12:03 -0400 |
| Subject: NFS: Fix attribute bitmask in _nfs42_proc_fallocate() |
| |
| From: Trond Myklebust <trond.myklebust@hammerspace.com> |
| |
| [ Upstream commit e99812e1382f0bfb6149393262bc70645c9f537a ] |
| |
| We can't use nfs4_fattr_bitmap as a bitmask, because it hasn't been |
| filtered to represent the attributes supported by the server. Instead, |
| let's revert to using server->cache_consistency_bitmask after adding in |
| the missing SPACE_USED attribute. |
| |
| Fixes: 913eca1aea87 ("NFS: Fallocate should use the nfs4_fattr_bitmap") |
| Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/nfs/nfs42proc.c | 10 ++++++++-- |
| 1 file changed, 8 insertions(+), 2 deletions(-) |
| |
| diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c |
| index 4fc61e3d098d..52d8cc253a2b 100644 |
| --- a/fs/nfs/nfs42proc.c |
| +++ b/fs/nfs/nfs42proc.c |
| @@ -46,11 +46,12 @@ static int _nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep, |
| { |
| struct inode *inode = file_inode(filep); |
| struct nfs_server *server = NFS_SERVER(inode); |
| + u32 bitmask[3]; |
| struct nfs42_falloc_args args = { |
| .falloc_fh = NFS_FH(inode), |
| .falloc_offset = offset, |
| .falloc_length = len, |
| - .falloc_bitmask = nfs4_fattr_bitmap, |
| + .falloc_bitmask = bitmask, |
| }; |
| struct nfs42_falloc_res res = { |
| .falloc_server = server, |
| @@ -68,6 +69,10 @@ static int _nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep, |
| return status; |
| } |
| |
| + memcpy(bitmask, server->cache_consistency_bitmask, sizeof(bitmask)); |
| + if (server->attr_bitmask[1] & FATTR4_WORD1_SPACE_USED) |
| + bitmask[1] |= FATTR4_WORD1_SPACE_USED; |
| + |
| res.falloc_fattr = nfs_alloc_fattr(); |
| if (!res.falloc_fattr) |
| return -ENOMEM; |
| @@ -75,7 +80,8 @@ static int _nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep, |
| status = nfs4_call_sync(server->client, server, msg, |
| &args.seq_args, &res.seq_res, 0); |
| if (status == 0) |
| - status = nfs_post_op_update_inode(inode, res.falloc_fattr); |
| + status = nfs_post_op_update_inode_force_wcc(inode, |
| + res.falloc_fattr); |
| |
| kfree(res.falloc_fattr); |
| return status; |
| -- |
| 2.30.2 |
| |