Return-Path: Received: from fieldses.org ([173.255.197.46]:36590 "EHLO fieldses.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751052AbbDQVWi (ORCPT ); Fri, 17 Apr 2015 17:22:38 -0400 Date: Fri, 17 Apr 2015 17:22:36 -0400 From: "J. Bruce Fields" To: Kinglong Mee Cc: Giuseppe Cantavenera , linux-nfs@vger.kernel.org, alexander.sverdlin@nokia.com, Lorenzo Restelli Subject: Re: [PATCH] nfsd: fix: prevent BUG_ON registering rpc_pipefs_event for notifications only after nfsd_net_id is valid Message-ID: <20150417212236.GA28426@fieldses.org> References: <1429266331-2408-1-git-send-email-giuseppe.cantavenera.ext@nokia.com> <553113AD.6030702@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii In-Reply-To: <553113AD.6030702@gmail.com> Sender: linux-nfs-owner@vger.kernel.org List-ID: On Fri, Apr 17, 2015 at 10:07:41PM +0800, Kinglong Mee wrote: > 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 Thanks, applying.--b. > > > --- > > 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 "); > >