diff options
Diffstat (limited to 'fs/nfs/nfs4proc.c')
| -rw-r--r-- | fs/nfs/nfs4proc.c | 32 | 
1 files changed, 23 insertions, 9 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index bb0e84a46d61..3ed14a2a84a4 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -784,10 +784,9 @@ static void nfs4_slot_sequence_record_sent(struct nfs4_slot *slot,  	if ((s32)(seqnr - slot->seq_nr_highest_sent) > 0)  		slot->seq_nr_highest_sent = seqnr;  } -static void nfs4_slot_sequence_acked(struct nfs4_slot *slot, -		u32 seqnr) +static void nfs4_slot_sequence_acked(struct nfs4_slot *slot, u32 seqnr)  { -	slot->seq_nr_highest_sent = seqnr; +	nfs4_slot_sequence_record_sent(slot, seqnr);  	slot->seq_nr_last_acked = seqnr;  } @@ -854,7 +853,6 @@ static int nfs41_sequence_process(struct rpc_task *task,  			__func__,  			slot->slot_nr,  			slot->seq_nr); -		nfs4_slot_sequence_acked(slot, slot->seq_nr);  		goto out_retry;  	case -NFS4ERR_RETRY_UNCACHED_REP:  	case -NFS4ERR_SEQ_FALSE_RETRY: @@ -3098,12 +3096,13 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,  	}  out: -	if (opendata->lgp) { -		nfs4_lgopen_release(opendata->lgp); -		opendata->lgp = NULL; -	} -	if (!opendata->cancelled) +	if (!opendata->cancelled) { +		if (opendata->lgp) { +			nfs4_lgopen_release(opendata->lgp); +			opendata->lgp = NULL; +		}  		nfs4_sequence_free_slot(&opendata->o_res.seq_res); +	}  	return ret;  } @@ -8924,6 +8923,9 @@ void nfs4_test_session_trunk(struct rpc_clnt *clnt, struct rpc_xprt *xprt,  	if (status == 0)  		rpc_clnt_xprt_switch_add_xprt(clnt, xprt); +	else if (rpc_clnt_xprt_switch_has_addr(clnt, +				(struct sockaddr *)&xprt->addr)) +		rpc_clnt_xprt_switch_remove_xprt(clnt, xprt);  	rpc_put_task(task);  } @@ -9248,6 +9250,13 @@ int nfs4_proc_create_session(struct nfs_client *clp, const struct cred *cred)  	int status;  	unsigned *ptr;  	struct nfs4_session *session = clp->cl_session; +	struct nfs4_add_xprt_data xprtdata = { +		.clp = clp, +	}; +	struct rpc_add_xprt_test rpcdata = { +		.add_xprt_test = clp->cl_mvops->session_trunk, +		.data = &xprtdata, +	};  	dprintk("--> %s clp=%p session=%p\n", __func__, clp, session); @@ -9264,6 +9273,7 @@ int nfs4_proc_create_session(struct nfs_client *clp, const struct cred *cred)  	ptr = (unsigned *)&session->sess_id.data[0];  	dprintk("%s client>seqid %d sessionid %u:%u:%u:%u\n", __func__,  		clp->cl_seqid, ptr[0], ptr[1], ptr[2], ptr[3]); +	rpc_clnt_probe_trunked_xprts(clp->cl_rpcclient, &rpcdata);  out:  	return status;  } @@ -9293,6 +9303,7 @@ int nfs4_proc_destroy_session(struct nfs4_session *session,  	if (status)  		dprintk("NFS: Got error %d from the server on DESTROY_SESSION. "  			"Session has been destroyed regardless...\n", status); +	rpc_clnt_manage_trunked_xprts(session->clp->cl_rpcclient);  	return status;  } @@ -9477,6 +9488,9 @@ static int nfs41_reclaim_complete_handle_errors(struct rpc_task *task, struct nf  		rpc_delay(task, NFS4_POLL_RETRY_MAX);  		fallthrough;  	case -NFS4ERR_RETRY_UNCACHED_REP: +	case -EACCES: +		dprintk("%s: failed to reclaim complete error %d for server %s, retrying\n", +			__func__, task->tk_status, clp->cl_hostname);  		return -EAGAIN;  	case -NFS4ERR_BADSESSION:  	case -NFS4ERR_DEADSESSION:  |