aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/nfs4state.c
diff options
context:
space:
mode:
authorStanislav Kinsbursky <skinsbursky@parallels.com>2012-11-26 07:22:18 -0500
committerJ. Bruce Fields <bfields@redhat.com>2012-11-28 10:13:53 -0500
commitf252bc6806a9428f2e3a429e4cdffbd012de9839 (patch)
treeb2beb8aa4ccd300f5b3ed70431d167b46fbcd9e4 /fs/nfsd/nfs4state.c
parentd85ed443052570b25ea4b5f5fa70c57e0129fbc4 (diff)
nfsd: call state init and shutdown twice
Split NFSv4 state init and shutdown into two different calls: per-net one and generic one. Per-net cwinit/shutdown pair have to be called for any namespace, generic pair - only once on NSFd kthreads start and shutdown respectively. Refresh of diff-nfsd-call-state-init-twice Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd/nfs4state.c')
-rw-r--r--fs/nfsd/nfs4state.c30
1 files changed, 12 insertions, 18 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 6f5798623eb1..fb98f291aac2 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -4861,12 +4861,22 @@ nfs4_state_destroy_net(struct net *net)
4861 put_net(net); 4861 put_net(net);
4862} 4862}
4863 4863
4864static int 4864int
4865nfs4_state_start_net(struct net *net) 4865nfs4_state_start_net(struct net *net)
4866{ 4866{
4867 struct nfsd_net *nn = net_generic(net, nfsd_net_id); 4867 struct nfsd_net *nn = net_generic(net, nfsd_net_id);
4868 int ret; 4868 int ret;
4869 4869
4870 /*
4871 * FIXME: For now, we hang most of the pernet global stuff off of
4872 * init_net until nfsd is fully containerized. Eventually, we'll
4873 * need to pass a net pointer into this function, take a reference
4874 * to that instead and then do most of the rest of this on a per-net
4875 * basis.
4876 */
4877 if (net != &init_net)
4878 return -EINVAL;
4879
4870 ret = nfs4_state_create_net(net); 4880 ret = nfs4_state_create_net(net);
4871 if (ret) 4881 if (ret)
4872 return ret; 4882 return ret;
@@ -4901,21 +4911,8 @@ nfs4_state_start(void)
4901 4911
4902 set_max_delegations(); 4912 set_max_delegations();
4903 4913
4904 /*
4905 * FIXME: For now, we hang most of the pernet global stuff off of
4906 * init_net until nfsd is fully containerized. Eventually, we'll
4907 * need to pass a net pointer into this function, take a reference
4908 * to that instead and then do most of the rest of this on a per-net
4909 * basis.
4910 */
4911 ret = nfs4_state_start_net(&init_net);
4912 if (ret)
4913 goto out_free_callback;
4914
4915 return 0; 4914 return 0;
4916 4915
4917out_free_callback:
4918 nfsd4_destroy_callback_queue();
4919out_free_laundry: 4916out_free_laundry:
4920 destroy_workqueue(laundry_wq); 4917 destroy_workqueue(laundry_wq);
4921out_recovery: 4918out_recovery:
@@ -4923,7 +4920,7 @@ out_recovery:
4923} 4920}
4924 4921
4925/* should be called with the state lock held */ 4922/* should be called with the state lock held */
4926static void 4923void
4927nfs4_state_shutdown_net(struct net *net) 4924nfs4_state_shutdown_net(struct net *net)
4928{ 4925{
4929 struct nfs4_delegation *dp = NULL; 4926 struct nfs4_delegation *dp = NULL;
@@ -4954,9 +4951,6 @@ nfs4_state_shutdown_net(struct net *net)
4954void 4951void
4955nfs4_state_shutdown(void) 4952nfs4_state_shutdown(void)
4956{ 4953{
4957 struct net *net = &init_net;
4958
4959 nfs4_state_shutdown_net(net);
4960 destroy_workqueue(laundry_wq); 4954 destroy_workqueue(laundry_wq);
4961 nfsd4_destroy_callback_queue(); 4955 nfsd4_destroy_callback_queue();
4962} 4956}