ext4: make the writeback path support large folios
authorZhang Yi <yi.zhang@huawei.com>
Mon, 12 May 2025 06:33:17 +0000 (14:33 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 20 May 2025 14:31:12 +0000 (10:31 -0400)
In mpage_map_and_submit_buffers(), the 'lblk' is now aligned to
PAGE_SIZE. Convert it to be aligned to folio size. Additionally, modify
the wbc->nr_to_write update to reduce the number of pages in a single
folio, ensuring that the entire writeback path can support large folios.

Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
Link: https://patch.msgid.link/20250512063319.3539411-7-yi.zhang@huaweicloud.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/inode.c

index 18651f39a80bb514f890a2724c2ce5cbe9d775f9..ed88e5844f46cb758a2fa17d00317aa4d17ddf93 100644 (file)
@@ -1983,7 +1983,7 @@ static int mpage_submit_folio(struct mpage_da_data *mpd, struct folio *folio)
                len = size & (len - 1);
        err = ext4_bio_write_folio(&mpd->io_submit, folio, len);
        if (!err)
-               mpd->wbc->nr_to_write--;
+               mpd->wbc->nr_to_write -= folio_nr_pages(folio);
 
        return err;
 }
@@ -2206,7 +2206,6 @@ static int mpage_map_and_submit_buffers(struct mpage_da_data *mpd)
 
        start = mpd->map.m_lblk >> bpp_bits;
        end = (mpd->map.m_lblk + mpd->map.m_len - 1) >> bpp_bits;
-       lblk = start << bpp_bits;
        pblock = mpd->map.m_pblk;
 
        folio_batch_init(&fbatch);
@@ -2217,6 +2216,7 @@ static int mpage_map_and_submit_buffers(struct mpage_da_data *mpd)
                for (i = 0; i < nr; i++) {
                        struct folio *folio = fbatch.folios[i];
 
+                       lblk = folio->index << bpp_bits;
                        err = mpage_process_folio(mpd, folio, &lblk, &pblock,
                                                 &map_bh);
                        /*
@@ -2442,7 +2442,7 @@ static int mpage_journal_page_buffers(handle_t *handle,
        size_t len = folio_size(folio);
 
        folio_clear_checked(folio);
-       mpd->wbc->nr_to_write--;
+       mpd->wbc->nr_to_write -= folio_nr_pages(folio);
 
        if (folio_pos(folio) + len > size &&
            !ext4_verity_in_progress(inode))