mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 11:03:43 +02:00
nfsd: update percpu_ref to manage references on nfsd_net
Holding a reference on nfsd_net is what is required, it was never actually about ensuring nn->nfsd_serv available. Move waiting for outstanding percpu references from nfsd_destroy_serv() to nfsd_shutdown_net(). By moving it later it will be possible to invalidate localio clients during nfsd_file_cache_shutdown_net() via __nfsd_file_cache_purge(). Signed-off-by: Mike Snitzer <snitzer@kernel.org> Reviewed-by: Jeff Layton <jlayton@kernel.org> Acked-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
This commit is contained in:
parent
86e0041225
commit
39972494e3
|
|
@ -436,6 +436,10 @@ static void nfsd_shutdown_net(struct net *net)
|
||||||
|
|
||||||
if (!nn->nfsd_net_up)
|
if (!nn->nfsd_net_up)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
percpu_ref_kill_and_confirm(&nn->nfsd_serv_ref, nfsd_serv_done);
|
||||||
|
wait_for_completion(&nn->nfsd_serv_confirm_done);
|
||||||
|
|
||||||
nfsd_export_flush(net);
|
nfsd_export_flush(net);
|
||||||
nfs4_state_shutdown_net(net);
|
nfs4_state_shutdown_net(net);
|
||||||
nfsd_reply_cache_shutdown(nn);
|
nfsd_reply_cache_shutdown(nn);
|
||||||
|
|
@ -444,7 +448,10 @@ static void nfsd_shutdown_net(struct net *net)
|
||||||
lockd_down(net);
|
lockd_down(net);
|
||||||
nn->lockd_up = false;
|
nn->lockd_up = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wait_for_completion(&nn->nfsd_serv_free_done);
|
||||||
percpu_ref_exit(&nn->nfsd_serv_ref);
|
percpu_ref_exit(&nn->nfsd_serv_ref);
|
||||||
|
|
||||||
nn->nfsd_net_up = false;
|
nn->nfsd_net_up = false;
|
||||||
nfsd_shutdown_generic();
|
nfsd_shutdown_generic();
|
||||||
}
|
}
|
||||||
|
|
@ -526,11 +533,6 @@ void nfsd_destroy_serv(struct net *net)
|
||||||
|
|
||||||
lockdep_assert_held(&nfsd_mutex);
|
lockdep_assert_held(&nfsd_mutex);
|
||||||
|
|
||||||
percpu_ref_kill_and_confirm(&nn->nfsd_serv_ref, nfsd_serv_done);
|
|
||||||
wait_for_completion(&nn->nfsd_serv_confirm_done);
|
|
||||||
wait_for_completion(&nn->nfsd_serv_free_done);
|
|
||||||
/* percpu_ref_exit is called in nfsd_shutdown_net */
|
|
||||||
|
|
||||||
spin_lock(&nfsd_notifier_lock);
|
spin_lock(&nfsd_notifier_lock);
|
||||||
nn->nfsd_serv = NULL;
|
nn->nfsd_serv = NULL;
|
||||||
spin_unlock(&nfsd_notifier_lock);
|
spin_unlock(&nfsd_notifier_lock);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user