Commit 1afeaf5c authored by Trond Myklebust's avatar Trond Myklebust
Browse files

sunrpc: fix loss of task->tk_status after rpc_delay call in xprt_alloc_slot



xprt_alloc_slot will call rpc_delay() to make the task wait a bit before
retrying when it gets back an -ENOMEM error from xprt_dynamic_alloc_slot.
The problem is that rpc_delay will clear the task->tk_status, causing
call_reserveresult to abort the task.

The solution is simply to let call_reserveresult handle the ENOMEM error
directly.

Reported-by: default avatarJeff Layton <jlayton@redhat.com>
Cc: stable@vger.kernel.org [>= 3.1]
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 6b343099
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1288,6 +1288,8 @@ call_reserveresult(struct rpc_task *task)
	}

	switch (status) {
	case -ENOMEM:
		rpc_delay(task, HZ >> 2);
	case -EAGAIN:	/* woken up; retry */
		task->tk_action = call_reserve;
		return;
+3 −2
Original line number Diff line number Diff line
@@ -984,15 +984,16 @@ static void xprt_alloc_slot(struct rpc_task *task)
		goto out_init_req;
	switch (PTR_ERR(req)) {
	case -ENOMEM:
		rpc_delay(task, HZ >> 2);
		dprintk("RPC:       dynamic allocation of request slot "
				"failed! Retrying\n");
		task->tk_status = -ENOMEM;
		break;
	case -EAGAIN:
		rpc_sleep_on(&xprt->backlog, task, NULL);
		dprintk("RPC:       waiting for request slot\n");
	}
	default:
		task->tk_status = -EAGAIN;
	}
	return;
out_init_req:
	task->tk_status = 0;