|
@@ -241,6 +241,11 @@ static void nfsd_shutdown_generic(void)
|
|
|
nfsd_racache_shutdown();
|
|
|
}
|
|
|
|
|
|
+static bool nfsd_needs_lockd(void)
|
|
|
+{
|
|
|
+ return (nfsd_versions[2] != NULL) || (nfsd_versions[3] != NULL);
|
|
|
+}
|
|
|
+
|
|
|
static int nfsd_startup_net(int nrservs, struct net *net)
|
|
|
{
|
|
|
struct nfsd_net *nn = net_generic(net, nfsd_net_id);
|
|
@@ -255,9 +260,14 @@ static int nfsd_startup_net(int nrservs, struct net *net)
|
|
|
ret = nfsd_init_socks(net);
|
|
|
if (ret)
|
|
|
goto out_socks;
|
|
|
- ret = lockd_up(net);
|
|
|
- if (ret)
|
|
|
- goto out_socks;
|
|
|
+
|
|
|
+ if (nfsd_needs_lockd() && !nn->lockd_up) {
|
|
|
+ ret = lockd_up(net);
|
|
|
+ if (ret)
|
|
|
+ goto out_socks;
|
|
|
+ nn->lockd_up = 1;
|
|
|
+ }
|
|
|
+
|
|
|
ret = nfs4_state_start_net(net);
|
|
|
if (ret)
|
|
|
goto out_lockd;
|
|
@@ -266,7 +276,10 @@ static int nfsd_startup_net(int nrservs, struct net *net)
|
|
|
return 0;
|
|
|
|
|
|
out_lockd:
|
|
|
- lockd_down(net);
|
|
|
+ if (nn->lockd_up) {
|
|
|
+ lockd_down(net);
|
|
|
+ nn->lockd_up = 0;
|
|
|
+ }
|
|
|
out_socks:
|
|
|
nfsd_shutdown_generic();
|
|
|
return ret;
|
|
@@ -277,7 +290,10 @@ static void nfsd_shutdown_net(struct net *net)
|
|
|
struct nfsd_net *nn = net_generic(net, nfsd_net_id);
|
|
|
|
|
|
nfs4_state_shutdown_net(net);
|
|
|
- lockd_down(net);
|
|
|
+ if (nn->lockd_up) {
|
|
|
+ lockd_down(net);
|
|
|
+ nn->lockd_up = 0;
|
|
|
+ }
|
|
|
nn->nfsd_net_up = false;
|
|
|
nfsd_shutdown_generic();
|
|
|
}
|