OSDN Git Service

nfsd: move reply cache initialization into nfsd startup
authorJeff Layton <jlayton@kernel.org>
Wed, 11 Jan 2023 16:19:59 +0000 (11:19 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 20 Feb 2023 14:20:32 +0000 (09:20 -0500)
There's no need to start the reply cache before nfsd is up and running,
and doing so means that we register a shrinker for every net namespace
instead of just the ones where nfsd is running.

Move it to the per-net nfsd startup instead.

Reported-by: Dai Ngo <dai.ngo@oracle.com>
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfsctl.c
fs/nfsd/nfssvc.c

index c2577ee..f2a0d6a 100644 (file)
@@ -1458,16 +1458,11 @@ static __net_init int nfsd_init_net(struct net *net)
        nn->nfsd_versions = NULL;
        nn->nfsd4_minorversions = NULL;
        nfsd4_init_leases_net(nn);
-       retval = nfsd_reply_cache_init(nn);
-       if (retval)
-               goto out_cache_error;
        get_random_bytes(&nn->siphash_key, sizeof(nn->siphash_key));
        seqlock_init(&nn->writeverf_lock);
 
        return 0;
 
-out_cache_error:
-       nfsd_idmap_shutdown(net);
 out_idmap_error:
        nfsd_export_shutdown(net);
 out_export_error:
@@ -1476,9 +1471,6 @@ out_export_error:
 
 static __net_exit void nfsd_exit_net(struct net *net)
 {
-       struct nfsd_net *nn = net_generic(net, nfsd_net_id);
-
-       nfsd_reply_cache_shutdown(nn);
        nfsd_idmap_shutdown(net);
        nfsd_export_shutdown(net);
        nfsd_netns_free_versions(net_generic(net, nfsd_net_id));
index ff10c46..fe5e4f7 100644 (file)
@@ -427,16 +427,23 @@ static int nfsd_startup_net(struct net *net, const struct cred *cred)
        ret = nfsd_file_cache_start_net(net);
        if (ret)
                goto out_lockd;
-       ret = nfs4_state_start_net(net);
+
+       ret = nfsd_reply_cache_init(nn);
        if (ret)
                goto out_filecache;
 
+       ret = nfs4_state_start_net(net);
+       if (ret)
+               goto out_reply_cache;
+
 #ifdef CONFIG_NFSD_V4_2_INTER_SSC
        nfsd4_ssc_init_umount_work(nn);
 #endif
        nn->nfsd_net_up = true;
        return 0;
 
+out_reply_cache:
+       nfsd_reply_cache_shutdown(nn);
 out_filecache:
        nfsd_file_cache_shutdown_net(net);
 out_lockd:
@@ -454,6 +461,7 @@ static void nfsd_shutdown_net(struct net *net)
        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 
        nfs4_state_shutdown_net(net);
+       nfsd_reply_cache_shutdown(nn);
        nfsd_file_cache_shutdown_net(net);
        if (nn->lockd_up) {
                lockd_down(net);