Patch "fs/writeback: bail out if there is no more inodes for IO and queued once" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    fs/writeback: bail out if there is no more inodes for IO and queued once

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     fs-writeback-bail-out-if-there-is-no-more-inodes-for.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 365b0c69497624f734dfd2ccf7e49b431749f33c
Author: Kemeng Shi <shikemeng@xxxxxxxxxxxxxxx>
Date:   Wed Feb 28 17:19:54 2024 +0800

    fs/writeback: bail out if there is no more inodes for IO and queued once
    
    [ Upstream commit d92109891f21cf367caa2cc6dff11a4411d917f4 ]
    
    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@xxxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20240228091958.288260-3-shikemeng@xxxxxxxxxxxxxxx
    Reviewed-by: Jan Kara <jack@xxxxxxx>
    [brauner@xxxxxxxxxx: 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@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
index 1767493dffda7..0a498bc60f557 100644
--- a/fs/fs-writeback.c
+++ b/fs/fs-writeback.c
@@ -2044,6 +2044,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);
 	for (;;) {
@@ -2086,8 +2087,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
@@ -2102,7 +2105,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) {
 			spin_unlock(&wb->list_lock);
 			continue;
 		}




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux