| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Trond Myklebust <trond.myklebust@primarydata.com> |
| Date: Tue, 9 May 2017 15:47:15 -0400 |
| Subject: NFSv4.1: Work around a Linux server bug... |
| |
| From: Trond Myklebust <trond.myklebust@primarydata.com> |
| |
| |
| [ Upstream commit f4b23de3dda1536590787c9e5c3d16b8738ab108 ] |
| |
| It turns out the Linux server has a bug in its implementation of |
| supattr_exclcreat; it returns the set of all attributes, whether |
| or not they are supported by minor version 1. |
| In order to avoid a regression, we therefore apply the supported_attrs |
| as a mask on top of whatever the server sent us. |
| |
| Reported-by: Anna Schumaker <Anna.Schumaker@Netapp.com> |
| Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/nfs/nfs4proc.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| --- a/fs/nfs/nfs4proc.c |
| +++ b/fs/nfs/nfs4proc.c |
| @@ -3300,6 +3300,7 @@ static int _nfs4_server_capabilities(str |
| .rpc_resp = &res, |
| }; |
| int status; |
| + int i; |
| |
| bitmask[0] = FATTR4_WORD0_SUPPORTED_ATTRS | |
| FATTR4_WORD0_FH_EXPIRE_TYPE | |
| @@ -3365,8 +3366,13 @@ static int _nfs4_server_capabilities(str |
| server->cache_consistency_bitmask[0] &= FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE; |
| server->cache_consistency_bitmask[1] &= FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY; |
| server->cache_consistency_bitmask[2] = 0; |
| + |
| + /* Avoid a regression due to buggy server */ |
| + for (i = 0; i < ARRAY_SIZE(res.exclcreat_bitmask); i++) |
| + res.exclcreat_bitmask[i] &= res.attr_bitmask[i]; |
| memcpy(server->exclcreat_bitmask, res.exclcreat_bitmask, |
| sizeof(server->exclcreat_bitmask)); |
| + |
| server->acl_bitmask = res.acl_bitmask; |
| server->fh_expire_type = res.fh_expire_type; |
| } |