On Sat, 2010-02-20 at 18:25 -0800, Trond Myklebust wrote: > From: Trond Myklebust <Trond.Myklebust@xxxxxxxxxx> > > Ensure that we change the EXCHANGE_ID verifier (i.e. clp->cl_boot_time) > when we want to reset all state. This is mainly needed when the server > tells us that it is revoking our open or lock stateids. > > Handle revoking of recallable state by expiring the delegations. > > Handle callback path issues by expiring the delegations and then resetting > the session. > > Signed-off-by: Trond Myklebust <Trond.Myklebust@xxxxxxxxxx> > --- > > fs/nfs/nfs4state.c | 57 +++++++++++++++++++++++++++++++++++++++++----------- > 1 files changed, 45 insertions(+), 12 deletions(-) > > > diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c > index c1e2733..97a3b60 100644 > --- a/fs/nfs/nfs4state.c > +++ b/fs/nfs/nfs4state.c > @@ -1249,26 +1249,59 @@ static int nfs4_reclaim_lease(struct nfs_client *clp) > } > > #ifdef CONFIG_NFS_V4_1 > +static void nfs4_reset_all_state(struct nfs_client *clp) > +{ > + if (test_and_set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) { Doh!!! Should be 'if (!test_and_set_bit()).... Will resend. > + clp->cl_boot_time = CURRENT_TIME; > + nfs4_state_start_reclaim_nograce(clp); > + nfs4_schedule_state_recovery(clp); > + } > +} > + > +static void nfs41_handle_server_reboot(struct nfs_client *clp) > +{ > + if (test_and_set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) { Ditto > + nfs4_state_start_reclaim_reboot(clp); > + nfs4_schedule_state_recovery(clp); > + } > +} > + > +static void nfs41_handle_state_revoked(struct nfs_client *clp) > +{ > + /* Temporary */ > + nfs4_reset_all_state(clp); > +} > + > +static void nfs41_handle_recallable_state_revoked(struct nfs_client *clp) > +{ > + /* This will need to handle layouts too */ > + nfs_expire_all_delegations(clp); > +} > + > +static void nfs41_handle_cb_path_down(struct nfs_client *clp) > +{ > + nfs_expire_all_delegations(clp); > + if (test_and_set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state)) Ditto > + nfs4_schedule_state_recovery(clp); > +} > + > void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags) > { > if (!flags) > return; > - else if (flags & SEQ4_STATUS_RESTART_RECLAIM_NEEDED) { > - set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); > - nfs4_state_start_reclaim_reboot(clp); > - nfs4_schedule_state_recovery(clp); > - } else if (flags & (SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED | > + else if (flags & SEQ4_STATUS_RESTART_RECLAIM_NEEDED) > + nfs41_handle_server_reboot(clp); > + else if (flags & (SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED | > SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED | > SEQ4_STATUS_ADMIN_STATE_REVOKED | > - SEQ4_STATUS_RECALLABLE_STATE_REVOKED | > - SEQ4_STATUS_LEASE_MOVED)) { > - set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); > - nfs4_state_start_reclaim_nograce(clp); > - nfs4_schedule_state_recovery(clp); > - } else if (flags & (SEQ4_STATUS_CB_PATH_DOWN | > + SEQ4_STATUS_LEASE_MOVED)) > + nfs41_handle_state_revoked(clp); > + else if (flags & SEQ4_STATUS_RECALLABLE_STATE_REVOKED) > + nfs41_handle_recallable_state_revoked(clp); > + else if (flags & (SEQ4_STATUS_CB_PATH_DOWN | > SEQ4_STATUS_BACKCHANNEL_FAULT | > SEQ4_STATUS_CB_PATH_DOWN_SESSION)) > - nfs_expire_all_delegations(clp); > + nfs41_handle_cb_path_down(clp); > } > > static int nfs4_reset_session(struct nfs_client *clp) > > -- > To unsubscribe from this list: send the line "unsubscribe linux-nfs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html