mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 20:54:03 +02:00
nfsd: defer setting NFSD4_CALLBACK_RUNNING in deleg_reaper
deleg_reaper() sets NFSD4_CALLBACK_RUNNING before checking the
5-second rate limit and cl_cb_state gates. When either gate fires
the loop continues without queuing callback work, so the bit's only
clear site in nfsd41_destroy_cb() is never reached and RECALL_ANY
dispatch is permanently disabled for the affected client.
Move the test_and_set_bit() below both non-queueing gates so the
bit is taken only when nfsd4_run_cb() will be called.
Fixes: 424dd3df1f ("nfsd: eliminate cl_ra_cblist and NFSD4_CLIENT_CB_RECALL_ANY")
Cc: stable@vger.kernel.org
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Link: https://patch.msgid.link/20260526-cb_recall_any_callback_running_stuck-v1-1-310011a028f3@kernel.org
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
f5d22e372f
commit
108969960d
|
|
@ -7217,12 +7217,12 @@ deleg_reaper(struct nfsd_net *nn)
|
|||
continue;
|
||||
if (atomic_read(&clp->cl_delegs_in_recall))
|
||||
continue;
|
||||
if (test_and_set_bit(NFSD4_CALLBACK_RUNNING, &clp->cl_ra->ra_cb.cb_flags))
|
||||
continue;
|
||||
if (ktime_get_boottime_seconds() - clp->cl_ra_time < 5)
|
||||
continue;
|
||||
if (clp->cl_cb_state != NFSD4_CB_UP)
|
||||
continue;
|
||||
if (test_and_set_bit(NFSD4_CALLBACK_RUNNING, &clp->cl_ra->ra_cb.cb_flags))
|
||||
continue;
|
||||
|
||||
/* release in nfsd4_cb_recall_any_release */
|
||||
kref_get(&clp->cl_nfsdfs.cl_ref);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user