]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ext4: correct the reserved credits for extent conversion
authorZhang Yi <yi.zhang@huawei.com>
Mon, 7 Jul 2025 14:08:10 +0000 (22:08 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 23 Aug 2025 14:49:41 +0000 (16:49 +0200)
commit 95ad8ee45cdbc321c135a2db895d48b374ef0f87 upstream.

Now, we reserve journal credits for converting extents in only one page
to written state when the I/O operation is complete. This is
insufficient when large folio is enabled.

Fix this by reserving credits for converting up to one extent per block in
the largest 2MB folio, this calculation should only involve extents index
and leaf blocks, so it should not estimate too many credits.

Fixes: 7ac67301e82f ("ext4: enable large folio for regular file")
Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Baokun Li <libaokun1@huawei.com>
Link: https://patch.msgid.link/20250707140814.542883-8-yi.zhang@huaweicloud.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/ext4/inode.c

index 04491a7a967b515ab3bfbf259f27569cbecb6812..57bdaf6c1edd9aa81b2f178032fa3029a085fcc4 100644 (file)
@@ -2850,12 +2850,12 @@ static int ext4_do_writepages(struct mpage_da_data *mpd)
        mpd->journalled_more_data = 0;
 
        if (ext4_should_dioread_nolock(inode)) {
+               int bpf = ext4_journal_blocks_per_folio(inode);
                /*
                 * We may need to convert up to one extent per block in
-                * the page and we may dirty the inode.
+                * the folio and we may dirty the inode.
                 */
-               rsv_blocks = 1 + ext4_chunk_trans_blocks(inode,
-                                               PAGE_SIZE >> inode->i_blkbits);
+               rsv_blocks = 1 + ext4_ext_index_trans_blocks(inode, bpf);
        }
 
        if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)