We need to warn against broken NFSv4.1 servers that try to hand out
delegations in response to NFS4_OPEN_CLAIM_DELEG_CUR_FH.
Signed-off-by: Trond Myklebust <[email protected]>
---
fs/nfs/nfs4proc.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index f93b9cdb4934..56b0958b940f 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -1458,12 +1458,16 @@ nfs4_opendata_check_deleg(struct nfs4_opendata *data, struct nfs4_state *state)
if (delegation)
delegation_flags = delegation->flags;
rcu_read_unlock();
- if (data->o_arg.claim == NFS4_OPEN_CLAIM_DELEGATE_CUR) {
+ switch (data->o_arg.claim) {
+ case NFS4_OPEN_CLAIM_DELEGATE_CUR:
+ case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
pr_err_ratelimited("NFS: Broken NFSv4 server %s is "
"returning a delegation for "
"OPEN(CLAIM_DELEGATE_CUR)\n",
clp->cl_hostname);
- } else if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0)
+ return;
+ }
+ if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0)
nfs_inode_set_delegation(state->inode,
data->owner->so_cred,
&data->o_res);
--
2.4.3
Hi Trond,
[auto build test results on v4.3-rc3 -- if it's inappropriate base, please ignore]
config: m68k-sun3_defconfig (attached as .config)
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=m68k
All warnings (new ones prefixed by >>):
fs/nfs/nfs4proc.c: In function 'nfs4_opendata_check_deleg':
>> fs/nfs/nfs4proc.c:1461:2: warning: enumeration value 'NFS4_OPEN_CLAIM_NULL' not handled in switch [-Wswitch]
switch (data->o_arg.claim) {
^
>> fs/nfs/nfs4proc.c:1461:2: warning: enumeration value 'NFS4_OPEN_CLAIM_PREVIOUS' not handled in switch [-Wswitch]
>> fs/nfs/nfs4proc.c:1461:2: warning: enumeration value 'NFS4_OPEN_CLAIM_DELEGATE_PREV' not handled in switch [-Wswitch]
>> fs/nfs/nfs4proc.c:1461:2: warning: enumeration value 'NFS4_OPEN_CLAIM_FH' not handled in switch [-Wswitch]
>> fs/nfs/nfs4proc.c:1461:2: warning: enumeration value 'NFS4_OPEN_CLAIM_DELEG_PREV_FH' not handled in switch [-Wswitch]
vim +/NFS4_OPEN_CLAIM_NULL +1461 fs/nfs/nfs4proc.c
1445 atomic_inc(&state->count);
1446 return state;
1447 }
1448
1449 static void
1450 nfs4_opendata_check_deleg(struct nfs4_opendata *data, struct nfs4_state *state)
1451 {
1452 struct nfs_client *clp = NFS_SERVER(state->inode)->nfs_client;
1453 struct nfs_delegation *delegation;
1454 int delegation_flags = 0;
1455
1456 rcu_read_lock();
1457 delegation = rcu_dereference(NFS_I(state->inode)->delegation);
1458 if (delegation)
1459 delegation_flags = delegation->flags;
1460 rcu_read_unlock();
> 1461 switch (data->o_arg.claim) {
1462 case NFS4_OPEN_CLAIM_DELEGATE_CUR:
1463 case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
1464 pr_err_ratelimited("NFS: Broken NFSv4 server %s is "
1465 "returning a delegation for "
1466 "OPEN(CLAIM_DELEGATE_CUR)\n",
1467 clp->cl_hostname);
1468 return;
1469 }
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
We need to warn against broken NFSv4.1 servers that try to hand out
delegations in response to NFS4_OPEN_CLAIM_DELEG_CUR_FH.
Signed-off-by: Trond Myklebust <[email protected]>
---
fs/nfs/nfs4proc.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index f93b9cdb4934..12e9808d5df0 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -1458,12 +1458,18 @@ nfs4_opendata_check_deleg(struct nfs4_opendata *data, struct nfs4_state *state)
if (delegation)
delegation_flags = delegation->flags;
rcu_read_unlock();
- if (data->o_arg.claim == NFS4_OPEN_CLAIM_DELEGATE_CUR) {
+ switch (data->o_arg.claim) {
+ default:
+ break;
+ case NFS4_OPEN_CLAIM_DELEGATE_CUR:
+ case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
pr_err_ratelimited("NFS: Broken NFSv4 server %s is "
"returning a delegation for "
"OPEN(CLAIM_DELEGATE_CUR)\n",
clp->cl_hostname);
- } else if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0)
+ return;
+ }
+ if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0)
nfs_inode_set_delegation(state->inode,
data->owner->so_cred,
&data->o_res);
--
2.4.3