Re: [PATCH] nfsd: register pernet ops last, unregister first

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Bruce-


> On Feb 3, 2021, at 11:42 AM, J. Bruce Fields <bfields@xxxxxxxxxxxx> wrote:
> 
> From: "J. Bruce Fields" <bfields@xxxxxxxxxx>
> 
> 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@xxxxxxxxxx>
> Fixes: 3ba75830ce17 "nfsd4: drc containerization"
> Signed-off-by: J. Bruce Fields <bfields@xxxxxxxxxx>

I can't tell how urgent this is. Does it belong in 5.11-rc?


> ---
> fs/nfsd/nfsctl.c | 14 +++++++-------
> 1 file changed, 7 insertions(+), 7 deletions(-)
> 
> diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
> index f6d5d783f4a4..0759e589ab52 100644
> --- a/fs/nfsd/nfsctl.c
> +++ b/fs/nfsd/nfsctl.c
> @@ -1522,12 +1522,9 @@ static int __init init_nfsd(void)
> 	int retval;
> 	printk(KERN_INFO "Installing knfsd (copyright (C) 1996 okir@xxxxxxxxxxxx).\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 @@ static int __init init_nfsd(void)
> 	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@xxxxxxxxxxxx>");
> -- 
> 2.29.2
> 

--
Chuck Lever







[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux