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 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
clear_bit() for NFS4CLNT_BIND_CONN_TO_SESSION in nfs4_reset_session.

-- 
Trond Myklebust
Linux NFS client maintainer

NetApp
Trond.Myklebust@xxxxxxxxxx
www.netapp.com

��.n��������+%������w��{.n�����{��w���jg��������ݢj����G�������j:+v���w�m������w�������h�����٥



[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