Commit 10396f4
nfsd: hold a lighter-weight client reference over CB_RECALL_ANY
Currently the CB_RECALL_ANY job takes a cl_rpc_users reference to the
client. While a callback job is technically an RPC that counter is
really more for client-driven RPCs, and this has the effect of
preventing the client from being unhashed until the callback completes.
If nfsd decides to send a CB_RECALL_ANY just as the client reboots, we
can end up in a situation where the callback can't complete on the (now
dead) callback channel, but the new client can't connect because the old
client can't be unhashed. This usually manifests as a NFS4ERR_DELAY
return on the CREATE_SESSION operation.
The job is only holding a reference to the client so it can clear a flag
after the RPC completes. Fix this by having CB_RECALL_ANY instead hold a
reference to the cl_nfsdfs.cl_ref. Typically we only take that sort of
reference when dealing with the nfsdfs info files, but it should work
appropriately here to ensure that the nfs4_client doesn't disappear.
Fixes: 44df6f4 ("NFSD: add delegation reaper to react to low memory condition")
Reported-by: Vladimir Benes <vbenes@redhat.com>
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>1 parent 05258a0 commit 10396f4
1 file changed
+2
-5
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3042 | 3042 | | |
3043 | 3043 | | |
3044 | 3044 | | |
3045 | | - | |
3046 | 3045 | | |
3047 | | - | |
3048 | 3046 | | |
3049 | | - | |
3050 | | - | |
| 3047 | + | |
3051 | 3048 | | |
3052 | 3049 | | |
3053 | 3050 | | |
| |||
6616 | 6613 | | |
6617 | 6614 | | |
6618 | 6615 | | |
6619 | | - | |
| 6616 | + | |
6620 | 6617 | | |
6621 | 6618 | | |
6622 | 6619 | | |
| |||
0 commit comments