diff options
author | 2025-02-01 15:00:02 -0500 | |
---|---|---|
committer | 2025-02-19 16:45:24 -0500 | |
commit | 5bbd6e863b15a85221e49b9bdb2d5d8f0bb91f3d (patch) | |
tree | d2c388f9622009c15c34384e080bff8c842913ef /net/sunrpc/sched.c | |
parent | NFS: Adjust delegated timestamps for O_DIRECT reads and writes (diff) | |
download | linux-rng-5bbd6e863b15a85221e49b9bdb2d5d8f0bb91f3d.tar.xz linux-rng-5bbd6e863b15a85221e49b9bdb2d5d8f0bb91f3d.zip |
SUNRPC: Prevent looping due to rpc_signal_task() races
If rpc_signal_task() is called while a task is in an rpc_call_done()
callback function, and the latter calls rpc_restart_call(), the task can
end up looping due to the RPC_TASK_SIGNALLED flag being set without the
tk_rpc_status being set.
Removing the redundant mechanism for signalling the task fixes the
looping behaviour.
Reported-by: Li Lingfeng <lilingfeng3@huawei.com>
Fixes: 39494194f93b ("SUNRPC: Fix races with rpc_killall_tasks()")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
Diffstat (limited to 'net/sunrpc/sched.c')
-rw-r--r-- | net/sunrpc/sched.c | 2 |
1 files changed, 0 insertions, 2 deletions
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index cef623ea1506..9b45fbdc90ca 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c @@ -864,8 +864,6 @@ void rpc_signal_task(struct rpc_task *task) if (!rpc_task_set_rpc_status(task, -ERESTARTSYS)) return; trace_rpc_task_signalled(task, task->tk_action); - set_bit(RPC_TASK_SIGNALLED, &task->tk_runstate); - smp_mb__after_atomic(); queue = READ_ONCE(task->tk_waitqueue); if (queue) rpc_wake_up_queued_task(queue, task); |