]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
nfsd: move reply cache initialization into nfsd startup
authorJeff Layton <jlayton@kernel.org>
Thu, 5 Sep 2024 15:30:43 +0000 (11:30 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Sep 2024 09:06:44 +0000 (11:06 +0200)
[ Upstream commit f5f9d4a314da88c0a5faa6d168bf69081b7a25ae ]

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>
Stable-dep-of: ed9ab7346e90 ("nfsd: move init of percpu reply_cache_stats counters back to nfsd_init_net")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/nfsd/nfsctl.c
fs/nfsd/nfssvc.c

index f77f00c93172365c4401b98e017a4168154c3111..1c39a4e6294de08d13699ff22c9e79d2b82eccba 100644 (file)
@@ -1461,16 +1461,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:
@@ -1479,9 +1474,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 3d4fd40c987bd7a445845f22c99c4efffe94523b..a68e9904224af112d3ddfe9535ae69e716ce8d5f 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);