lkml.org 
[lkml]   [2022]   [Mar]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 46/57] ocfs2: fix crash when initialize filecheck kobj fails
    Date
    From: Joseph Qi <joseph.qi@linux.alibaba.com>

    commit 7b0b1332cfdb94489836b67d088a779699f8e47e upstream.

    Once s_root is set, genric_shutdown_super() will be called if
    fill_super() fails. That means, we will call ocfs2_dismount_volume()
    twice in such case, which can lead to kernel crash.

    Fix this issue by initializing filecheck kobj before setting s_root.

    Link: https://lkml.kernel.org/r/20220310081930.86305-1-joseph.qi@linux.alibaba.com
    Fixes: 5f483c4abb50 ("ocfs2: add kobject for online file check")
    Signed-off-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/super.c | 22 +++++++++++-----------
    1 file changed, 11 insertions(+), 11 deletions(-)

    --- a/fs/ocfs2/super.c
    +++ b/fs/ocfs2/super.c
    @@ -1150,17 +1150,6 @@ static int ocfs2_fill_super(struct super
    goto read_super_error;
    }

    - root = d_make_root(inode);
    - if (!root) {
    - status = -ENOMEM;
    - mlog_errno(status);
    - goto read_super_error;
    - }
    -
    - sb->s_root = root;
    -
    - ocfs2_complete_mount_recovery(osb);
    -
    osb->osb_dev_kset = kset_create_and_add(sb->s_id, NULL,
    &ocfs2_kset->kobj);
    if (!osb->osb_dev_kset) {
    @@ -1178,6 +1167,17 @@ static int ocfs2_fill_super(struct super
    goto read_super_error;
    }

    + root = d_make_root(inode);
    + if (!root) {
    + status = -ENOMEM;
    + mlog_errno(status);
    + goto read_super_error;
    + }
    +
    + sb->s_root = root;
    +
    + ocfs2_complete_mount_recovery(osb);
    +
    if (ocfs2_mount_local(osb))
    snprintf(nodestr, sizeof(nodestr), "local");
    else

    \
     
     \ /
      Last update: 2022-03-21 15:01    [W:6.326 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site