summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2020-05-09 20:07:13 +0200
committerTrond Myklebust <trond.myklebust@hammerspace.com>2020-05-11 20:06:50 +0200
commitce99aa62e1eb793e259d023c7f6ccb7c4879917b (patch)
treeeecb41fcd00d2be1aae346e4683d54882a904186 /net
parentnfs: fix NULL deference in nfs4_get_valid_delegation (diff)
downloadlinux-ce99aa62e1eb793e259d023c7f6ccb7c4879917b.tar.xz
linux-ce99aa62e1eb793e259d023c7f6ccb7c4879917b.zip
SUNRPC: Signalled ASYNC tasks need to exit
Ensure that signalled ASYNC rpc_tasks exit immediately instead of spinning until a timeout (or forever). To avoid checking for the signal flag on every scheduler iteration, the check is instead introduced in the client's finite state machine. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Fixes: ae67bd3821bb ("SUNRPC: Fix up task signalling") Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Diffstat (limited to 'net')
-rw-r--r--net/sunrpc/clnt.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index 8d3972ea688b..c74bc402f8c7 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -2433,6 +2433,11 @@ rpc_check_timeout(struct rpc_task *task)
{
struct rpc_clnt *clnt = task->tk_client;
+ if (RPC_SIGNALLED(task)) {
+ rpc_call_rpcerror(task, -ERESTARTSYS);
+ return;
+ }
+
if (xprt_adjust_timeout(task->tk_rqstp) == 0)
return;