diff options
Diffstat (limited to 'fs/nfs/nfs4proc.c')
| -rw-r--r-- | fs/nfs/nfs4proc.c | 20 | 
1 files changed, 14 insertions, 6 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 8c77039e7a8..4700fae1ada 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -3374,9 +3374,13 @@ static void nfs4_renew_done(struct rpc_task *task, void *calldata)  	if (task->tk_status < 0) {  		/* Unless we're shutting down, schedule state recovery! */ -		if (test_bit(NFS_CS_RENEWD, &clp->cl_res_state) != 0) +		if (test_bit(NFS_CS_RENEWD, &clp->cl_res_state) == 0) +			return; +		if (task->tk_status != NFS4ERR_CB_PATH_DOWN) {  			nfs4_schedule_lease_recovery(clp); -		return; +			return; +		} +		nfs4_schedule_path_down_recovery(clp);  	}  	do_renew_lease(clp, timestamp);  } @@ -3386,7 +3390,7 @@ static const struct rpc_call_ops nfs4_renew_ops = {  	.rpc_release = nfs4_renew_release,  }; -int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred) +static int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred, unsigned renew_flags)  {  	struct rpc_message msg = {  		.rpc_proc	= &nfs4_procedures[NFSPROC4_CLNT_RENEW], @@ -3395,9 +3399,11 @@ int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred)  	};  	struct nfs4_renewdata *data; +	if (renew_flags == 0) +		return 0;  	if (!atomic_inc_not_zero(&clp->cl_count))  		return -EIO; -	data = kmalloc(sizeof(*data), GFP_KERNEL); +	data = kmalloc(sizeof(*data), GFP_NOFS);  	if (data == NULL)  		return -ENOMEM;  	data->client = clp; @@ -3406,7 +3412,7 @@ int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred)  			&nfs4_renew_ops, data);  } -int nfs4_proc_renew(struct nfs_client *clp, struct rpc_cred *cred) +static int nfs4_proc_renew(struct nfs_client *clp, struct rpc_cred *cred)  {  	struct rpc_message msg = {  		.rpc_proc	= &nfs4_procedures[NFSPROC4_CLNT_RENEW], @@ -5504,11 +5510,13 @@ static struct rpc_task *_nfs41_proc_sequence(struct nfs_client *clp, struct rpc_  	return rpc_run_task(&task_setup_data);  } -static int nfs41_proc_async_sequence(struct nfs_client *clp, struct rpc_cred *cred) +static int nfs41_proc_async_sequence(struct nfs_client *clp, struct rpc_cred *cred, unsigned renew_flags)  {  	struct rpc_task *task;  	int ret = 0; +	if ((renew_flags & NFS4_RENEW_TIMEOUT) == 0) +		return 0;  	task = _nfs41_proc_sequence(clp, cred);  	if (IS_ERR(task))  		ret = PTR_ERR(task);  |