On May 24, 2012, at 5:00 PM, Adamson, Dros wrote: > > 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 Oops, actually that was an older patch with a wrapper around nfs4_proc_bind_conn_to_session - I'll add it back. -dros > >> clear_bit() for NFS4CLNT_BIND_CONN_TO_SESSION in nfs4_reset_session. > > Good catch. > > Thanks! > -dros >
Attachment:
smime.p7s
Description: S/MIME cryptographic signature