Skip to content

Commit

Permalink
SUNRPC: Check whether the task was transmitted before rebind/reconnect
Browse files Browse the repository at this point in the history
Before initiating transport actions that require putting the task to sleep,
such as rebinding or reconnecting, we should check whether or not the task
was already transmitted.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
  • Loading branch information
Trond Myklebust committed Mar 10, 2019
1 parent 6b5f590 commit 03e51d3
Showing 1 changed file with 40 additions and 4 deletions.
44 changes: 40 additions & 4 deletions net/sunrpc/clnt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1811,6 +1811,24 @@ call_encode(struct rpc_task *task)
task->tk_action = call_connect;
}

/*
* Helpers to check if the task was already transmitted, and
* to take action when that is the case.
*/
static bool
rpc_task_transmitted(struct rpc_task *task)
{
return !test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate);
}

static void
rpc_task_handle_transmitted(struct rpc_task *task)
{
xprt_end_transmit(task);
task->tk_action = call_transmit_status;
call_transmit_status(task);
}

/*
* 4. Get the server port number if not yet set
*/
Expand All @@ -1819,6 +1837,11 @@ call_bind(struct rpc_task *task)
{
struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt;

if (rpc_task_transmitted(task)) {
rpc_task_handle_transmitted(task);
return;
}

dprint_status(task);

task->tk_action = call_connect;
Expand All @@ -1837,6 +1860,11 @@ call_bind_status(struct rpc_task *task)
{
int status = -EIO;

if (rpc_task_transmitted(task)) {
rpc_task_handle_transmitted(task);
return;
}

if (task->tk_status >= 0) {
dprint_status(task);
task->tk_status = 0;
Expand Down Expand Up @@ -1916,6 +1944,11 @@ call_connect(struct rpc_task *task)
{
struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt;

if (rpc_task_transmitted(task)) {
rpc_task_handle_transmitted(task);
return;
}

dprintk("RPC: %5u call_connect xprt %p %s connected\n",
task->tk_pid, xprt,
(xprt_connected(xprt) ? "is" : "is not"));
Expand All @@ -1942,10 +1975,8 @@ 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;
if (rpc_task_transmitted(task)) {
rpc_task_handle_transmitted(task);
return;
}

Expand Down Expand Up @@ -2001,6 +2032,11 @@ call_connect_status(struct rpc_task *task)
static void
call_transmit(struct rpc_task *task)
{
if (rpc_task_transmitted(task)) {
rpc_task_handle_transmitted(task);
return;
}

dprint_status(task);

task->tk_action = call_transmit_status;
Expand Down

0 comments on commit 03e51d3

Please sign in to comment.