Commit d180891f authored by Trond Myklebust's avatar Trond Myklebust Committed by Anna Schumaker

SUNRPC: Don't change task->tk_status after the call to rpc_exit_task

Some calls to rpc_exit_task() may deliberately change the value of
task->tk_status, for instance because it gets checked by the RPC call's
rpc_release() callback. That makes it wrong to reset the value to
task->tk_rpc_status.
In particular this causes a bug where the rpc_call_done() callback tries
to fail over a set of pNFS/flexfiles writes to a different IP address,
but the reset of task->tk_status causes nfs_commit_release_pages() to
immediately mark the file as having a fatal error.

Fixes: 39494194 ("SUNRPC: Fix races with rpc_killall_tasks()")
Cc: stable@vger.kernel.org # 6.1.x
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent 4b71e241
...@@ -927,10 +927,9 @@ static void __rpc_execute(struct rpc_task *task) ...@@ -927,10 +927,9 @@ static void __rpc_execute(struct rpc_task *task)
*/ */
do_action = task->tk_action; do_action = task->tk_action;
/* Tasks with an RPC error status should exit */ /* Tasks with an RPC error status should exit */
if (do_action != rpc_exit_task && if (do_action && do_action != rpc_exit_task &&
(status = READ_ONCE(task->tk_rpc_status)) != 0) { (status = READ_ONCE(task->tk_rpc_status)) != 0) {
task->tk_status = status; task->tk_status = status;
if (do_action != NULL)
do_action = rpc_exit_task; do_action = rpc_exit_task;
} }
/* Callbacks override all actions */ /* Callbacks override all actions */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment