]> www.infradead.org Git - users/hch/misc.git/commitdiff
mm,btrfs: add a filemap_flush_nr helper
authorChristoph Hellwig <hch@lst.de>
Mon, 6 Oct 2025 08:36:36 +0000 (10:36 +0200)
committerChristoph Hellwig <hch@lst.de>
Thu, 23 Oct 2025 06:54:11 +0000 (08:54 +0200)
Abstract out the btrfs-specific behavior of kicking off I/O on a number
of pages on an address_space into a well-defined helper.

Note: there is no kerneldoc comment for the new function because it is
not part of the public API.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
fs/btrfs/inode.c
include/linux/pagemap.h
mm/filemap.c

index b97d6c1f77727281b818cb46e4128c7be97b5ca1..d12b8116addea02f10363df9a82de0a848b42b33 100644 (file)
@@ -8752,19 +8752,10 @@ static int start_delalloc_inodes(struct btrfs_root *root, long *nr_to_write,
                        btrfs_queue_work(root->fs_info->flush_workers,
                                         &work->work);
                } else {
-                       struct writeback_control wbc = {
-                               .nr_to_write = *nr_to_write,
-                               .sync_mode = WB_SYNC_NONE,
-                               .range_start = 0,
-                               .range_end = LLONG_MAX,
-                       };
-
-                       ret = filemap_fdatawrite_wbc(tmp_inode->i_mapping,
-                                       &wbc);
+                       ret = filemap_flush_nr(tmp_inode->i_mapping,
+                                       nr_to_write);
                        btrfs_add_delayed_iput(inode);
 
-                       if (*nr_to_write != LONG_MAX)
-                               *nr_to_write = wbc.nr_to_write;
                        if (ret || *nr_to_write <= 0)
                                goto out;
                }
index 09b581c1d878d3b59aa7018ca0c3e82b3c774f7c..cebdf160d3ddffc688f97f1f95a22f1acd3862e1 100644 (file)
@@ -38,6 +38,7 @@ int filemap_invalidate_pages(struct address_space *mapping,
 int write_inode_now(struct inode *, int sync);
 int filemap_fdatawrite(struct address_space *);
 int filemap_flush(struct address_space *);
+int filemap_flush_nr(struct address_space *mapping, long *nr_to_write);
 int filemap_fdatawait_keep_errors(struct address_space *mapping);
 int filemap_fdatawait_range(struct address_space *, loff_t lstart, loff_t lend);
 int filemap_fdatawait_range_keep_errors(struct address_space *mapping,
index 99d6919af60da09bc5e026be6378047cd7c4c857..e344b79a012d645d19ed19385e07636762f659ec 100644 (file)
@@ -474,6 +474,28 @@ int filemap_flush(struct address_space *mapping)
 }
 EXPORT_SYMBOL(filemap_flush);
 
+/*
+ * Start writeback on @nr_to_write pages from @mapping.  No one but the existing
+ * btrfs caller should be using this.  Talk to linux-mm if you think adding a
+ * new caller is a good idea.
+ */
+int filemap_flush_nr(struct address_space *mapping, long *nr_to_write)
+{
+       struct writeback_control wbc = {
+               .nr_to_write = *nr_to_write,
+               .sync_mode = WB_SYNC_NONE,
+               .range_start = 0,
+               .range_end = LLONG_MAX,
+       };
+       int ret;
+
+       ret = filemap_fdatawrite_wbc(mapping, &wbc);
+       if (!ret)
+               *nr_to_write = wbc.nr_to_write;
+       return ret;
+}
+EXPORT_SYMBOL_FOR_MODULES(filemap_flush_nr, "btrfs");
+
 /**
  * filemap_range_has_page - check if a page exists in range.
  * @mapping:           address space within which to check