Message ID | 20190506155905.16152-1-smayhew@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] NFSv4: don't mark all open state for recovery when handling recallable state revoked flag | expand |
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@redhat.com> > --- > 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@hammerspace.com>
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); }
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@redhat.com> --- fs/nfs/delegation.c | 12 ++++++++++++ fs/nfs/delegation.h | 1 + fs/nfs/nfs4state.c | 3 +-- 3 files changed, 14 insertions(+), 2 deletions(-)