From 031785445cab785c2f04c77cc716fcdac4179f4c Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Tue, 31 May 2011 15:15:34 -0400 Subject: [PATCH] --- yaml --- r: 253927 b: refs/heads/master c: 0b760113a3a155269a3fba93a409c640031dd68f h: refs/heads/master i: 253925: d27e2cb3e5c0bb5523532423d0831bab47bff139 253923: 41e7176bf18890035be7a7c55ed99631987a2f19 253919: 15661cae6dcbaf5f25c41fdb322409532e87edca v: v3 --- [refs] | 2 +- trunk/fs/lockd/clntproc.c | 8 +++++++- trunk/include/linux/sunrpc/sched.h | 3 ++- trunk/net/sunrpc/clnt.c | 3 +++ trunk/net/sunrpc/sched.c | 1 + 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 49033b6b966f..c7cf6b71ea84 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9e3bd4e24e94d60d2e0762e919aab6c9a7fc0c5b +refs/heads/master: 0b760113a3a155269a3fba93a409c640031dd68f diff --git a/trunk/fs/lockd/clntproc.c b/trunk/fs/lockd/clntproc.c index adb45ec9038c..e374050a911c 100644 --- a/trunk/fs/lockd/clntproc.c +++ b/trunk/fs/lockd/clntproc.c @@ -708,7 +708,13 @@ static void nlmclnt_unlock_callback(struct rpc_task *task, void *data) if (task->tk_status < 0) { dprintk("lockd: unlock failed (err = %d)\n", -task->tk_status); - goto retry_rebind; + switch (task->tk_status) { + case -EACCES: + case -EIO: + goto die; + default: + goto retry_rebind; + } } if (status == NLM_LCK_DENIED_GRACE_PERIOD) { rpc_delay(task, NLMCLNT_GRACE_WAIT); diff --git a/trunk/include/linux/sunrpc/sched.h b/trunk/include/linux/sunrpc/sched.h index f73c482ec9c6..fe2d8e6b923b 100644 --- a/trunk/include/linux/sunrpc/sched.h +++ b/trunk/include/linux/sunrpc/sched.h @@ -84,7 +84,8 @@ struct rpc_task { #endif unsigned char tk_priority : 2,/* Task priority */ tk_garb_retry : 2, - tk_cred_retry : 2; + tk_cred_retry : 2, + tk_rebind_retry : 2; }; #define tk_xprt tk_client->cl_xprt diff --git a/trunk/net/sunrpc/clnt.c b/trunk/net/sunrpc/clnt.c index b84d7395535e..566bcfd067f6 100644 --- a/trunk/net/sunrpc/clnt.c +++ b/trunk/net/sunrpc/clnt.c @@ -1175,6 +1175,9 @@ call_bind_status(struct rpc_task *task) status = -EOPNOTSUPP; break; } + if (task->tk_rebind_retry == 0) + break; + task->tk_rebind_retry--; rpc_delay(task, 3*HZ); goto retry_timeout; case -ETIMEDOUT: diff --git a/trunk/net/sunrpc/sched.c b/trunk/net/sunrpc/sched.c index 6b43ee7221d5..a27406b1654f 100644 --- a/trunk/net/sunrpc/sched.c +++ b/trunk/net/sunrpc/sched.c @@ -792,6 +792,7 @@ static void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *ta /* Initialize retry counters */ task->tk_garb_retry = 2; task->tk_cred_retry = 2; + task->tk_rebind_retry = 2; task->tk_priority = task_setup_data->priority - RPC_PRIORITY_LOW; task->tk_owner = current->tgid;