Re: [PATCH AUTOSEL 6.12 10/19] btrfs: make extent_range_clear_dirty_for_io() to handle sector size < page size cases
From: David Sterba
Date: Mon Nov 25 2024 - 10:21:54 EST
On Sun, Nov 24, 2024 at 07:38:45AM -0500, Sasha Levin wrote:
> From: Qu Wenruo <wqu@xxxxxxxx>
>
> [ Upstream commit a4ef54dbb576032ba31a646a5ffc8a26a83cb92c ]
>
> For btrfs with sector size < page size (e.g. 4K sector size, 64K page
> size), and enable the sector perfect compression support, then the
> following dirty range can lead to problems:
>
> 0 32K 64K 96K 128K
> | |///////||//////| |/|
> 124K
>
> In above case, if we start writeback for that inode, the last dirty
> range [124K, 128K) will not be submitted and cause reserved space
> leakage:
>
> - Start writeback for page 0
> We find the range [32K, 96K) is suitable for compression, and queue it
> into a workqueue to do the delayed compression and submission.
>
> - Compression happens for range [32K, 96K)
> Function extent_range_clear_dirty_for_io() is called, however it is
> only doing full page handling, not considering any the extra bitmaps
> for subpage cases.
>
> That function will clear page dirty for both page 0 and page 64K.
>
> - Writeback for the inode is done
> Because page 64K has its dirty flag cleared, it will not be considered
> as a writeback target.
>
> This means the range [124K, 128K) will not be submitted, and reserved
> space for it will be leaked.
>
> Fix this problem by using the subpage helper to clear the dirty flag.
>
> Signed-off-by: Qu Wenruo <wqu@xxxxxxxx>
> Signed-off-by: David Sterba <dsterba@xxxxxxxx>
> Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>
Please drop this patch from stable, it's preparatory work and has
otherwise no effect.