lkml.org 
[lkml]   [2019]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.3 067/197] ocfs2: fix panic due to ocfs2_wq is null
    Date
    From: Yi Li <yilikernel@gmail.com>

    commit b918c43021baaa3648de09e19a4a3dd555a45f40 upstream.

    mount.ocfs2 failed when reading ocfs2 filesystem superblock encounters
    an error. ocfs2_initialize_super() returns before allocating ocfs2_wq.
    ocfs2_dismount_volume() triggers the following panic.

    Oct 15 16:09:27 cnwarekv-205120 kernel: On-disk corruption discovered.Please run fsck.ocfs2 once the filesystem is unmounted.
    Oct 15 16:09:27 cnwarekv-205120 kernel: (mount.ocfs2,22804,44): ocfs2_read_locked_inode:537 ERROR: status = -30
    Oct 15 16:09:27 cnwarekv-205120 kernel: (mount.ocfs2,22804,44): ocfs2_init_global_system_inodes:458 ERROR: status = -30
    Oct 15 16:09:27 cnwarekv-205120 kernel: (mount.ocfs2,22804,44): ocfs2_init_global_system_inodes:491 ERROR: status = -30
    Oct 15 16:09:27 cnwarekv-205120 kernel: (mount.ocfs2,22804,44): ocfs2_initialize_super:2313 ERROR: status = -30
    Oct 15 16:09:27 cnwarekv-205120 kernel: (mount.ocfs2,22804,44): ocfs2_fill_super:1033 ERROR: status = -30
    ------------[ cut here ]------------
    Oops: 0002 [#1] SMP NOPTI
    CPU: 1 PID: 11753 Comm: mount.ocfs2 Tainted: G E
    4.14.148-200.ckv.x86_64 #1
    Hardware name: Sugon H320-G30/35N16-US, BIOS 0SSDX017 12/21/2018
    task: ffff967af0520000 task.stack: ffffa5f05484000
    RIP: 0010:mutex_lock+0x19/0x20
    Call Trace:
    flush_workqueue+0x81/0x460
    ocfs2_shutdown_local_alloc+0x47/0x440 [ocfs2]
    ocfs2_dismount_volume+0x84/0x400 [ocfs2]
    ocfs2_fill_super+0xa4/0x1270 [ocfs2]
    ? ocfs2_initialize_super.isa.211+0xf20/0xf20 [ocfs2]
    mount_bdev+0x17f/0x1c0
    mount_fs+0x3a/0x160

    Link: http://lkml.kernel.org/r/1571139611-24107-1-git-send-email-yili@winhong.com
    Signed-off-by: Yi Li <yilikernel@gmail.com>
    Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Cc: Mark Fasheh <mark@fasheh.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Junxiao Bi <junxiao.bi@oracle.com>
    Cc: Changwei Ge <gechangwei@live.cn>
    Cc: Gang He <ghe@suse.com>
    Cc: Jun Piao <piaojun@huawei.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/ocfs2/journal.c | 3 ++-
    fs/ocfs2/localalloc.c | 3 ++-
    2 files changed, 4 insertions(+), 2 deletions(-)

    --- a/fs/ocfs2/journal.c
    +++ b/fs/ocfs2/journal.c
    @@ -217,7 +217,8 @@ void ocfs2_recovery_exit(struct ocfs2_su
    /* At this point, we know that no more recovery threads can be
    * launched, so wait for any recovery completion work to
    * complete. */
    - flush_workqueue(osb->ocfs2_wq);
    + if (osb->ocfs2_wq)
    + flush_workqueue(osb->ocfs2_wq);

    /*
    * Now that recovery is shut down, and the osb is about to be
    --- a/fs/ocfs2/localalloc.c
    +++ b/fs/ocfs2/localalloc.c
    @@ -377,7 +377,8 @@ void ocfs2_shutdown_local_alloc(struct o
    struct ocfs2_dinode *alloc = NULL;

    cancel_delayed_work(&osb->la_enable_wq);
    - flush_workqueue(osb->ocfs2_wq);
    + if (osb->ocfs2_wq)
    + flush_workqueue(osb->ocfs2_wq);

    if (osb->local_alloc_state == OCFS2_LA_UNUSED)
    goto out;

    \
     
     \ /
      Last update: 2019-10-27 22:30    [W:4.030 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site