SUNRPC: call_connect_status() must handle tasks that got transmitted
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Fri, 30 Nov 2018 17:48:47 +0000 (12:48 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 2 Dec 2018 14:43:56 +0000 (09:43 -0500)
If a task failed to get the write lock in the call to xprt_connect(), then
it will be queued on xprt->sending. In that case, it is possible for it
to get transmitted before the call to call_connect_status(), in which
case it needs to be handled by call_transmit_status() instead.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
net/sunrpc/clnt.c

index ae3b8145da35a236cb24a7aff544b3f99d67547d..e35d642558e7ae8847b036e17365120f8dc1ccc5 100644 (file)
@@ -1915,6 +1915,13 @@ call_connect_status(struct rpc_task *task)
        struct rpc_clnt *clnt = task->tk_client;
        int status = task->tk_status;
 
+       /* Check if the task was already transmitted */
+       if (!test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) {
+               xprt_end_transmit(task);
+               task->tk_action = call_transmit_status;
+               return;
+       }
+
        dprint_status(task);
 
        trace_rpc_connect_status(task);