| From 181ccadfd284bdf03264290e233020c48c1f617a Mon Sep 17 00:00:00 2001 |
| From: Trond Myklebust <trondmy@gmail.com> |
| Date: Thu, 12 Sep 2019 08:06:51 -0400 |
| Subject: [PATCH] SUNRPC: RPC level errors should always set |
| task->tk_rpc_status |
| |
| commit 714fbc73888f59321854e7f6c2f224213923bcad upstream. |
| |
| Ensure that we set task->tk_rpc_status for all RPC level errors so that |
| the caller can distinguish between those and server reply status errors. |
| |
| Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> |
| Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c |
| index 0d79321f51ee..c94d6f0881c3 100644 |
| --- a/net/sunrpc/clnt.c |
| +++ b/net/sunrpc/clnt.c |
| @@ -1760,7 +1760,7 @@ call_allocate(struct rpc_task *task) |
| return; |
| } |
| |
| - rpc_exit(task, -ERESTARTSYS); |
| + rpc_call_rpcerror(task, -ERESTARTSYS); |
| } |
| |
| static int |
| @@ -2480,7 +2480,7 @@ rpc_encode_header(struct rpc_task *task, struct xdr_stream *xdr) |
| return 0; |
| out_fail: |
| trace_rpc_bad_callhdr(task); |
| - rpc_exit(task, error); |
| + rpc_call_rpcerror(task, error); |
| return error; |
| } |
| |
| @@ -2547,7 +2547,7 @@ rpc_decode_header(struct rpc_task *task, struct xdr_stream *xdr) |
| return -EAGAIN; |
| } |
| out_err: |
| - rpc_exit(task, error); |
| + rpc_call_rpcerror(task, error); |
| return error; |
| |
| out_unparsable: |
| diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c |
| index a2c114812717..0b11971dec79 100644 |
| --- a/net/sunrpc/sched.c |
| +++ b/net/sunrpc/sched.c |
| @@ -914,8 +914,10 @@ static void __rpc_execute(struct rpc_task *task) |
| /* |
| * Signalled tasks should exit rather than sleep. |
| */ |
| - if (RPC_SIGNALLED(task)) |
| + if (RPC_SIGNALLED(task)) { |
| + task->tk_rpc_status = -ERESTARTSYS; |
| rpc_exit(task, -ERESTARTSYS); |
| + } |
| |
| /* |
| * The queue->lock protects against races with |
| @@ -951,6 +953,7 @@ static void __rpc_execute(struct rpc_task *task) |
| */ |
| dprintk("RPC: %5u got signal\n", task->tk_pid); |
| set_bit(RPC_TASK_SIGNALLED, &task->tk_runstate); |
| + task->tk_rpc_status = -ERESTARTSYS; |
| rpc_exit(task, -ERESTARTSYS); |
| } |
| dprintk("RPC: %5u sync task resuming\n", task->tk_pid); |
| -- |
| 2.7.4 |
| |