On Mon, 2019-05-06 at 11:59 -0400, Scott Mayhew wrote: > Only delegations and layouts can be recalled, so it shouldn't be > necessary to recover all opens when handling the status bit > SEQ4_STATUS_RECALLABLE_STATE_REVOKED. We'll still wind up calling > nfs41_open_expired() when a TEST_STATEID returns > NFS4ERR_DELEG_REVOKED. > > Signed-off-by: Scott Mayhew <smayhew@xxxxxxxxxx> > --- > fs/nfs/delegation.c | 12 ++++++++++++ > fs/nfs/delegation.h | 1 + > fs/nfs/nfs4state.c | 3 +-- > 3 files changed, 14 insertions(+), 2 deletions(-) > > diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c > index 2f6b447cdd82..8b78274e3e56 100644 > --- a/fs/nfs/delegation.c > +++ b/fs/nfs/delegation.c > @@ -1033,6 +1033,18 @@ void > nfs_mark_test_expired_all_delegations(struct nfs_client *clp) > rcu_read_unlock(); > } > > +/** > + * nfs_test_expired_all_delegations - test all delegations for a > client > + * @clp: nfs_client to process > + * > + * Helper for handling "recallable state revoked" status from > server. > + */ > +void nfs_test_expired_all_delegations(struct nfs_client *clp) > +{ > + nfs_mark_test_expired_all_delegations(clp); > + nfs4_schedule_state_manager(clp); > +} > + > /** > * nfs_reap_expired_delegations - reap expired delegations > * @clp: nfs_client to process > diff --git a/fs/nfs/delegation.h b/fs/nfs/delegation.h > index 35b4b02c1ae0..5799777df5ec 100644 > --- a/fs/nfs/delegation.h > +++ b/fs/nfs/delegation.h > @@ -58,6 +58,7 @@ void nfs_delegation_mark_reclaim(struct nfs_client > *clp); > void nfs_delegation_reap_unclaimed(struct nfs_client *clp); > > void nfs_mark_test_expired_all_delegations(struct nfs_client *clp); > +void nfs_test_expired_all_delegations(struct nfs_client *clp); > void nfs_reap_expired_delegations(struct nfs_client *clp); > > /* NFSv4 delegation-related procedures */ > diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c > index 3de36479ed7a..7d0ee5a2aef9 100644 > --- a/fs/nfs/nfs4state.c > +++ b/fs/nfs/nfs4state.c > @@ -2346,8 +2346,7 @@ static void > nfs41_handle_recallable_state_revoked(struct nfs_client *clp) > { > /* FIXME: For now, we destroy all layouts. */ > pnfs_destroy_all_layouts(clp); > - /* FIXME: For now, we test all delegations+open state+locks. */ > - nfs41_handle_some_state_revoked(clp); > + nfs_test_expired_all_delegations(clp); > dprintk("%s: Recallable state revoked on server %s!\n", > __func__, > clp->cl_hostname); > } Thank you! Reviewed-by: Trond Myklebust <trond.myklebust@xxxxxxxxxxxxxxx> -- Trond Myklebust Linux NFS client maintainer, Hammerspace trond.myklebust@xxxxxxxxxxxxxxx