Return-Path: Received: from mail-pd0-f169.google.com ([209.85.192.169]:36091 "EHLO mail-pd0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932459AbbDQOHs (ORCPT ); Fri, 17 Apr 2015 10:07:48 -0400 Received: by pdea3 with SMTP id a3so129336346pde.3 for ; Fri, 17 Apr 2015 07:07:48 -0700 (PDT) Message-ID: <553113AD.6030702@gmail.com> Date: Fri, 17 Apr 2015 22:07:41 +0800 From: Kinglong Mee MIME-Version: 1.0 To: Giuseppe Cantavenera , linux-nfs@vger.kernel.org CC: alexander.sverdlin@nokia.com, bfields@fieldses.org, Lorenzo Restelli Subject: Re: [PATCH] nfsd: fix: prevent BUG_ON registering rpc_pipefs_event for notifications only after nfsd_net_id is valid References: <1429266331-2408-1-git-send-email-giuseppe.cantavenera.ext@nokia.com> In-Reply-To: <1429266331-2408-1-git-send-email-giuseppe.cantavenera.ext@nokia.com> Content-Type: text/plain; charset=windows-1252 Sender: linux-nfs-owner@vger.kernel.org List-ID: On 4/17/2015 6:25 PM, Giuseppe Cantavenera wrote: > nfsd triggered a BUG_ON in net_generic(...) when rpc_pipefs_event(...) > in fs/nfsd/nfs4recover.c was called before assigning ntfsd_net_id. > The following was observed on a MIPS 32-core processor: > kernel: Call Trace: > kernel: [] rpc_pipefs_event+0x7c/0x158 [nfsd] > kernel: [] notifier_call_chain+0x70/0xb8 > kernel: [] __blocking_notifier_call_chain+0x4c/0x70 > kernel: [] rpc_fill_super+0xf8/0x1a0 > kernel: [] mount_ns+0xb4/0xf0 > kernel: [] mount_fs+0x50/0x1f8 > kernel: [] vfs_kern_mount+0x58/0xf0 > kernel: [] do_mount+0x27c/0xa28 > kernel: [] SyS_mount+0x98/0xe8 > kernel: [] handle_sys64+0x44/0x68 > kernel: > kernel: > Code: 0040f809 00000000 2e020001 <00020336> 3c12c00d 3c02801a de100000 6442eb98 0040f809 > kernel: ---[ end trace 7471374335809536 ]--- > > Fixed this behaviour by calling register_pernet_subsys(&nfsd_net_ops) before > registering rpc_pipefs_event(...) with the notifier chain. > > Signed-off-by: Giuseppe Cantavenera > Signed-off-by: Lorenzo Restelli Make sense, Reviewed-by: Kinglong Mee > --- > fs/nfsd/nfsctl.c | 16 ++++++++-------- > 1 file changed, 8 insertions(+), 8 deletions(-) > > diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c > index f34d9de..3ee92a4 100644 > --- a/fs/nfsd/nfsctl.c > +++ b/fs/nfsd/nfsctl.c > @@ -1170,15 +1170,15 @@ static int __init init_nfsd(void) > int retval; > printk(KERN_INFO "Installing knfsd (copyright (C) 1996 okir@monad.swb.de).\n"); > > - retval = register_cld_notifier(); > - if (retval) > - return retval; > retval = register_pernet_subsys(&nfsd_net_ops); > if (retval < 0) > - goto out_unregister_notifier; > - retval = nfsd4_init_slabs(); > + return retval; > + retval = register_cld_notifier(); > if (retval) > goto out_unregister_pernet; > + retval = nfsd4_init_slabs(); > + if (retval) > + goto out_unregister_notifier; > nfs4_state_init(); > retval = nfsd_fault_inject_init(); /* nfsd fault injection controls */ > if (retval) > @@ -1206,10 +1206,10 @@ out_free_stat: > nfsd_fault_inject_cleanup(); > out_free_slabs: > nfsd4_free_slabs(); > -out_unregister_pernet: > - unregister_pernet_subsys(&nfsd_net_ops); > out_unregister_notifier: > unregister_cld_notifier(); > +out_unregister_pernet: > + unregister_pernet_subsys(&nfsd_net_ops); > return retval; > } > > @@ -1223,8 +1223,8 @@ static void __exit exit_nfsd(void) > nfsd4_free_slabs(); > nfsd_fault_inject_cleanup(); > unregister_filesystem(&nfsd_fs_type); > - unregister_pernet_subsys(&nfsd_net_ops); > unregister_cld_notifier(); > + unregister_pernet_subsys(&nfsd_net_ops); > } > > MODULE_AUTHOR("Olaf Kirch "); >