writeback: remove a use of write_cache_pages() from do_writepages()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 15 Feb 2024 06:36:49 +0000 (07:36 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 24 Feb 2024 01:48:38 +0000 (17:48 -0800)
Use the new writeback_iter() directly instead of indirecting through a
callback.

[hch@lst.de: ported to the while based iter style]
Link: https://lkml.kernel.org/r/20240215063649.2164017-15-hch@lst.de
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Cc: Christian Brauner <brauner@kernel.org>
Cc: Dave Chinner <dchinner@redhat.com>
Cc: David Howells <dhowells@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/page-writeback.c

index 3da4345f08a335bef3996f8916375d68490e6bb7..3e19b87049db1742dc12c0ce2d246f68e026d012 100644 (file)
@@ -2577,15 +2577,25 @@ int write_cache_pages(struct address_space *mapping,
 }
 EXPORT_SYMBOL(write_cache_pages);
 
-static int writepage_cb(struct folio *folio, struct writeback_control *wbc,
-               void *data)
+static int writeback_use_writepage(struct address_space *mapping,
+               struct writeback_control *wbc)
 {
-       struct address_space *mapping = data;
-       int ret = mapping->a_ops->writepage(&folio->page, wbc);
+       struct folio *folio = NULL;
+       struct blk_plug plug;
+       int err;
 
-       if (ret < 0)
-               mapping_set_error(mapping, ret);
-       return ret;
+       blk_start_plug(&plug);
+       while ((folio = writeback_iter(mapping, wbc, folio, &err))) {
+               err = mapping->a_ops->writepage(&folio->page, wbc);
+               if (err == AOP_WRITEPAGE_ACTIVATE) {
+                       folio_unlock(folio);
+                       err = 0;
+               }
+               mapping_set_error(mapping, err);
+       }
+       blk_finish_plug(&plug);
+
+       return err;
 }
 
 int do_writepages(struct address_space *mapping, struct writeback_control *wbc)
@@ -2601,12 +2611,7 @@ int do_writepages(struct address_space *mapping, struct writeback_control *wbc)
                if (mapping->a_ops->writepages) {
                        ret = mapping->a_ops->writepages(mapping, wbc);
                } else if (mapping->a_ops->writepage) {
-                       struct blk_plug plug;
-
-                       blk_start_plug(&plug);
-                       ret = write_cache_pages(mapping, wbc, writepage_cb,
-                                               mapping);
-                       blk_finish_plug(&plug);
+                       ret = writeback_use_writepage(mapping, wbc);
                } else {
                        /* deal with chardevs and other special files */
                        ret = 0;