]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
nfsd: register pernet ops last, unregister first
authorJ. Bruce Fields <bfields@redhat.com>
Wed, 3 Feb 2021 16:42:13 +0000 (11:42 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 15 Feb 2021 15:45:00 +0000 (10:45 -0500)
These pernet operations may depend on stuff set up or torn down in the
module init/exit functions.  And they may be called at any time in
between.  So it makes more sense for them to be the last to be
registered in the init function, and the first to be unregistered in the
exit function.

In particular, without this, the drc slab is being destroyed before all
the per-net drcs are shut down, resulting in an "Objects remaining in
nfsd_drc on __kmem_cache_shutdown()" warning in exit_nfsd.

Reported-by: Zhi Li <yieli@redhat.com>
Fixes: 3ba75830ce17 "nfsd4: drc containerization"
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfsctl.c

index f6d5d783f4a45bf0101827bc203acf0a91ac17b2..0759e589ab52bf4a240ea2b2cc678adc3ee843d5 100644 (file)
@@ -1522,12 +1522,9 @@ static int __init init_nfsd(void)
        int retval;
        printk(KERN_INFO "Installing knfsd (copyright (C) 1996 okir@monad.swb.de).\n");
 
-       retval = register_pernet_subsys(&nfsd_net_ops);
-       if (retval < 0)
-               return retval;
        retval = register_cld_notifier();
        if (retval)
-               goto out_unregister_pernet;
+               return retval;
        retval = nfsd4_init_slabs();
        if (retval)
                goto out_unregister_notifier;
@@ -1544,9 +1541,14 @@ static int __init init_nfsd(void)
                goto out_free_lockd;
        retval = register_filesystem(&nfsd_fs_type);
        if (retval)
+               goto out_free_exports;
+       retval = register_pernet_subsys(&nfsd_net_ops);
+       if (retval < 0)
                goto out_free_all;
        return 0;
 out_free_all:
+       unregister_pernet_subsys(&nfsd_net_ops);
+out_free_exports:
        remove_proc_entry("fs/nfs/exports", NULL);
        remove_proc_entry("fs/nfs", NULL);
 out_free_lockd:
@@ -1559,13 +1561,12 @@ out_free_slabs:
        nfsd4_free_slabs();
 out_unregister_notifier:
        unregister_cld_notifier();
-out_unregister_pernet:
-       unregister_pernet_subsys(&nfsd_net_ops);
        return retval;
 }
 
 static void __exit exit_nfsd(void)
 {
+       unregister_pernet_subsys(&nfsd_net_ops);
        nfsd_drc_slab_free();
        remove_proc_entry("fs/nfs/exports", NULL);
        remove_proc_entry("fs/nfs", NULL);
@@ -1575,7 +1576,6 @@ static void __exit exit_nfsd(void)
        nfsd4_exit_pnfs();
        unregister_filesystem(&nfsd_fs_type);
        unregister_cld_notifier();
-       unregister_pernet_subsys(&nfsd_net_ops);
 }
 
 MODULE_AUTHOR("Olaf Kirch <okir@monad.swb.de>");