diff options
author | Stanislav Kinsbursky <skinsbursky@parallels.com> | 2012-11-26 07:22:18 -0500 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2012-11-28 10:13:53 -0500 |
commit | f252bc6806a9428f2e3a429e4cdffbd012de9839 (patch) | |
tree | b2beb8aa4ccd300f5b3ed70431d167b46fbcd9e4 /fs/nfsd/nfs4state.c | |
parent | d85ed443052570b25ea4b5f5fa70c57e0129fbc4 (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.c | 30 |
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 | ||
4864 | static int | 4864 | int |
4865 | nfs4_state_start_net(struct net *net) | 4865 | nfs4_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 | ||
4917 | out_free_callback: | ||
4918 | nfsd4_destroy_callback_queue(); | ||
4919 | out_free_laundry: | 4916 | out_free_laundry: |
4920 | destroy_workqueue(laundry_wq); | 4917 | destroy_workqueue(laundry_wq); |
4921 | out_recovery: | 4918 | out_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 */ |
4926 | static void | 4923 | void |
4927 | nfs4_state_shutdown_net(struct net *net) | 4924 | nfs4_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) | |||
4954 | void | 4951 | void |
4955 | nfs4_state_shutdown(void) | 4952 | nfs4_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 | } |