* [PATCH 01/10] mm: don't opencode filemap_fdatawrite_range in filemap_invalidate_inode
2025-10-24 8:04 filemap_* writeback interface cleanups v2 Christoph Hellwig
@ 2025-10-24 8:04 ` Christoph Hellwig
2025-10-24 8:04 ` [PATCH 02/10] 9p: don't opencode filemap_fdatawrite_range in v9fs_mmap_vm_close Christoph Hellwig
` (9 subsequent siblings)
10 siblings, 0 replies; 22+ messages in thread
From: Christoph Hellwig @ 2025-10-24 8:04 UTC (permalink / raw)
To: Matthew Wilcox (Oracle),
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Chris Mason, David Sterba, Mark Fasheh,
Joel Becker, Joseph Qi
Cc: Alexander Viro, Christian Brauner, Josef Bacik, Jan Kara,
linux-block, v9fs, linux-btrfs, linux-ext4, linux-fsdevel,
jfs-discussion, ocfs2-devel, linux-xfs, linux-mm,
David Hildenbrand, Damien Le Moal, Johannes Thumshirn
Use filemap_fdatawrite_range instead of opencoding the logic using
filemap_fdatawrite_wbc.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
mm/filemap.c | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/mm/filemap.c b/mm/filemap.c
index 13f0259d993c..99d6919af60d 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -4457,16 +4457,8 @@ int filemap_invalidate_inode(struct inode *inode, bool flush,
unmap_mapping_pages(mapping, first, nr, false);
/* Write back the data if we're asked to. */
- if (flush) {
- struct writeback_control wbc = {
- .sync_mode = WB_SYNC_ALL,
- .nr_to_write = LONG_MAX,
- .range_start = start,
- .range_end = end,
- };
-
- filemap_fdatawrite_wbc(mapping, &wbc);
- }
+ if (flush)
+ filemap_fdatawrite_range(mapping, start, end);
/* Wait for writeback to complete on all folios and discard. */
invalidate_inode_pages2_range(mapping, start / PAGE_SIZE, end / PAGE_SIZE);
--
2.47.3
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 02/10] 9p: don't opencode filemap_fdatawrite_range in v9fs_mmap_vm_close
2025-10-24 8:04 filemap_* writeback interface cleanups v2 Christoph Hellwig
2025-10-24 8:04 ` [PATCH 01/10] mm: don't opencode filemap_fdatawrite_range in filemap_invalidate_inode Christoph Hellwig
@ 2025-10-24 8:04 ` Christoph Hellwig
2025-10-24 8:04 ` [PATCH 03/10] ocfs2: don't opencode filemap_fdatawrite_range in ocfs2_journal_submit_inode_data_buffers Christoph Hellwig
` (8 subsequent siblings)
10 siblings, 0 replies; 22+ messages in thread
From: Christoph Hellwig @ 2025-10-24 8:04 UTC (permalink / raw)
To: Matthew Wilcox (Oracle),
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Chris Mason, David Sterba, Mark Fasheh,
Joel Becker, Joseph Qi
Cc: Alexander Viro, Christian Brauner, Josef Bacik, Jan Kara,
linux-block, v9fs, linux-btrfs, linux-ext4, linux-fsdevel,
jfs-discussion, ocfs2-devel, linux-xfs, linux-mm, Damien Le Moal,
Johannes Thumshirn
Use filemap_fdatawrite_range instead of opencoding the logic using
filemap_fdatawrite_wbc.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
fs/9p/vfs_file.c | 17 ++++-------------
1 file changed, 4 insertions(+), 13 deletions(-)
diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c
index eb0b083da269..612a230bc012 100644
--- a/fs/9p/vfs_file.c
+++ b/fs/9p/vfs_file.c
@@ -483,24 +483,15 @@ v9fs_vm_page_mkwrite(struct vm_fault *vmf)
static void v9fs_mmap_vm_close(struct vm_area_struct *vma)
{
- struct inode *inode;
-
- struct writeback_control wbc = {
- .nr_to_write = LONG_MAX,
- .sync_mode = WB_SYNC_ALL,
- .range_start = (loff_t)vma->vm_pgoff * PAGE_SIZE,
- /* absolute end, byte at end included */
- .range_end = (loff_t)vma->vm_pgoff * PAGE_SIZE +
- (vma->vm_end - vma->vm_start - 1),
- };
-
if (!(vma->vm_flags & VM_SHARED))
return;
p9_debug(P9_DEBUG_VFS, "9p VMA close, %p, flushing", vma);
- inode = file_inode(vma->vm_file);
- filemap_fdatawrite_wbc(inode->i_mapping, &wbc);
+ filemap_fdatawrite_range(file_inode(vma->vm_file)->i_mapping,
+ (loff_t)vma->vm_pgoff * PAGE_SIZE,
+ (loff_t)vma->vm_pgoff * PAGE_SIZE +
+ (vma->vm_end - vma->vm_start - 1));
}
static const struct vm_operations_struct v9fs_mmap_file_vm_ops = {
--
2.47.3
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 03/10] ocfs2: don't opencode filemap_fdatawrite_range in ocfs2_journal_submit_inode_data_buffers
2025-10-24 8:04 filemap_* writeback interface cleanups v2 Christoph Hellwig
2025-10-24 8:04 ` [PATCH 01/10] mm: don't opencode filemap_fdatawrite_range in filemap_invalidate_inode Christoph Hellwig
2025-10-24 8:04 ` [PATCH 02/10] 9p: don't opencode filemap_fdatawrite_range in v9fs_mmap_vm_close Christoph Hellwig
@ 2025-10-24 8:04 ` Christoph Hellwig
2025-10-24 8:04 ` [PATCH 04/10] btrfs: use the local tmp_inode variable in start_delalloc_inodes Christoph Hellwig
` (7 subsequent siblings)
10 siblings, 0 replies; 22+ messages in thread
From: Christoph Hellwig @ 2025-10-24 8:04 UTC (permalink / raw)
To: Matthew Wilcox (Oracle),
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Chris Mason, David Sterba, Mark Fasheh,
Joel Becker, Joseph Qi
Cc: Alexander Viro, Christian Brauner, Josef Bacik, Jan Kara,
linux-block, v9fs, linux-btrfs, linux-ext4, linux-fsdevel,
jfs-discussion, ocfs2-devel, linux-xfs, linux-mm, Damien Le Moal,
Johannes Thumshirn
Use filemap_fdatawrite_range instead of opencoding the logic using
filemap_fdatawrite_wbc. There is a slight change in the conversion
as nr_to_write is now set to LONG_MAX instead of double the number
of the pages in the range. LONG_MAX is the usual nr_to_write for
WB_SYNC_ALL writeback, and the value expected by lower layers here.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
fs/ocfs2/journal.c | 11 ++---------
1 file changed, 2 insertions(+), 9 deletions(-)
diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c
index e5f58ff2175f..85239807dec7 100644
--- a/fs/ocfs2/journal.c
+++ b/fs/ocfs2/journal.c
@@ -902,15 +902,8 @@ int ocfs2_journal_alloc(struct ocfs2_super *osb)
static int ocfs2_journal_submit_inode_data_buffers(struct jbd2_inode *jinode)
{
- struct address_space *mapping = jinode->i_vfs_inode->i_mapping;
- struct writeback_control wbc = {
- .sync_mode = WB_SYNC_ALL,
- .nr_to_write = mapping->nrpages * 2,
- .range_start = jinode->i_dirty_start,
- .range_end = jinode->i_dirty_end,
- };
-
- return filemap_fdatawrite_wbc(mapping, &wbc);
+ return filemap_fdatawrite_range(jinode->i_vfs_inode->i_mapping,
+ jinode->i_dirty_start, jinode->i_dirty_end);
}
int ocfs2_journal_init(struct ocfs2_super *osb, int *dirty)
--
2.47.3
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 04/10] btrfs: use the local tmp_inode variable in start_delalloc_inodes
2025-10-24 8:04 filemap_* writeback interface cleanups v2 Christoph Hellwig
` (2 preceding siblings ...)
2025-10-24 8:04 ` [PATCH 03/10] ocfs2: don't opencode filemap_fdatawrite_range in ocfs2_journal_submit_inode_data_buffers Christoph Hellwig
@ 2025-10-24 8:04 ` Christoph Hellwig
2025-10-24 8:04 ` [PATCH 05/10] btrfs: push struct writeback_control into start_delalloc_inodes Christoph Hellwig
` (6 subsequent siblings)
10 siblings, 0 replies; 22+ messages in thread
From: Christoph Hellwig @ 2025-10-24 8:04 UTC (permalink / raw)
To: Matthew Wilcox (Oracle),
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Chris Mason, David Sterba, Mark Fasheh,
Joel Becker, Joseph Qi
Cc: Alexander Viro, Christian Brauner, Josef Bacik, Jan Kara,
linux-block, v9fs, linux-btrfs, linux-ext4, linux-fsdevel,
jfs-discussion, ocfs2-devel, linux-xfs, linux-mm, Damien Le Moal,
Johannes Thumshirn
start_delalloc_inodes has a struct inode * pointer available in the
main loop, use it instead of re-calculating it from the btrfs inode.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
fs/btrfs/inode.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 3b1b3a0553ee..9edb78fc57fc 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -8744,9 +8744,9 @@ static int start_delalloc_inodes(struct btrfs_root *root,
if (snapshot)
set_bit(BTRFS_INODE_SNAPSHOT_FLUSH, &inode->runtime_flags);
if (full_flush) {
- work = btrfs_alloc_delalloc_work(&inode->vfs_inode);
+ work = btrfs_alloc_delalloc_work(tmp_inode);
if (!work) {
- iput(&inode->vfs_inode);
+ iput(tmp_inode);
ret = -ENOMEM;
goto out;
}
@@ -8754,7 +8754,7 @@ static int start_delalloc_inodes(struct btrfs_root *root,
btrfs_queue_work(root->fs_info->flush_workers,
&work->work);
} else {
- ret = filemap_fdatawrite_wbc(inode->vfs_inode.i_mapping, wbc);
+ ret = filemap_fdatawrite_wbc(tmp_inode->i_mapping, wbc);
btrfs_add_delayed_iput(inode);
if (ret || wbc->nr_to_write <= 0)
goto out;
--
2.47.3
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 05/10] btrfs: push struct writeback_control into start_delalloc_inodes
2025-10-24 8:04 filemap_* writeback interface cleanups v2 Christoph Hellwig
` (3 preceding siblings ...)
2025-10-24 8:04 ` [PATCH 04/10] btrfs: use the local tmp_inode variable in start_delalloc_inodes Christoph Hellwig
@ 2025-10-24 8:04 ` Christoph Hellwig
2025-10-30 18:21 ` David Sterba
2025-10-24 8:04 ` [PATCH 06/10] mm,btrfs: add a filemap_flush_nr helper Christoph Hellwig
` (5 subsequent siblings)
10 siblings, 1 reply; 22+ messages in thread
From: Christoph Hellwig @ 2025-10-24 8:04 UTC (permalink / raw)
To: Matthew Wilcox (Oracle),
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Chris Mason, David Sterba, Mark Fasheh,
Joel Becker, Joseph Qi
Cc: Alexander Viro, Christian Brauner, Josef Bacik, Jan Kara,
linux-block, v9fs, linux-btrfs, linux-ext4, linux-fsdevel,
jfs-discussion, ocfs2-devel, linux-xfs, linux-mm, Damien Le Moal,
Johannes Thumshirn
In preparation for changing the filemap_fdatawrite_wbc API to not expose
the writeback_control to the callers, push the wbc declaration next to
the filemap_fdatawrite_wbc call and just pass the nr_to_write value to
start_delalloc_inodes.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
fs/btrfs/inode.c | 51 ++++++++++++++++++++----------------------------
1 file changed, 21 insertions(+), 30 deletions(-)
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 9edb78fc57fc..b97d6c1f7772 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -8709,15 +8709,13 @@ static struct btrfs_delalloc_work *btrfs_alloc_delalloc_work(struct inode *inode
* some fairly slow code that needs optimization. This walks the list
* of all the inodes with pending delalloc and forces them to disk.
*/
-static int start_delalloc_inodes(struct btrfs_root *root,
- struct writeback_control *wbc, bool snapshot,
- bool in_reclaim_context)
+static int start_delalloc_inodes(struct btrfs_root *root, long *nr_to_write,
+ bool snapshot, bool in_reclaim_context)
{
struct btrfs_delalloc_work *work, *next;
LIST_HEAD(works);
LIST_HEAD(splice);
int ret = 0;
- bool full_flush = wbc->nr_to_write == LONG_MAX;
mutex_lock(&root->delalloc_mutex);
spin_lock(&root->delalloc_lock);
@@ -8743,7 +8741,7 @@ static int start_delalloc_inodes(struct btrfs_root *root,
if (snapshot)
set_bit(BTRFS_INODE_SNAPSHOT_FLUSH, &inode->runtime_flags);
- if (full_flush) {
+ if (nr_to_write == NULL) {
work = btrfs_alloc_delalloc_work(tmp_inode);
if (!work) {
iput(tmp_inode);
@@ -8754,9 +8752,20 @@ static int start_delalloc_inodes(struct btrfs_root *root,
btrfs_queue_work(root->fs_info->flush_workers,
&work->work);
} else {
- ret = filemap_fdatawrite_wbc(tmp_inode->i_mapping, wbc);
+ 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);
btrfs_add_delayed_iput(inode);
- if (ret || wbc->nr_to_write <= 0)
+
+ if (*nr_to_write != LONG_MAX)
+ *nr_to_write = wbc.nr_to_write;
+ if (ret || *nr_to_write <= 0)
goto out;
}
cond_resched();
@@ -8782,29 +8791,17 @@ static int start_delalloc_inodes(struct btrfs_root *root,
int btrfs_start_delalloc_snapshot(struct btrfs_root *root, bool in_reclaim_context)
{
- struct writeback_control wbc = {
- .nr_to_write = LONG_MAX,
- .sync_mode = WB_SYNC_NONE,
- .range_start = 0,
- .range_end = LLONG_MAX,
- };
struct btrfs_fs_info *fs_info = root->fs_info;
if (BTRFS_FS_ERROR(fs_info))
return -EROFS;
-
- return start_delalloc_inodes(root, &wbc, true, in_reclaim_context);
+ return start_delalloc_inodes(root, NULL, true, in_reclaim_context);
}
int btrfs_start_delalloc_roots(struct btrfs_fs_info *fs_info, long nr,
bool in_reclaim_context)
{
- struct writeback_control wbc = {
- .nr_to_write = nr,
- .sync_mode = WB_SYNC_NONE,
- .range_start = 0,
- .range_end = LLONG_MAX,
- };
+ long *nr_to_write = nr == LONG_MAX ? NULL : &nr;
struct btrfs_root *root;
LIST_HEAD(splice);
int ret;
@@ -8816,13 +8813,6 @@ int btrfs_start_delalloc_roots(struct btrfs_fs_info *fs_info, long nr,
spin_lock(&fs_info->delalloc_root_lock);
list_splice_init(&fs_info->delalloc_roots, &splice);
while (!list_empty(&splice)) {
- /*
- * Reset nr_to_write here so we know that we're doing a full
- * flush.
- */
- if (nr == LONG_MAX)
- wbc.nr_to_write = LONG_MAX;
-
root = list_first_entry(&splice, struct btrfs_root,
delalloc_root);
root = btrfs_grab_root(root);
@@ -8831,9 +8821,10 @@ int btrfs_start_delalloc_roots(struct btrfs_fs_info *fs_info, long nr,
&fs_info->delalloc_roots);
spin_unlock(&fs_info->delalloc_root_lock);
- ret = start_delalloc_inodes(root, &wbc, false, in_reclaim_context);
+ ret = start_delalloc_inodes(root, nr_to_write, false,
+ in_reclaim_context);
btrfs_put_root(root);
- if (ret < 0 || wbc.nr_to_write <= 0)
+ if (ret < 0 || nr <= 0)
goto out;
spin_lock(&fs_info->delalloc_root_lock);
}
--
2.47.3
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH 05/10] btrfs: push struct writeback_control into start_delalloc_inodes
2025-10-24 8:04 ` [PATCH 05/10] btrfs: push struct writeback_control into start_delalloc_inodes Christoph Hellwig
@ 2025-10-30 18:21 ` David Sterba
0 siblings, 0 replies; 22+ messages in thread
From: David Sterba @ 2025-10-30 18:21 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Matthew Wilcox (Oracle),
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Chris Mason, David Sterba, Mark Fasheh,
Joel Becker, Joseph Qi, Alexander Viro, Christian Brauner,
Josef Bacik, Jan Kara, linux-block, v9fs, linux-btrfs,
linux-ext4, linux-fsdevel, jfs-discussion, ocfs2-devel,
linux-xfs, linux-mm, Damien Le Moal, Johannes Thumshirn
On Fri, Oct 24, 2025 at 10:04:16AM +0200, Christoph Hellwig wrote:
> In preparation for changing the filemap_fdatawrite_wbc API to not expose
> the writeback_control to the callers, push the wbc declaration next to
> the filemap_fdatawrite_wbc call and just pass the nr_to_write value to
> start_delalloc_inodes.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Acked-by: David Sterba <dsterba@suse.com>
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 06/10] mm,btrfs: add a filemap_flush_nr helper
2025-10-24 8:04 filemap_* writeback interface cleanups v2 Christoph Hellwig
` (4 preceding siblings ...)
2025-10-24 8:04 ` [PATCH 05/10] btrfs: push struct writeback_control into start_delalloc_inodes Christoph Hellwig
@ 2025-10-24 8:04 ` Christoph Hellwig
2025-10-24 12:09 ` Jan Kara
2025-10-24 8:04 ` [PATCH 07/10] mm: remove __filemap_fdatawrite Christoph Hellwig
` (4 subsequent siblings)
10 siblings, 1 reply; 22+ messages in thread
From: Christoph Hellwig @ 2025-10-24 8:04 UTC (permalink / raw)
To: Matthew Wilcox (Oracle),
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Chris Mason, David Sterba, Mark Fasheh,
Joel Becker, Joseph Qi
Cc: Alexander Viro, Christian Brauner, Josef Bacik, Jan Kara,
linux-block, v9fs, linux-btrfs, linux-ext4, linux-fsdevel,
jfs-discussion, ocfs2-devel, linux-xfs, linux-mm,
David Hildenbrand, Damien Le Moal, Johannes Thumshirn
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 | 13 ++-----------
include/linux/pagemap.h | 1 +
mm/filemap.c | 22 ++++++++++++++++++++++
3 files changed, 25 insertions(+), 11 deletions(-)
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index b97d6c1f7772..d12b8116adde 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -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;
}
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index 09b581c1d878..cebdf160d3dd 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -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,
diff --git a/mm/filemap.c b/mm/filemap.c
index 99d6919af60d..e344b79a012d 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -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
--
2.47.3
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH 06/10] mm,btrfs: add a filemap_flush_nr helper
2025-10-24 8:04 ` [PATCH 06/10] mm,btrfs: add a filemap_flush_nr helper Christoph Hellwig
@ 2025-10-24 12:09 ` Jan Kara
0 siblings, 0 replies; 22+ messages in thread
From: Jan Kara @ 2025-10-24 12:09 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Matthew Wilcox (Oracle),
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Chris Mason, David Sterba, Mark Fasheh,
Joel Becker, Joseph Qi, Alexander Viro, Christian Brauner,
Josef Bacik, Jan Kara, linux-block, v9fs, linux-btrfs,
linux-ext4, linux-fsdevel, jfs-discussion, ocfs2-devel,
linux-xfs, linux-mm, David Hildenbrand, Damien Le Moal,
Johannes Thumshirn
On Fri 24-10-25 10:04:17, Christoph Hellwig wrote:
> 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>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> fs/btrfs/inode.c | 13 ++-----------
> include/linux/pagemap.h | 1 +
> mm/filemap.c | 22 ++++++++++++++++++++++
> 3 files changed, 25 insertions(+), 11 deletions(-)
>
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index b97d6c1f7772..d12b8116adde 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -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;
> }
> diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
> index 09b581c1d878..cebdf160d3dd 100644
> --- a/include/linux/pagemap.h
> +++ b/include/linux/pagemap.h
> @@ -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,
> diff --git a/mm/filemap.c b/mm/filemap.c
> index 99d6919af60d..e344b79a012d 100644
> --- a/mm/filemap.c
> +++ b/mm/filemap.c
> @@ -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
> --
> 2.47.3
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 07/10] mm: remove __filemap_fdatawrite
2025-10-24 8:04 filemap_* writeback interface cleanups v2 Christoph Hellwig
` (5 preceding siblings ...)
2025-10-24 8:04 ` [PATCH 06/10] mm,btrfs: add a filemap_flush_nr helper Christoph Hellwig
@ 2025-10-24 8:04 ` Christoph Hellwig
2025-10-24 12:11 ` Jan Kara
2025-10-24 8:04 ` [PATCH 08/10] mm: remove filemap_fdatawrite_wbc Christoph Hellwig
` (3 subsequent siblings)
10 siblings, 1 reply; 22+ messages in thread
From: Christoph Hellwig @ 2025-10-24 8:04 UTC (permalink / raw)
To: Matthew Wilcox (Oracle),
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Chris Mason, David Sterba, Mark Fasheh,
Joel Becker, Joseph Qi
Cc: Alexander Viro, Christian Brauner, Josef Bacik, Jan Kara,
linux-block, v9fs, linux-btrfs, linux-ext4, linux-fsdevel,
jfs-discussion, ocfs2-devel, linux-xfs, linux-mm,
Johannes Thumshirn
And rewrite filemap_fdatawrite to use filemap_fdatawrite_range instead
to have a simpler call chain.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
mm/filemap.c | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)
diff --git a/mm/filemap.c b/mm/filemap.c
index e344b79a012d..3d4c4a96c586 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -422,25 +422,19 @@ int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start,
return filemap_fdatawrite_wbc(mapping, &wbc);
}
-static inline int __filemap_fdatawrite(struct address_space *mapping,
- int sync_mode)
+int filemap_fdatawrite_range(struct address_space *mapping, loff_t start,
+ loff_t end)
{
- return __filemap_fdatawrite_range(mapping, 0, LLONG_MAX, sync_mode);
+ return __filemap_fdatawrite_range(mapping, start, end, WB_SYNC_ALL);
}
+EXPORT_SYMBOL(filemap_fdatawrite_range);
int filemap_fdatawrite(struct address_space *mapping)
{
- return __filemap_fdatawrite(mapping, WB_SYNC_ALL);
+ return filemap_fdatawrite_range(mapping, 0, LLONG_MAX);
}
EXPORT_SYMBOL(filemap_fdatawrite);
-int filemap_fdatawrite_range(struct address_space *mapping, loff_t start,
- loff_t end)
-{
- return __filemap_fdatawrite_range(mapping, start, end, WB_SYNC_ALL);
-}
-EXPORT_SYMBOL(filemap_fdatawrite_range);
-
/**
* filemap_fdatawrite_range_kick - start writeback on a range
* @mapping: target address_space
@@ -470,7 +464,7 @@ EXPORT_SYMBOL_GPL(filemap_fdatawrite_range_kick);
*/
int filemap_flush(struct address_space *mapping)
{
- return __filemap_fdatawrite(mapping, WB_SYNC_NONE);
+ return filemap_fdatawrite_range_kick(mapping, 0, LLONG_MAX);
}
EXPORT_SYMBOL(filemap_flush);
--
2.47.3
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH 07/10] mm: remove __filemap_fdatawrite
2025-10-24 8:04 ` [PATCH 07/10] mm: remove __filemap_fdatawrite Christoph Hellwig
@ 2025-10-24 12:11 ` Jan Kara
0 siblings, 0 replies; 22+ messages in thread
From: Jan Kara @ 2025-10-24 12:11 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Matthew Wilcox (Oracle),
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Chris Mason, David Sterba, Mark Fasheh,
Joel Becker, Joseph Qi, Alexander Viro, Christian Brauner,
Josef Bacik, Jan Kara, linux-block, v9fs, linux-btrfs,
linux-ext4, linux-fsdevel, jfs-discussion, ocfs2-devel,
linux-xfs, linux-mm, Johannes Thumshirn
On Fri 24-10-25 10:04:18, Christoph Hellwig wrote:
> And rewrite filemap_fdatawrite to use filemap_fdatawrite_range instead
> to have a simpler call chain.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> mm/filemap.c | 18 ++++++------------
> 1 file changed, 6 insertions(+), 12 deletions(-)
>
> diff --git a/mm/filemap.c b/mm/filemap.c
> index e344b79a012d..3d4c4a96c586 100644
> --- a/mm/filemap.c
> +++ b/mm/filemap.c
> @@ -422,25 +422,19 @@ int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start,
> return filemap_fdatawrite_wbc(mapping, &wbc);
> }
>
> -static inline int __filemap_fdatawrite(struct address_space *mapping,
> - int sync_mode)
> +int filemap_fdatawrite_range(struct address_space *mapping, loff_t start,
> + loff_t end)
> {
> - return __filemap_fdatawrite_range(mapping, 0, LLONG_MAX, sync_mode);
> + return __filemap_fdatawrite_range(mapping, start, end, WB_SYNC_ALL);
> }
> +EXPORT_SYMBOL(filemap_fdatawrite_range);
>
> int filemap_fdatawrite(struct address_space *mapping)
> {
> - return __filemap_fdatawrite(mapping, WB_SYNC_ALL);
> + return filemap_fdatawrite_range(mapping, 0, LLONG_MAX);
> }
> EXPORT_SYMBOL(filemap_fdatawrite);
>
> -int filemap_fdatawrite_range(struct address_space *mapping, loff_t start,
> - loff_t end)
> -{
> - return __filemap_fdatawrite_range(mapping, start, end, WB_SYNC_ALL);
> -}
> -EXPORT_SYMBOL(filemap_fdatawrite_range);
> -
> /**
> * filemap_fdatawrite_range_kick - start writeback on a range
> * @mapping: target address_space
> @@ -470,7 +464,7 @@ EXPORT_SYMBOL_GPL(filemap_fdatawrite_range_kick);
> */
> int filemap_flush(struct address_space *mapping)
> {
> - return __filemap_fdatawrite(mapping, WB_SYNC_NONE);
> + return filemap_fdatawrite_range_kick(mapping, 0, LLONG_MAX);
> }
> EXPORT_SYMBOL(filemap_flush);
>
> --
> 2.47.3
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 08/10] mm: remove filemap_fdatawrite_wbc
2025-10-24 8:04 filemap_* writeback interface cleanups v2 Christoph Hellwig
` (6 preceding siblings ...)
2025-10-24 8:04 ` [PATCH 07/10] mm: remove __filemap_fdatawrite Christoph Hellwig
@ 2025-10-24 8:04 ` Christoph Hellwig
2025-10-24 8:04 ` [PATCH 09/10] mm: remove __filemap_fdatawrite_range Christoph Hellwig
` (2 subsequent siblings)
10 siblings, 0 replies; 22+ messages in thread
From: Christoph Hellwig @ 2025-10-24 8:04 UTC (permalink / raw)
To: Matthew Wilcox (Oracle),
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Chris Mason, David Sterba, Mark Fasheh,
Joel Becker, Joseph Qi
Cc: Alexander Viro, Christian Brauner, Josef Bacik, Jan Kara,
linux-block, v9fs, linux-btrfs, linux-ext4, linux-fsdevel,
jfs-discussion, ocfs2-devel, linux-xfs, linux-mm,
David Hildenbrand, Damien Le Moal, Johannes Thumshirn
Replace filemap_fdatawrite_wbc, which exposes a writeback_control to the
callers with a filemap_writeback helper that takes all the possible
arguments and declares the writeback_control itself.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
fs/fs-writeback.c | 6 ++---
include/linux/pagemap.h | 2 --
mm/filemap.c | 54 ++++++++++++++---------------------------
3 files changed, 21 insertions(+), 41 deletions(-)
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
index 2b35e80037fe..d40b47132de3 100644
--- a/fs/fs-writeback.c
+++ b/fs/fs-writeback.c
@@ -807,9 +807,9 @@ static void wbc_attach_and_unlock_inode(struct writeback_control *wbc,
* @wbc: writeback_control of interest
* @inode: target inode
*
- * This function is to be used by __filemap_fdatawrite_range(), which is an
- * alternative entry point into writeback code, and first ensures @inode is
- * associated with a bdi_writeback and attaches it to @wbc.
+ * This function is to be used by filemap_writeback(), which is an alternative
+ * entry point into writeback code, and first ensures @inode is associated with
+ * a bdi_writeback and attaches it to @wbc.
*/
void wbc_attach_fdatawrite_inode(struct writeback_control *wbc,
struct inode *inode)
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index cebdf160d3dd..678d8ae23d01 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -60,8 +60,6 @@ int filemap_fdatawrite_range(struct address_space *mapping,
loff_t start, loff_t end);
int filemap_check_errors(struct address_space *mapping);
void __filemap_set_wb_err(struct address_space *mapping, int err);
-int filemap_fdatawrite_wbc(struct address_space *mapping,
- struct writeback_control *wbc);
int kiocb_write_and_wait(struct kiocb *iocb, size_t count);
static inline int filemap_write_and_wait(struct address_space *mapping)
diff --git a/mm/filemap.c b/mm/filemap.c
index 3d4c4a96c586..7126d0587c94 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -366,31 +366,30 @@ static int filemap_check_and_keep_errors(struct address_space *mapping)
return 0;
}
-/**
- * filemap_fdatawrite_wbc - start writeback on mapping dirty pages in range
- * @mapping: address space structure to write
- * @wbc: the writeback_control controlling the writeout
- *
- * Call writepages on the mapping using the provided wbc to control the
- * writeout.
- *
- * Return: %0 on success, negative error code otherwise.
- */
-int filemap_fdatawrite_wbc(struct address_space *mapping,
- struct writeback_control *wbc)
+static int filemap_writeback(struct address_space *mapping, loff_t start,
+ loff_t end, enum writeback_sync_modes sync_mode,
+ long *nr_to_write)
{
+ struct writeback_control wbc = {
+ .sync_mode = sync_mode,
+ .nr_to_write = nr_to_write ? *nr_to_write : LONG_MAX,
+ .range_start = start,
+ .range_end = end,
+ };
int ret;
if (!mapping_can_writeback(mapping) ||
!mapping_tagged(mapping, PAGECACHE_TAG_DIRTY))
return 0;
- wbc_attach_fdatawrite_inode(wbc, mapping->host);
- ret = do_writepages(mapping, wbc);
- wbc_detach_inode(wbc);
+ wbc_attach_fdatawrite_inode(&wbc, mapping->host);
+ ret = do_writepages(mapping, &wbc);
+ wbc_detach_inode(&wbc);
+
+ if (!ret && nr_to_write)
+ *nr_to_write = wbc.nr_to_write;
return ret;
}
-EXPORT_SYMBOL(filemap_fdatawrite_wbc);
/**
* __filemap_fdatawrite_range - start writeback on mapping dirty pages in range
@@ -412,14 +411,7 @@ EXPORT_SYMBOL(filemap_fdatawrite_wbc);
int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start,
loff_t end, int sync_mode)
{
- struct writeback_control wbc = {
- .sync_mode = sync_mode,
- .nr_to_write = LONG_MAX,
- .range_start = start,
- .range_end = end,
- };
-
- return filemap_fdatawrite_wbc(mapping, &wbc);
+ return filemap_writeback(mapping, start, end, sync_mode, NULL);
}
int filemap_fdatawrite_range(struct address_space *mapping, loff_t start,
@@ -475,18 +467,8 @@ EXPORT_SYMBOL(filemap_flush);
*/
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;
+ return filemap_writeback(mapping, 0, LLONG_MAX, WB_SYNC_NONE,
+ nr_to_write);
}
EXPORT_SYMBOL_FOR_MODULES(filemap_flush_nr, "btrfs");
--
2.47.3
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 09/10] mm: remove __filemap_fdatawrite_range
2025-10-24 8:04 filemap_* writeback interface cleanups v2 Christoph Hellwig
` (7 preceding siblings ...)
2025-10-24 8:04 ` [PATCH 08/10] mm: remove filemap_fdatawrite_wbc Christoph Hellwig
@ 2025-10-24 8:04 ` Christoph Hellwig
2025-10-24 8:04 ` [PATCH 10/10] mm: rename filemap_fdatawrite_range_kick to filemap_flush_range Christoph Hellwig
2025-10-29 14:53 ` filemap_* writeback interface cleanups v2 Christian Brauner
10 siblings, 0 replies; 22+ messages in thread
From: Christoph Hellwig @ 2025-10-24 8:04 UTC (permalink / raw)
To: Matthew Wilcox (Oracle),
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Chris Mason, David Sterba, Mark Fasheh,
Joel Becker, Joseph Qi
Cc: Alexander Viro, Christian Brauner, Josef Bacik, Jan Kara,
linux-block, v9fs, linux-btrfs, linux-ext4, linux-fsdevel,
jfs-discussion, ocfs2-devel, linux-xfs, linux-mm, Damien Le Moal,
Johannes Thumshirn
Use filemap_fdatawrite_range and filemap_fdatawrite_range_kick instead
of the low-level __filemap_fdatawrite_range that requires the caller
to know the internals of the writeback_control structure and remove
__filemap_fdatawrite_range now that it is trivial and only two callers
would be left.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
fs/sync.c | 11 +++++------
include/linux/pagemap.h | 2 --
mm/fadvise.c | 3 +--
mm/filemap.c | 25 +++++++------------------
4 files changed, 13 insertions(+), 28 deletions(-)
diff --git a/fs/sync.c b/fs/sync.c
index 2955cd4c77a3..6d8b04e04c3c 100644
--- a/fs/sync.c
+++ b/fs/sync.c
@@ -280,14 +280,13 @@ int sync_file_range(struct file *file, loff_t offset, loff_t nbytes,
}
if (flags & SYNC_FILE_RANGE_WRITE) {
- int sync_mode = WB_SYNC_NONE;
-
if ((flags & SYNC_FILE_RANGE_WRITE_AND_WAIT) ==
SYNC_FILE_RANGE_WRITE_AND_WAIT)
- sync_mode = WB_SYNC_ALL;
-
- ret = __filemap_fdatawrite_range(mapping, offset, endbyte,
- sync_mode);
+ ret = filemap_fdatawrite_range(mapping, offset,
+ endbyte);
+ else
+ ret = filemap_fdatawrite_range_kick(mapping, offset,
+ endbyte);
if (ret < 0)
goto out;
}
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index 678d8ae23d01..d0a7dd43c835 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -54,8 +54,6 @@ static inline int filemap_fdatawait(struct address_space *mapping)
bool filemap_range_has_page(struct address_space *, loff_t lstart, loff_t lend);
int filemap_write_and_wait_range(struct address_space *mapping,
loff_t lstart, loff_t lend);
-int __filemap_fdatawrite_range(struct address_space *mapping,
- loff_t start, loff_t end, int sync_mode);
int filemap_fdatawrite_range(struct address_space *mapping,
loff_t start, loff_t end);
int filemap_check_errors(struct address_space *mapping);
diff --git a/mm/fadvise.c b/mm/fadvise.c
index 588fe76c5a14..f1be619f0e58 100644
--- a/mm/fadvise.c
+++ b/mm/fadvise.c
@@ -111,8 +111,7 @@ int generic_fadvise(struct file *file, loff_t offset, loff_t len, int advice)
spin_unlock(&file->f_lock);
break;
case POSIX_FADV_DONTNEED:
- __filemap_fdatawrite_range(mapping, offset, endbyte,
- WB_SYNC_NONE);
+ filemap_fdatawrite_range_kick(mapping, offset, endbyte);
/*
* First and last FULL page! Partial pages are deliberately
diff --git a/mm/filemap.c b/mm/filemap.c
index 7126d0587c94..f90f5bb2b825 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -392,32 +392,23 @@ static int filemap_writeback(struct address_space *mapping, loff_t start,
}
/**
- * __filemap_fdatawrite_range - start writeback on mapping dirty pages in range
+ * filemap_fdatawrite_range - start writeback on mapping dirty pages in range
* @mapping: address space structure to write
* @start: offset in bytes where the range starts
* @end: offset in bytes where the range ends (inclusive)
- * @sync_mode: enable synchronous operation
*
* Start writeback against all of a mapping's dirty pages that lie
* within the byte offsets <start, end> inclusive.
*
- * If sync_mode is WB_SYNC_ALL then this is a "data integrity" operation, as
- * opposed to a regular memory cleansing writeback. The difference between
- * these two operations is that if a dirty page/buffer is encountered, it must
- * be waited upon, and not just skipped over.
+ * This is a data integrity operation that waits upon dirty or in writeback
+ * pages.
*
* Return: %0 on success, negative error code otherwise.
*/
-int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start,
- loff_t end, int sync_mode)
-{
- return filemap_writeback(mapping, start, end, sync_mode, NULL);
-}
-
int filemap_fdatawrite_range(struct address_space *mapping, loff_t start,
loff_t end)
{
- return __filemap_fdatawrite_range(mapping, start, end, WB_SYNC_ALL);
+ return filemap_writeback(mapping, start, end, WB_SYNC_ALL, NULL);
}
EXPORT_SYMBOL(filemap_fdatawrite_range);
@@ -441,7 +432,7 @@ EXPORT_SYMBOL(filemap_fdatawrite);
int filemap_fdatawrite_range_kick(struct address_space *mapping, loff_t start,
loff_t end)
{
- return __filemap_fdatawrite_range(mapping, start, end, WB_SYNC_NONE);
+ return filemap_writeback(mapping, start, end, WB_SYNC_NONE, NULL);
}
EXPORT_SYMBOL_GPL(filemap_fdatawrite_range_kick);
@@ -689,8 +680,7 @@ int filemap_write_and_wait_range(struct address_space *mapping,
return 0;
if (mapping_needs_writeback(mapping)) {
- err = __filemap_fdatawrite_range(mapping, lstart, lend,
- WB_SYNC_ALL);
+ err = filemap_fdatawrite_range(mapping, lstart, lend);
/*
* Even if the above returned error, the pages may be
* written partially (e.g. -ENOSPC), so we wait for it.
@@ -792,8 +782,7 @@ int file_write_and_wait_range(struct file *file, loff_t lstart, loff_t lend)
return 0;
if (mapping_needs_writeback(mapping)) {
- err = __filemap_fdatawrite_range(mapping, lstart, lend,
- WB_SYNC_ALL);
+ err = filemap_fdatawrite_range(mapping, lstart, lend);
/* See comment of filemap_write_and_wait() */
if (err != -EIO)
__filemap_fdatawait_range(mapping, lstart, lend);
--
2.47.3
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 10/10] mm: rename filemap_fdatawrite_range_kick to filemap_flush_range
2025-10-24 8:04 filemap_* writeback interface cleanups v2 Christoph Hellwig
` (8 preceding siblings ...)
2025-10-24 8:04 ` [PATCH 09/10] mm: remove __filemap_fdatawrite_range Christoph Hellwig
@ 2025-10-24 8:04 ` Christoph Hellwig
2025-10-24 12:13 ` Jan Kara
2025-10-29 14:53 ` filemap_* writeback interface cleanups v2 Christian Brauner
10 siblings, 1 reply; 22+ messages in thread
From: Christoph Hellwig @ 2025-10-24 8:04 UTC (permalink / raw)
To: Matthew Wilcox (Oracle),
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Chris Mason, David Sterba, Mark Fasheh,
Joel Becker, Joseph Qi
Cc: Alexander Viro, Christian Brauner, Josef Bacik, Jan Kara,
linux-block, v9fs, linux-btrfs, linux-ext4, linux-fsdevel,
jfs-discussion, ocfs2-devel, linux-xfs, linux-mm
Rename filemap_fdatawrite_range_kick to filemap_flush_range because it
is the ranged version of filemap_flush.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
fs/sync.c | 3 +--
include/linux/fs.h | 6 +++---
mm/fadvise.c | 2 +-
mm/filemap.c | 8 ++++----
4 files changed, 9 insertions(+), 10 deletions(-)
diff --git a/fs/sync.c b/fs/sync.c
index 6d8b04e04c3c..1759f6ba36cd 100644
--- a/fs/sync.c
+++ b/fs/sync.c
@@ -285,8 +285,7 @@ int sync_file_range(struct file *file, loff_t offset, loff_t nbytes,
ret = filemap_fdatawrite_range(mapping, offset,
endbyte);
else
- ret = filemap_fdatawrite_range_kick(mapping, offset,
- endbyte);
+ ret = filemap_flush_range(mapping, offset, endbyte);
if (ret < 0)
goto out;
}
diff --git a/include/linux/fs.h b/include/linux/fs.h
index c895146c1444..a5dbfa20f8d7 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -3014,7 +3014,7 @@ extern int __must_check file_fdatawait_range(struct file *file, loff_t lstart,
extern int __must_check file_check_and_advance_wb_err(struct file *file);
extern int __must_check file_write_and_wait_range(struct file *file,
loff_t start, loff_t end);
-int filemap_fdatawrite_range_kick(struct address_space *mapping, loff_t start,
+int filemap_flush_range(struct address_space *mapping, loff_t start,
loff_t end);
static inline int file_write_and_wait(struct file *file)
@@ -3051,8 +3051,8 @@ static inline ssize_t generic_write_sync(struct kiocb *iocb, ssize_t count)
} else if (iocb->ki_flags & IOCB_DONTCACHE) {
struct address_space *mapping = iocb->ki_filp->f_mapping;
- filemap_fdatawrite_range_kick(mapping, iocb->ki_pos - count,
- iocb->ki_pos - 1);
+ filemap_flush_range(mapping, iocb->ki_pos - count,
+ iocb->ki_pos - 1);
}
return count;
diff --git a/mm/fadvise.c b/mm/fadvise.c
index f1be619f0e58..67028e30aa91 100644
--- a/mm/fadvise.c
+++ b/mm/fadvise.c
@@ -111,7 +111,7 @@ int generic_fadvise(struct file *file, loff_t offset, loff_t len, int advice)
spin_unlock(&file->f_lock);
break;
case POSIX_FADV_DONTNEED:
- filemap_fdatawrite_range_kick(mapping, offset, endbyte);
+ filemap_flush_range(mapping, offset, endbyte);
/*
* First and last FULL page! Partial pages are deliberately
diff --git a/mm/filemap.c b/mm/filemap.c
index f90f5bb2b825..fa770768ea3a 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -419,7 +419,7 @@ int filemap_fdatawrite(struct address_space *mapping)
EXPORT_SYMBOL(filemap_fdatawrite);
/**
- * filemap_fdatawrite_range_kick - start writeback on a range
+ * filemap_flush_range - start writeback on a range
* @mapping: target address_space
* @start: index to start writeback on
* @end: last (inclusive) index for writeback
@@ -429,12 +429,12 @@ EXPORT_SYMBOL(filemap_fdatawrite);
*
* Return: %0 on success, negative error code otherwise.
*/
-int filemap_fdatawrite_range_kick(struct address_space *mapping, loff_t start,
+int filemap_flush_range(struct address_space *mapping, loff_t start,
loff_t end)
{
return filemap_writeback(mapping, start, end, WB_SYNC_NONE, NULL);
}
-EXPORT_SYMBOL_GPL(filemap_fdatawrite_range_kick);
+EXPORT_SYMBOL_GPL(filemap_flush_range);
/**
* filemap_flush - mostly a non-blocking flush
@@ -447,7 +447,7 @@ EXPORT_SYMBOL_GPL(filemap_fdatawrite_range_kick);
*/
int filemap_flush(struct address_space *mapping)
{
- return filemap_fdatawrite_range_kick(mapping, 0, LLONG_MAX);
+ return filemap_flush_range(mapping, 0, LLONG_MAX);
}
EXPORT_SYMBOL(filemap_flush);
--
2.47.3
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH 10/10] mm: rename filemap_fdatawrite_range_kick to filemap_flush_range
2025-10-24 8:04 ` [PATCH 10/10] mm: rename filemap_fdatawrite_range_kick to filemap_flush_range Christoph Hellwig
@ 2025-10-24 12:13 ` Jan Kara
0 siblings, 0 replies; 22+ messages in thread
From: Jan Kara @ 2025-10-24 12:13 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Matthew Wilcox (Oracle),
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Chris Mason, David Sterba, Mark Fasheh,
Joel Becker, Joseph Qi, Alexander Viro, Christian Brauner,
Josef Bacik, Jan Kara, linux-block, v9fs, linux-btrfs,
linux-ext4, linux-fsdevel, jfs-discussion, ocfs2-devel,
linux-xfs, linux-mm
On Fri 24-10-25 10:04:21, Christoph Hellwig wrote:
> Rename filemap_fdatawrite_range_kick to filemap_flush_range because it
> is the ranged version of filemap_flush.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> fs/sync.c | 3 +--
> include/linux/fs.h | 6 +++---
> mm/fadvise.c | 2 +-
> mm/filemap.c | 8 ++++----
> 4 files changed, 9 insertions(+), 10 deletions(-)
>
> diff --git a/fs/sync.c b/fs/sync.c
> index 6d8b04e04c3c..1759f6ba36cd 100644
> --- a/fs/sync.c
> +++ b/fs/sync.c
> @@ -285,8 +285,7 @@ int sync_file_range(struct file *file, loff_t offset, loff_t nbytes,
> ret = filemap_fdatawrite_range(mapping, offset,
> endbyte);
> else
> - ret = filemap_fdatawrite_range_kick(mapping, offset,
> - endbyte);
> + ret = filemap_flush_range(mapping, offset, endbyte);
> if (ret < 0)
> goto out;
> }
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index c895146c1444..a5dbfa20f8d7 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -3014,7 +3014,7 @@ extern int __must_check file_fdatawait_range(struct file *file, loff_t lstart,
> extern int __must_check file_check_and_advance_wb_err(struct file *file);
> extern int __must_check file_write_and_wait_range(struct file *file,
> loff_t start, loff_t end);
> -int filemap_fdatawrite_range_kick(struct address_space *mapping, loff_t start,
> +int filemap_flush_range(struct address_space *mapping, loff_t start,
> loff_t end);
>
> static inline int file_write_and_wait(struct file *file)
> @@ -3051,8 +3051,8 @@ static inline ssize_t generic_write_sync(struct kiocb *iocb, ssize_t count)
> } else if (iocb->ki_flags & IOCB_DONTCACHE) {
> struct address_space *mapping = iocb->ki_filp->f_mapping;
>
> - filemap_fdatawrite_range_kick(mapping, iocb->ki_pos - count,
> - iocb->ki_pos - 1);
> + filemap_flush_range(mapping, iocb->ki_pos - count,
> + iocb->ki_pos - 1);
> }
>
> return count;
> diff --git a/mm/fadvise.c b/mm/fadvise.c
> index f1be619f0e58..67028e30aa91 100644
> --- a/mm/fadvise.c
> +++ b/mm/fadvise.c
> @@ -111,7 +111,7 @@ int generic_fadvise(struct file *file, loff_t offset, loff_t len, int advice)
> spin_unlock(&file->f_lock);
> break;
> case POSIX_FADV_DONTNEED:
> - filemap_fdatawrite_range_kick(mapping, offset, endbyte);
> + filemap_flush_range(mapping, offset, endbyte);
>
> /*
> * First and last FULL page! Partial pages are deliberately
> diff --git a/mm/filemap.c b/mm/filemap.c
> index f90f5bb2b825..fa770768ea3a 100644
> --- a/mm/filemap.c
> +++ b/mm/filemap.c
> @@ -419,7 +419,7 @@ int filemap_fdatawrite(struct address_space *mapping)
> EXPORT_SYMBOL(filemap_fdatawrite);
>
> /**
> - * filemap_fdatawrite_range_kick - start writeback on a range
> + * filemap_flush_range - start writeback on a range
> * @mapping: target address_space
> * @start: index to start writeback on
> * @end: last (inclusive) index for writeback
> @@ -429,12 +429,12 @@ EXPORT_SYMBOL(filemap_fdatawrite);
> *
> * Return: %0 on success, negative error code otherwise.
> */
> -int filemap_fdatawrite_range_kick(struct address_space *mapping, loff_t start,
> +int filemap_flush_range(struct address_space *mapping, loff_t start,
> loff_t end)
> {
> return filemap_writeback(mapping, start, end, WB_SYNC_NONE, NULL);
> }
> -EXPORT_SYMBOL_GPL(filemap_fdatawrite_range_kick);
> +EXPORT_SYMBOL_GPL(filemap_flush_range);
>
> /**
> * filemap_flush - mostly a non-blocking flush
> @@ -447,7 +447,7 @@ EXPORT_SYMBOL_GPL(filemap_fdatawrite_range_kick);
> */
> int filemap_flush(struct address_space *mapping)
> {
> - return filemap_fdatawrite_range_kick(mapping, 0, LLONG_MAX);
> + return filemap_flush_range(mapping, 0, LLONG_MAX);
> }
> EXPORT_SYMBOL(filemap_flush);
>
> --
> 2.47.3
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: filemap_* writeback interface cleanups v2
2025-10-24 8:04 filemap_* writeback interface cleanups v2 Christoph Hellwig
` (9 preceding siblings ...)
2025-10-24 8:04 ` [PATCH 10/10] mm: rename filemap_fdatawrite_range_kick to filemap_flush_range Christoph Hellwig
@ 2025-10-29 14:53 ` Christian Brauner
10 siblings, 0 replies; 22+ messages in thread
From: Christian Brauner @ 2025-10-29 14:53 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Christian Brauner, Alexander Viro, Josef Bacik, Jan Kara,
linux-block, v9fs, linux-btrfs, linux-ext4, linux-fsdevel,
jfs-discussion, ocfs2-devel, linux-xfs, linux-mm,
Matthew Wilcox (Oracle),
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Chris Mason, David Sterba, Mark Fasheh,
Joel Becker, Joseph Qi
On Fri, 24 Oct 2025 10:04:11 +0200, Christoph Hellwig wrote:
> while looking at the filemap writeback code, I think adding
> filemap_fdatawrite_wbc ended up being a mistake, as all but the original
> btrfs caller should be using better high level interfaces instead. This
> series removes all these, switches btrfs to a more specific interfaces
> and also cleans up another too low-level interface. With this the
> writeback_control that is passed to the writeback code is only
> initialized in three places, although there are a lot more places in
> file system code that never reach the common writeback code.
>
> [...]
Applied to the vfs-6.19.writeback branch of the vfs/vfs.git tree.
Patches in the vfs-6.19.writeback branch should appear in linux-next soon.
Please report any outstanding bugs that were missed during review in a
new review to the original patch series allowing us to drop it.
It's encouraged to provide Acked-bys and Reviewed-bys even though the
patch has now been applied. If possible patch trailers will be updated.
Note that commit hashes shown below are subject to change due to rebase,
trailer updates or similar. If in doubt, please check the listed branch.
tree: https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git
branch: vfs-6.19.writeback
[01/10] mm: don't opencode filemap_fdatawrite_range in filemap_invalidate_inode
https://git.kernel.org/vfs/vfs/c/a21134b5d6cb
[02/10] 9p: don't opencode filemap_fdatawrite_range in v9fs_mmap_vm_close
https://git.kernel.org/vfs/vfs/c/3c2e5cee5eb3
[03/10] ocfs2: don't opencode filemap_fdatawrite_range in ocfs2_journal_submit_inode_data_buffers
https://git.kernel.org/vfs/vfs/c/890f141da068
[04/10] btrfs: use the local tmp_inode variable in start_delalloc_inodes
https://git.kernel.org/vfs/vfs/c/41e52c644753
[05/10] btrfs: push struct writeback_control into start_delalloc_inodes
https://git.kernel.org/vfs/vfs/c/c9501112e3cb
[06/10] mm,btrfs: add a filemap_flush_nr helper
https://git.kernel.org/vfs/vfs/c/7fabcb7fbabb
[07/10] mm: remove __filemap_fdatawrite
https://git.kernel.org/vfs/vfs/c/735965144806
[08/10] mm: remove filemap_fdatawrite_wbc
https://git.kernel.org/vfs/vfs/c/1bcb413d0cd8
[09/10] mm: remove __filemap_fdatawrite_range
https://git.kernel.org/vfs/vfs/c/45cbce5b8877
[10/10] mm: rename filemap_fdatawrite_range_kick to filemap_flush_range
https://git.kernel.org/vfs/vfs/c/c28d67b33cbf
^ permalink raw reply [flat|nested] 22+ messages in thread