[PATCH OLK-5.10] fs/writeback: bail out if there is no more inodes for IO and queued once

From: Kemeng Shi <shikemeng@huaweicloud.com> mainline inclusion from mainline-v6.10-rc1 commit d92109891f21cf367caa2cc6dff11a4411d917f4 category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/ICOONP CVE: NA Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?i... -------------------------------- For case there is no more inodes for IO in io list from last wb_writeback, We may bail out early even there is inode in dirty list should be written back. Only bail out when we queued once to avoid missing dirtied inode. This is from code reading... Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com> Link: https://lore.kernel.org/r/20240228091958.288260-3-shikemeng@huaweicloud.com Fixes: aa373cf55099 ("writeback: stop background/kupdate works from livelocking other works") Reviewed-by: Jan Kara <jack@suse.cz> [brauner@kernel.org: fold in memory corruption fix from Jan in [1]] Link: https://lore.kernel.org/r/20240405132346.bid7gibby3lxxhez@quack3 [1] Signed-off-by: Christian Brauner <brauner@kernel.org> Conflicts: fs/fs-writeback.c [The position of spin_lock() has been adjusted, which is not related to the issue that this patch aims to fix.] Signed-off-by: Zizhi Wo <wozizhi@huawei.com> --- fs/fs-writeback.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index f9371d249e51..9a3ad7b009cc 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -1868,6 +1868,7 @@ static long wb_writeback(struct bdi_writeback *wb, struct inode *inode; long progress; struct blk_plug plug; + bool queued = false; blk_start_plug(&plug); spin_lock(&wb->list_lock); @@ -1908,8 +1909,10 @@ static long wb_writeback(struct bdi_writeback *wb, dirtied_before = jiffies; trace_writeback_start(wb, work); - if (list_empty(&wb->b_io)) + if (list_empty(&wb->b_io)) { queue_io(wb, work, dirtied_before); + queued = true; + } if (work->sb) progress = writeback_sb_inodes(work->sb, wb, work); else @@ -1926,7 +1929,7 @@ static long wb_writeback(struct bdi_writeback *wb, * mean the overall work is done. So we keep looping as long * as made some progress on cleaning pages or inodes. */ - if (progress) + if (progress || !queued) continue; /* * No more inodes for IO, bail -- 2.46.1

反馈: 您发送到kernel@openeuler.org的补丁/补丁集,已成功转换为PR! PR链接地址: https://gitee.com/openeuler/kernel/pulls/17283 邮件列表地址:https://mailweb.openeuler.org/archives/list/kernel@openeuler.org/message/TTU... FeedBack: The patch(es) which you have sent to kernel@openeuler.org mailing list has been converted to a pull request successfully! Pull request link: https://gitee.com/openeuler/kernel/pulls/17283 Mailing list address: https://mailweb.openeuler.org/archives/list/kernel@openeuler.org/message/TTU...
participants (2)
-
patchwork bot
-
Zizhi Wo