]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
mpage: Use writeback_iter() instead of write_cache_pages() writepage
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 14 Mar 2025 04:33:29 +0000 (00:33 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 17 Mar 2025 22:27:26 +0000 (18:27 -0400)
Using the iterator directly adds a little type safety, converts
an indirect call into a direct call and may allow the compiler
to inline __mpage_writepage() into mpage_writepages().

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
fs/mpage.c

index ad7844de87c3045f758f1560ccc0b526d4b9fa23..0f138b2dfae369fa4579a37a19bd267f080293f7 100644 (file)
@@ -445,12 +445,11 @@ static void clean_buffers(struct folio *folio, unsigned first_unmapped)
                try_to_free_buffers(folio);
 }
 
-static int __mpage_writepage(struct folio *folio, struct writeback_control *wbc,
-                     void *data)
+static int __mpage_writepage(struct address_space *mapping,
+               struct writeback_control *wbc, struct folio *folio,
+               struct mpage_data *mpd)
 {
-       struct mpage_data *mpd = data;
        struct bio *bio = mpd->bio;
-       struct address_space *mapping = folio->mapping;
        struct inode *inode = mapping->host;
        const unsigned blkbits = inode->i_blkbits;
        const unsigned blocks_per_folio = folio_size(folio) >> blkbits;
@@ -649,21 +648,22 @@ out:
  * This is a library function, which implements the writepages()
  * address_space_operation.
  */
-int
-mpage_writepages(struct address_space *mapping,
+int mpage_writepages(struct address_space *mapping,
                struct writeback_control *wbc, get_block_t get_block)
 {
        struct mpage_data mpd = {
                .get_block      = get_block,
        };
        struct blk_plug plug;
-       int ret;
+       struct folio *folio = NULL;
+       int err;
 
        blk_start_plug(&plug);
-       ret = write_cache_pages(mapping, wbc, __mpage_writepage, &mpd);
+       while ((folio = writeback_iter(mapping, wbc, folio, &err)))
+               err = __mpage_writepage(mapping, wbc, folio, &mpd);
        if (mpd.bio)
                mpage_bio_submit_write(mpd.bio);
        blk_finish_plug(&plug);
-       return ret;
+       return err;
 }
 EXPORT_SYMBOL(mpage_writepages);