diff options
author | Yi Li <yilikernel@gmail.com> | 2019-10-18 23:20:08 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-10-19 06:32:32 -0400 |
commit | b918c43021baaa3648de09e19a4a3dd555a45f40 (patch) | |
tree | 1e4b594aca8299d78aacca5f8d7ea21ab67bd00f /fs/ocfs2 | |
parent | f231fe4235e22e18d847e05cbe705deaca56580a (diff) |
ocfs2: fix panic due to ocfs2_wq is null
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>
Diffstat (limited to 'fs/ocfs2')
-rw-r--r-- | fs/ocfs2/journal.c | 3 | ||||
-rw-r--r-- | fs/ocfs2/localalloc.c | 3 |
2 files changed, 4 insertions, 2 deletions
diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c index 930e3d388579..699a560efbb0 100644 --- a/fs/ocfs2/journal.c +++ b/fs/ocfs2/journal.c | |||
@@ -217,7 +217,8 @@ void ocfs2_recovery_exit(struct ocfs2_super *osb) | |||
217 | /* At this point, we know that no more recovery threads can be | 217 | /* At this point, we know that no more recovery threads can be |
218 | * launched, so wait for any recovery completion work to | 218 | * launched, so wait for any recovery completion work to |
219 | * complete. */ | 219 | * complete. */ |
220 | flush_workqueue(osb->ocfs2_wq); | 220 | if (osb->ocfs2_wq) |
221 | flush_workqueue(osb->ocfs2_wq); | ||
221 | 222 | ||
222 | /* | 223 | /* |
223 | * Now that recovery is shut down, and the osb is about to be | 224 | * Now that recovery is shut down, and the osb is about to be |
diff --git a/fs/ocfs2/localalloc.c b/fs/ocfs2/localalloc.c index 158e5af767fd..720e9f94957e 100644 --- a/fs/ocfs2/localalloc.c +++ b/fs/ocfs2/localalloc.c | |||
@@ -377,7 +377,8 @@ void ocfs2_shutdown_local_alloc(struct ocfs2_super *osb) | |||
377 | struct ocfs2_dinode *alloc = NULL; | 377 | struct ocfs2_dinode *alloc = NULL; |
378 | 378 | ||
379 | cancel_delayed_work(&osb->la_enable_wq); | 379 | cancel_delayed_work(&osb->la_enable_wq); |
380 | flush_workqueue(osb->ocfs2_wq); | 380 | if (osb->ocfs2_wq) |
381 | flush_workqueue(osb->ocfs2_wq); | ||
381 | 382 | ||
382 | if (osb->local_alloc_state == OCFS2_LA_UNUSED) | 383 | if (osb->local_alloc_state == OCFS2_LA_UNUSED) |
383 | goto out; | 384 | goto out; |