| From 7b0b1332cfdb94489836b67d088a779699f8e47e Mon Sep 17 00:00:00 2001 |
| From: Joseph Qi <joseph.qi@linux.alibaba.com> |
| Date: Wed, 16 Mar 2022 16:15:09 -0700 |
| Subject: ocfs2: fix crash when initialize filecheck kobj fails |
| |
| 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 |