Re: [PATCH 2/2] nfs41: Use BIND_CONN_TO_SESSION for CB_PATH_DOWN*

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On May 24, 2012, at 4:39 PM, Myklebust, Trond wrote:

> On Thu, 2012-05-24 at 12:26 -0400, Weston Andros Adamson wrote:
>> The state manager can handle SEQ4_STATUS_CB_PATH_DOWN* flags with a
>> BIND_CONN_TO_SESSION instead of destroying the session and creating a new one.
>> 
>> Signed-off-by: Weston Andros Adamson <dros@xxxxxxxxxx>
>> ---
>> fs/nfs/nfs4_fs.h   |    1 +
>> fs/nfs/nfs4state.c |   26 +++++++++++++++++++++-----
>> 2 files changed, 22 insertions(+), 5 deletions(-)
>> 
>> diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
>> index ad90bc7..9feff0f 100644
>> --- a/fs/nfs/nfs4_fs.h
>> +++ b/fs/nfs/nfs4_fs.h
>> @@ -24,6 +24,7 @@ enum nfs4_client_state {
>> 	NFS4CLNT_RECALL_SLOT,
>> 	NFS4CLNT_LEASE_CONFIRM,
>> 	NFS4CLNT_SERVER_SCOPE_MISMATCH,
>> +	NFS4CLNT_BIND_CONN_TO_SESSION,
>> };
>> 
>> enum nfs4_session_state {
>> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
>> index 7f0fcfc..40558ca 100644
>> --- a/fs/nfs/nfs4state.c
>> +++ b/fs/nfs/nfs4state.c
>> @@ -1639,13 +1639,20 @@ static void nfs41_handle_recallable_state_revoked(struct nfs_client *clp)
>> 	nfs_expire_all_delegations(clp);
>> }
>> 
>> -static void nfs41_handle_cb_path_down(struct nfs_client *clp)
>> +static void nfs41_handle_backchannel_fault(struct nfs_client *clp)
>> {
>> 	nfs_expire_all_delegations(clp);
>> 	if (test_and_set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state) == 0)
>> 		nfs4_schedule_state_manager(clp);
>> }
>> 
>> +static void nfs41_handle_cb_path_down(struct nfs_client *clp)
>> +{
>> +	if (test_and_set_bit(NFS4CLNT_BIND_CONN_TO_SESSION,
>> +		&clp->cl_state) == 0)
>> +		nfs4_schedule_state_manager(clp);
>> +}
>> +
>> void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags)
>> {
>> 	if (!flags)
>> @@ -1659,9 +1666,10 @@ void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags)
>> 		nfs41_handle_state_revoked(clp);
>> 	if (flags & SEQ4_STATUS_RECALLABLE_STATE_REVOKED)
>> 		nfs41_handle_recallable_state_revoked(clp);
>> -	if (flags & (SEQ4_STATUS_CB_PATH_DOWN |
>> -			    SEQ4_STATUS_BACKCHANNEL_FAULT |
>> -			    SEQ4_STATUS_CB_PATH_DOWN_SESSION))
>> +	if (flags & SEQ4_STATUS_BACKCHANNEL_FAULT)
>> +		nfs41_handle_backchannel_fault(clp);
>> +	else if (flags & (SEQ4_STATUS_CB_PATH_DOWN |
>> +				SEQ4_STATUS_CB_PATH_DOWN_SESSION))
>> 		nfs41_handle_cb_path_down(clp);
>> }
>> 
>> @@ -1721,7 +1729,6 @@ static int nfs4_recall_slot(struct nfs_client *clp)
>> 	nfs4_end_drain_session(clp);
>> 	return 0;
>> }
>> -
>> #else /* CONFIG_NFS_V4_1 */
>> static int nfs4_reset_session(struct nfs_client *clp) { return 0; }
>> static int nfs4_end_drain_session(struct nfs_client *clp) { return 0; }
>> @@ -1803,6 +1810,15 @@ static void nfs4_state_manager(struct nfs_client *clp)
>> 				goto out_error;
>> 		}
>> 
>> +		/* Send BIND_CONN_TO_SESSION */
>> +		if (clp->cl_mvops->minor_version == 1 &&
>> +		    test_and_clear_bit(NFS4CLNT_BIND_CONN_TO_SESSION,
>> +				&clp->cl_state) && nfs4_has_session(clp)) {
>> +			status = nfs4_proc_bind_conn_to_session(clp);
>> +			if (status < 0)
>> +				goto out_error;
>> +		}
>> +
>> 		/* First recover reboot state... */
>> 		if (test_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state)) {
>> 			status = nfs4_do_reclaim(clp,
> 
> Committed after fixing ifndef CONFIG_NFS_V4_1 issues and adding a

Ah, I actually did test with CONFIG_NFS_V4_1 undefined - it compiles, but you're right, this should be #ifdef'd

> clear_bit() for NFS4CLNT_BIND_CONN_TO_SESSION in nfs4_reset_session.

Good catch.

Thanks!
-dros

Attachment: smime.p7s
Description: S/MIME cryptographic signature


[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux