Patch "ext4: fix extent status tree race in writeback error recovery path" has been added to the 5.18-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

    ext4: fix extent status tree race in writeback error recovery path

to the 5.18-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:
     ext4-fix-extent-status-tree-race-in-writeback-error-.patch
and it can be found in the queue-5.18 subdirectory.

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



commit dc4a02f5902dad0bd2ac7063ad9cc82a29f579f2
Author: Eric Whitney <enwlinux@xxxxxxxxx>
Date:   Wed Jun 15 12:05:30 2022 -0400

    ext4: fix extent status tree race in writeback error recovery path
    
    [ Upstream commit 7f0d8e1d607c1a4fa9a27362a108921d82230874 ]
    
    A race can occur in the unlikely event ext4 is unable to allocate a
    physical cluster for a delayed allocation in a bigalloc file system
    during writeback.  Failure to allocate a cluster forces error recovery
    that includes a call to mpage_release_unused_pages().  That function
    removes any corresponding delayed allocated blocks from the extent
    status tree.  If a new delayed write is in progress on the same cluster
    simultaneously, resulting in the addition of an new extent containing
    one or more blocks in that cluster to the extent status tree, delayed
    block accounting can be thrown off if that delayed write then encounters
    a similar cluster allocation failure during future writeback.
    
    Write lock the i_data_sem in mpage_release_unused_pages() to fix this
    problem.  Ext4's block/cluster accounting code for bigalloc relies on
    i_data_sem for mutual exclusion, as is found in the delayed write path,
    and the locking in mpage_release_unused_pages() is missing.
    
    Cc: stable@xxxxxxxxxx
    Reported-by: Ye Bin <yebin10@xxxxxxxxxx>
    Signed-off-by: Eric Whitney <enwlinux@xxxxxxxxx>
    Link: https://lore.kernel.org/r/20220615160530.1928801-1-enwlinux@xxxxxxxxx
    Signed-off-by: Theodore Ts'o <tytso@xxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index beed9e32571c..826e2deb10f8 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -1559,7 +1559,14 @@ static void mpage_release_unused_pages(struct mpage_da_data *mpd,
 		ext4_lblk_t start, last;
 		start = index << (PAGE_SHIFT - inode->i_blkbits);
 		last = end << (PAGE_SHIFT - inode->i_blkbits);
+
+		/*
+		 * avoid racing with extent status tree scans made by
+		 * ext4_insert_delayed_block()
+		 */
+		down_write(&EXT4_I(inode)->i_data_sem);
 		ext4_es_remove_extent(inode, start, last - start + 1);
+		up_write(&EXT4_I(inode)->i_data_sem);
 	}
 
 	pagevec_init(&pvec);



[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