summaryrefslogtreecommitdiffstats
path: root/net/sunrpc/clnt.c
diff options
context:
space:
mode:
authorTrond Myklebust2012-05-19 18:12:53 +0200
committerTrond Myklebust2012-05-19 18:12:53 +0200
commit1afeaf5c29aa07db25760d2fbed5c08a3aec3498 (patch)
treeb8fefaefd78e8d4cc3378378e968987297f73c04 /net/sunrpc/clnt.c
parentsunrpc: suppress page allocation warnings in xprt_alloc_slot() (diff)
downloadkernel-qcow2-linux-1afeaf5c29aa07db25760d2fbed5c08a3aec3498.tar.gz
kernel-qcow2-linux-1afeaf5c29aa07db25760d2fbed5c08a3aec3498.tar.xz
kernel-qcow2-linux-1afeaf5c29aa07db25760d2fbed5c08a3aec3498.zip
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: Jeff Layton <jlayton@redhat.com> Cc: stable@vger.kernel.org [>= 3.1] Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net/sunrpc/clnt.c')
-rw-r--r--net/sunrpc/clnt.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index adf2990acebf..25302c802460 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -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;