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 adb45ec9038..e374050a911 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)  	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/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index f73c482ec9c..fe2d8e6b923 100644 --- a/include/linux/sunrpc/sched.h +++ b/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/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index b84d7395535..566bcfd067f 100644 --- a/net/sunrpc/clnt.c +++ b/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/net/sunrpc/sched.c b/net/sunrpc/sched.c index 6b43ee7221d..a27406b1654 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  	/* 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;  |