aboutsummaryrefslogtreecommitdiff
path: root/fs/nfsd/nfssvc.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfsd/nfssvc.c')
-rw-r--r--fs/nfsd/nfssvc.c50
1 files changed, 34 insertions, 16 deletions
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index 0e8622a4341..f9d147f6dfd 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -206,6 +206,37 @@ static int nfsd_init_socks(struct net *net)
static bool nfsd_up = false;
+static int nfsd_startup_generic(int nrservs)
+{
+ int ret;
+
+ if (nfsd_up)
+ return 0;
+
+ /*
+ * Readahead param cache - will no-op if it already exists.
+ * (Note therefore results will be suboptimal if number of
+ * threads is modified after nfsd start.)
+ */
+ ret = nfsd_racache_init(2*nrservs);
+ if (ret)
+ return ret;
+ ret = nfs4_state_start();
+ if (ret)
+ goto out_racache;
+ return 0;
+
+out_racache:
+ nfsd_racache_shutdown();
+ return ret;
+}
+
+static void nfsd_shutdown_generic(void)
+{
+ nfs4_state_shutdown();
+ nfsd_racache_shutdown();
+}
+
static int nfsd_startup_net(struct net *net)
{
struct nfsd_net *nn = net_generic(net, nfsd_net_id);
@@ -236,19 +267,9 @@ static int nfsd_startup(int nrservs, struct net *net)
{
int ret;
- if (nfsd_up)
- return 0;
- /*
- * Readahead param cache - will no-op if it already exists.
- * (Note therefore results will be suboptimal if number of
- * threads is modified after nfsd start.)
- */
- ret = nfsd_racache_init(2*nrservs);
+ ret = nfsd_startup_generic(nrservs);
if (ret)
return ret;
- ret = nfs4_state_start();
- if (ret)
- goto out_racache;
ret = nfsd_startup_net(net);
if (ret)
goto out_net;
@@ -257,9 +278,7 @@ static int nfsd_startup(int nrservs, struct net *net)
return 0;
out_net:
- nfs4_state_shutdown();
-out_racache:
- nfsd_racache_shutdown();
+ nfsd_shutdown_generic();
return ret;
}
@@ -286,8 +305,7 @@ static void nfsd_shutdown(struct net *net)
if (!nfsd_up)
return;
nfsd_shutdown_net(net);
- nfs4_state_shutdown();
- nfsd_racache_shutdown();
+ nfsd_shutdown_generic();
nfsd_up = false;
}