diff options
| -rw-r--r-- | fs/lockd/clntproc.c | 8 | ||||
| -rw-r--r-- | include/linux/sunrpc/sched.h | 3 | ||||
| -rw-r--r-- | net/sunrpc/clnt.c | 3 | ||||
| -rw-r--r-- | net/sunrpc/sched.c | 1 |
4 files changed, 13 insertions, 2 deletions
diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c index adb45ec9038c..e374050a911c 100644 --- a/fs/lockd/clntproc.c +++ b/fs/lockd/clntproc.c | |||
| @@ -708,7 +708,13 @@ static void nlmclnt_unlock_callback(struct rpc_task *task, void *data) | |||
| 708 | 708 | ||
| 709 | if (task->tk_status < 0) { | 709 | if (task->tk_status < 0) { |
| 710 | dprintk("lockd: unlock failed (err = %d)\n", -task->tk_status); | 710 | dprintk("lockd: unlock failed (err = %d)\n", -task->tk_status); |
| 711 | goto retry_rebind; | 711 | switch (task->tk_status) { |
| 712 | case -EACCES: | ||
| 713 | case -EIO: | ||
| 714 | goto die; | ||
| 715 | default: | ||
| 716 | goto retry_rebind; | ||
| 717 | } | ||
| 712 | } | 718 | } |
| 713 | if (status == NLM_LCK_DENIED_GRACE_PERIOD) { | 719 | if (status == NLM_LCK_DENIED_GRACE_PERIOD) { |
| 714 | rpc_delay(task, NLMCLNT_GRACE_WAIT); | 720 | rpc_delay(task, NLMCLNT_GRACE_WAIT); |
diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index f73c482ec9c6..fe2d8e6b923b 100644 --- a/include/linux/sunrpc/sched.h +++ b/include/linux/sunrpc/sched.h | |||
| @@ -84,7 +84,8 @@ struct rpc_task { | |||
| 84 | #endif | 84 | #endif |
| 85 | unsigned char tk_priority : 2,/* Task priority */ | 85 | unsigned char tk_priority : 2,/* Task priority */ |
| 86 | tk_garb_retry : 2, | 86 | tk_garb_retry : 2, |
| 87 | tk_cred_retry : 2; | 87 | tk_cred_retry : 2, |
| 88 | tk_rebind_retry : 2; | ||
| 88 | }; | 89 | }; |
| 89 | #define tk_xprt tk_client->cl_xprt | 90 | #define tk_xprt tk_client->cl_xprt |
| 90 | 91 | ||
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index b84d7395535e..566bcfd067f6 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
| @@ -1175,6 +1175,9 @@ call_bind_status(struct rpc_task *task) | |||
| 1175 | status = -EOPNOTSUPP; | 1175 | status = -EOPNOTSUPP; |
| 1176 | break; | 1176 | break; |
| 1177 | } | 1177 | } |
| 1178 | if (task->tk_rebind_retry == 0) | ||
| 1179 | break; | ||
| 1180 | task->tk_rebind_retry--; | ||
| 1178 | rpc_delay(task, 3*HZ); | 1181 | rpc_delay(task, 3*HZ); |
| 1179 | goto retry_timeout; | 1182 | goto retry_timeout; |
| 1180 | case -ETIMEDOUT: | 1183 | case -ETIMEDOUT: |
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index 6b43ee7221d5..a27406b1654f 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c | |||
| @@ -792,6 +792,7 @@ static void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *ta | |||
| 792 | /* Initialize retry counters */ | 792 | /* Initialize retry counters */ |
| 793 | task->tk_garb_retry = 2; | 793 | task->tk_garb_retry = 2; |
| 794 | task->tk_cred_retry = 2; | 794 | task->tk_cred_retry = 2; |
| 795 | task->tk_rebind_retry = 2; | ||
| 795 | 796 | ||
| 796 | task->tk_priority = task_setup_data->priority - RPC_PRIORITY_LOW; | 797 | task->tk_priority = task_setup_data->priority - RPC_PRIORITY_LOW; |
| 797 | task->tk_owner = current->tgid; | 798 | task->tk_owner = current->tgid; |
