Skip to content

Commit 211c43d

Browse files
committed
Merge patch series "filemap_* writeback interface cleanups v2"
Christoph Hellwig <hch@lst.de> says: 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. * patches from https://patch.msgid.link/20251024080431.324236-1-hch@lst.de: mm: rename filemap_fdatawrite_range_kick to filemap_flush_range mm: remove __filemap_fdatawrite_range mm: remove filemap_fdatawrite_wbc mm: remove __filemap_fdatawrite mm,btrfs: add a filemap_flush_nr helper btrfs: push struct writeback_control into start_delalloc_inodes btrfs: use the local tmp_inode variable in start_delalloc_inodes ocfs2: don't opencode filemap_fdatawrite_range in ocfs2_journal_submit_inode_data_buffers 9p: don't opencode filemap_fdatawrite_range in v9fs_mmap_vm_close mm: don't opencode filemap_fdatawrite_range in filemap_invalidate_inode Link: https://patch.msgid.link/20251024080431.324236-1-hch@lst.de Signed-off-by: Christian Brauner <brauner@kernel.org>
2 parents d6e6215 + c28d67b commit 211c43d

9 files changed

Lines changed: 76 additions & 137 deletions

File tree

fs/9p/vfs_file.c

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -483,24 +483,15 @@ v9fs_vm_page_mkwrite(struct vm_fault *vmf)
483483

484484
static void v9fs_mmap_vm_close(struct vm_area_struct *vma)
485485
{
486-
struct inode *inode;
487-
488-
struct writeback_control wbc = {
489-
.nr_to_write = LONG_MAX,
490-
.sync_mode = WB_SYNC_ALL,
491-
.range_start = (loff_t)vma->vm_pgoff * PAGE_SIZE,
492-
/* absolute end, byte at end included */
493-
.range_end = (loff_t)vma->vm_pgoff * PAGE_SIZE +
494-
(vma->vm_end - vma->vm_start - 1),
495-
};
496-
497486
if (!(vma->vm_flags & VM_SHARED))
498487
return;
499488

500489
p9_debug(P9_DEBUG_VFS, "9p VMA close, %p, flushing", vma);
501490

502-
inode = file_inode(vma->vm_file);
503-
filemap_fdatawrite_wbc(inode->i_mapping, &wbc);
491+
filemap_fdatawrite_range(file_inode(vma->vm_file)->i_mapping,
492+
(loff_t)vma->vm_pgoff * PAGE_SIZE,
493+
(loff_t)vma->vm_pgoff * PAGE_SIZE +
494+
(vma->vm_end - vma->vm_start - 1));
504495
}
505496

506497
static const struct vm_operations_struct v9fs_mmap_file_vm_ops = {

fs/btrfs/inode.c

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -8709,15 +8709,13 @@ static struct btrfs_delalloc_work *btrfs_alloc_delalloc_work(struct inode *inode
87098709
* some fairly slow code that needs optimization. This walks the list
87108710
* of all the inodes with pending delalloc and forces them to disk.
87118711
*/
8712-
static int start_delalloc_inodes(struct btrfs_root *root,
8713-
struct writeback_control *wbc, bool snapshot,
8714-
bool in_reclaim_context)
8712+
static int start_delalloc_inodes(struct btrfs_root *root, long *nr_to_write,
8713+
bool snapshot, bool in_reclaim_context)
87158714
{
87168715
struct btrfs_delalloc_work *work, *next;
87178716
LIST_HEAD(works);
87188717
LIST_HEAD(splice);
87198718
int ret = 0;
8720-
bool full_flush = wbc->nr_to_write == LONG_MAX;
87218719

87228720
mutex_lock(&root->delalloc_mutex);
87238721
spin_lock(&root->delalloc_lock);
@@ -8743,20 +8741,22 @@ static int start_delalloc_inodes(struct btrfs_root *root,
87438741

87448742
if (snapshot)
87458743
set_bit(BTRFS_INODE_SNAPSHOT_FLUSH, &inode->runtime_flags);
8746-
if (full_flush) {
8747-
work = btrfs_alloc_delalloc_work(&inode->vfs_inode);
8744+
if (nr_to_write == NULL) {
8745+
work = btrfs_alloc_delalloc_work(tmp_inode);
87488746
if (!work) {
8749-
iput(&inode->vfs_inode);
8747+
iput(tmp_inode);
87508748
ret = -ENOMEM;
87518749
goto out;
87528750
}
87538751
list_add_tail(&work->list, &works);
87548752
btrfs_queue_work(root->fs_info->flush_workers,
87558753
&work->work);
87568754
} else {
8757-
ret = filemap_fdatawrite_wbc(inode->vfs_inode.i_mapping, wbc);
8755+
ret = filemap_flush_nr(tmp_inode->i_mapping,
8756+
nr_to_write);
87588757
btrfs_add_delayed_iput(inode);
8759-
if (ret || wbc->nr_to_write <= 0)
8758+
8759+
if (ret || *nr_to_write <= 0)
87608760
goto out;
87618761
}
87628762
cond_resched();
@@ -8782,29 +8782,17 @@ static int start_delalloc_inodes(struct btrfs_root *root,
87828782

87838783
int btrfs_start_delalloc_snapshot(struct btrfs_root *root, bool in_reclaim_context)
87848784
{
8785-
struct writeback_control wbc = {
8786-
.nr_to_write = LONG_MAX,
8787-
.sync_mode = WB_SYNC_NONE,
8788-
.range_start = 0,
8789-
.range_end = LLONG_MAX,
8790-
};
87918785
struct btrfs_fs_info *fs_info = root->fs_info;
87928786

87938787
if (BTRFS_FS_ERROR(fs_info))
87948788
return -EROFS;
8795-
8796-
return start_delalloc_inodes(root, &wbc, true, in_reclaim_context);
8789+
return start_delalloc_inodes(root, NULL, true, in_reclaim_context);
87978790
}
87988791

87998792
int btrfs_start_delalloc_roots(struct btrfs_fs_info *fs_info, long nr,
88008793
bool in_reclaim_context)
88018794
{
8802-
struct writeback_control wbc = {
8803-
.nr_to_write = nr,
8804-
.sync_mode = WB_SYNC_NONE,
8805-
.range_start = 0,
8806-
.range_end = LLONG_MAX,
8807-
};
8795+
long *nr_to_write = nr == LONG_MAX ? NULL : &nr;
88088796
struct btrfs_root *root;
88098797
LIST_HEAD(splice);
88108798
int ret;
@@ -8816,13 +8804,6 @@ int btrfs_start_delalloc_roots(struct btrfs_fs_info *fs_info, long nr,
88168804
spin_lock(&fs_info->delalloc_root_lock);
88178805
list_splice_init(&fs_info->delalloc_roots, &splice);
88188806
while (!list_empty(&splice)) {
8819-
/*
8820-
* Reset nr_to_write here so we know that we're doing a full
8821-
* flush.
8822-
*/
8823-
if (nr == LONG_MAX)
8824-
wbc.nr_to_write = LONG_MAX;
8825-
88268807
root = list_first_entry(&splice, struct btrfs_root,
88278808
delalloc_root);
88288809
root = btrfs_grab_root(root);
@@ -8831,9 +8812,10 @@ int btrfs_start_delalloc_roots(struct btrfs_fs_info *fs_info, long nr,
88318812
&fs_info->delalloc_roots);
88328813
spin_unlock(&fs_info->delalloc_root_lock);
88338814

8834-
ret = start_delalloc_inodes(root, &wbc, false, in_reclaim_context);
8815+
ret = start_delalloc_inodes(root, nr_to_write, false,
8816+
in_reclaim_context);
88358817
btrfs_put_root(root);
8836-
if (ret < 0 || wbc.nr_to_write <= 0)
8818+
if (ret < 0 || nr <= 0)
88378819
goto out;
88388820
spin_lock(&fs_info->delalloc_root_lock);
88398821
}

fs/fs-writeback.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -822,9 +822,9 @@ static void wbc_attach_and_unlock_inode(struct writeback_control *wbc,
822822
* @wbc: writeback_control of interest
823823
* @inode: target inode
824824
*
825-
* This function is to be used by __filemap_fdatawrite_range(), which is an
826-
* alternative entry point into writeback code, and first ensures @inode is
827-
* associated with a bdi_writeback and attaches it to @wbc.
825+
* This function is to be used by filemap_writeback(), which is an alternative
826+
* entry point into writeback code, and first ensures @inode is associated with
827+
* a bdi_writeback and attaches it to @wbc.
828828
*/
829829
void wbc_attach_fdatawrite_inode(struct writeback_control *wbc,
830830
struct inode *inode)

fs/ocfs2/journal.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -902,15 +902,8 @@ int ocfs2_journal_alloc(struct ocfs2_super *osb)
902902

903903
static int ocfs2_journal_submit_inode_data_buffers(struct jbd2_inode *jinode)
904904
{
905-
struct address_space *mapping = jinode->i_vfs_inode->i_mapping;
906-
struct writeback_control wbc = {
907-
.sync_mode = WB_SYNC_ALL,
908-
.nr_to_write = mapping->nrpages * 2,
909-
.range_start = jinode->i_dirty_start,
910-
.range_end = jinode->i_dirty_end,
911-
};
912-
913-
return filemap_fdatawrite_wbc(mapping, &wbc);
905+
return filemap_fdatawrite_range(jinode->i_vfs_inode->i_mapping,
906+
jinode->i_dirty_start, jinode->i_dirty_end);
914907
}
915908

916909
int ocfs2_journal_init(struct ocfs2_super *osb, int *dirty)

fs/sync.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -280,14 +280,12 @@ int sync_file_range(struct file *file, loff_t offset, loff_t nbytes,
280280
}
281281

282282
if (flags & SYNC_FILE_RANGE_WRITE) {
283-
int sync_mode = WB_SYNC_NONE;
284-
285283
if ((flags & SYNC_FILE_RANGE_WRITE_AND_WAIT) ==
286284
SYNC_FILE_RANGE_WRITE_AND_WAIT)
287-
sync_mode = WB_SYNC_ALL;
288-
289-
ret = __filemap_fdatawrite_range(mapping, offset, endbyte,
290-
sync_mode);
285+
ret = filemap_fdatawrite_range(mapping, offset,
286+
endbyte);
287+
else
288+
ret = filemap_flush_range(mapping, offset, endbyte);
291289
if (ret < 0)
292290
goto out;
293291
}

include/linux/fs.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3014,7 +3014,7 @@ extern int __must_check file_fdatawait_range(struct file *file, loff_t lstart,
30143014
extern int __must_check file_check_and_advance_wb_err(struct file *file);
30153015
extern int __must_check file_write_and_wait_range(struct file *file,
30163016
loff_t start, loff_t end);
3017-
int filemap_fdatawrite_range_kick(struct address_space *mapping, loff_t start,
3017+
int filemap_flush_range(struct address_space *mapping, loff_t start,
30183018
loff_t end);
30193019

30203020
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)
30513051
} else if (iocb->ki_flags & IOCB_DONTCACHE) {
30523052
struct address_space *mapping = iocb->ki_filp->f_mapping;
30533053

3054-
filemap_fdatawrite_range_kick(mapping, iocb->ki_pos - count,
3055-
iocb->ki_pos - 1);
3054+
filemap_flush_range(mapping, iocb->ki_pos - count,
3055+
iocb->ki_pos - 1);
30563056
}
30573057

30583058
return count;

include/linux/pagemap.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ int filemap_invalidate_pages(struct address_space *mapping,
3838
int write_inode_now(struct inode *, int sync);
3939
int filemap_fdatawrite(struct address_space *);
4040
int filemap_flush(struct address_space *);
41+
int filemap_flush_nr(struct address_space *mapping, long *nr_to_write);
4142
int filemap_fdatawait_keep_errors(struct address_space *mapping);
4243
int filemap_fdatawait_range(struct address_space *, loff_t lstart, loff_t lend);
4344
int filemap_fdatawait_range_keep_errors(struct address_space *mapping,
@@ -53,14 +54,10 @@ static inline int filemap_fdatawait(struct address_space *mapping)
5354
bool filemap_range_has_page(struct address_space *, loff_t lstart, loff_t lend);
5455
int filemap_write_and_wait_range(struct address_space *mapping,
5556
loff_t lstart, loff_t lend);
56-
int __filemap_fdatawrite_range(struct address_space *mapping,
57-
loff_t start, loff_t end, int sync_mode);
5857
int filemap_fdatawrite_range(struct address_space *mapping,
5958
loff_t start, loff_t end);
6059
int filemap_check_errors(struct address_space *mapping);
6160
void __filemap_set_wb_err(struct address_space *mapping, int err);
62-
int filemap_fdatawrite_wbc(struct address_space *mapping,
63-
struct writeback_control *wbc);
6461
int kiocb_write_and_wait(struct kiocb *iocb, size_t count);
6562

6663
static inline int filemap_write_and_wait(struct address_space *mapping)

mm/fadvise.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,7 @@ int generic_fadvise(struct file *file, loff_t offset, loff_t len, int advice)
111111
spin_unlock(&file->f_lock);
112112
break;
113113
case POSIX_FADV_DONTNEED:
114-
__filemap_fdatawrite_range(mapping, offset, endbyte,
115-
WB_SYNC_NONE);
114+
filemap_flush_range(mapping, offset, endbyte);
116115

117116
/*
118117
* First and last FULL page! Partial pages are deliberately

0 commit comments

Comments
 (0)