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