lkml.org 
[lkml]   [2015]   [Sep]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.4 052/146] nfsd: fix nsfd startup race triggering BUG_ON
    Date
    From: Giuseppe Cantavenera <giuseppe.cantavenera.ext@nokia.com>

    3.4.109-rc1 review patch. If anyone has any objections, please let me know.

    ------------------


    commit bb7ffbf29e76b89a86ca4c3ee0d4690641f2f772 upstream.

    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: [<ffffffffc00bc5e4>] rpc_pipefs_event+0x7c/0x158 [nfsd]
    kernel: [<ffffffff8017a2a0>] notifier_call_chain+0x70/0xb8
    kernel: [<ffffffff8017a4e4>] __blocking_notifier_call_chain+0x4c/0x70
    kernel: [<ffffffff8053aff8>] rpc_fill_super+0xf8/0x1a0
    kernel: [<ffffffff8022204c>] mount_ns+0xb4/0xf0
    kernel: [<ffffffff80222b48>] mount_fs+0x50/0x1f8
    kernel: [<ffffffff8023dc00>] vfs_kern_mount+0x58/0xf0
    kernel: [<ffffffff802404ac>] do_mount+0x27c/0xa28
    kernel: [<ffffffff80240cf0>] SyS_mount+0x98/0xe8
    kernel: [<ffffffff80135d24>] 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 <giuseppe.cantavenera.ext@nokia.com>
    Signed-off-by: Lorenzo Restelli <lorenzo.restelli.ext@nokia.com>
    Reviewed-by: Kinlong Mee <kinglongmee@gmail.com>
    Signed-off-by: J. Bruce Fields <bfields@redhat.com>
    [lizf: Backported to 3.4: adjust context]
    Signed-off-by: Zefan Li <lizefan@huawei.com>
    ---
    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 4db777d..c8bc7ea 100644
    --- a/fs/nfsd/nfsctl.c
    +++ b/fs/nfsd/nfsctl.c
    @@ -1163,15 +1163,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)
    @@ -1209,10 +1209,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;
    }

    @@ -1228,8 +1228,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 <okir@monad.swb.de>");
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-09-15 11:21    [W:4.599 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site