This patch resolves kernel panic for xfstests/081, caused by recent f2fs_bug_on
f2fs: add f2fs_bug_on in __remove_discard_cmd For fixing, we will stop discard thread in prior in put_super, in order to avoid racing in between referrer and releaser. Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org> Signed-off-by: Chao Yu <yuch...@huawei.com> --- fs/f2fs/segment.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 9a44aca8d2c5..8e4b70b4174d 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -1063,9 +1063,22 @@ void f2fs_wait_discard_bio(struct f2fs_sb_info *sbi, block_t blkaddr) __wait_one_discard_bio(sbi, dc); } +static void stop_discard_thread(struct f2fs_sb_info *sbi) +{ + struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; + + if (dcc->f2fs_issue_discard) { + struct task_struct *discard_thread = dcc->f2fs_issue_discard; + + dcc->f2fs_issue_discard = NULL; + kthread_stop(discard_thread); + } +} + /* This comes from f2fs_put_super */ void f2fs_wait_discard_bios(struct f2fs_sb_info *sbi) { + stop_discard_thread(sbi); __issue_discard_cmd(sbi, false); __wait_discard_cmd(sbi, false); } @@ -1420,12 +1433,7 @@ static void destroy_discard_cmd_control(struct f2fs_sb_info *sbi) if (!dcc) return; - if (dcc->f2fs_issue_discard) { - struct task_struct *discard_thread = dcc->f2fs_issue_discard; - - dcc->f2fs_issue_discard = NULL; - kthread_stop(discard_thread); - } + stop_discard_thread(sbi); kfree(dcc); SM_I(sbi)->dcc_info = NULL; -- 2.13.1.388.g69e6b9b4f4a9