fuse: use iomap for folio laundering

Use iomap for folio laundering, which will do granular dirty
writeback when laundering a large folio.

Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
Link: https://lore.kernel.org/20250715202122.2282532-4-joannelkoong@gmail.com
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
Joanne Koong 2025-07-15 13:21:20 -07:00 committed by Christian Brauner
parent ef7e7cbb32
commit 1097a87dcb
No known key found for this signature in database
GPG Key ID: 91C61BC06578DCA2

View File

@ -2058,45 +2058,6 @@ static struct fuse_writepage_args *fuse_writepage_args_setup(struct folio *folio
return wpa;
}
static int fuse_writepage_locked(struct folio *folio)
{
struct address_space *mapping = folio->mapping;
struct inode *inode = mapping->host;
struct fuse_inode *fi = get_fuse_inode(inode);
struct fuse_writepage_args *wpa;
struct fuse_args_pages *ap;
struct fuse_file *ff;
int error = -EIO;
ff = fuse_write_file_get(fi);
if (!ff)
goto err;
wpa = fuse_writepage_args_setup(folio, 0, ff);
error = -ENOMEM;
if (!wpa)
goto err_writepage_args;
ap = &wpa->ia.ap;
ap->num_folios = 1;
folio_start_writeback(folio);
fuse_writepage_args_page_fill(wpa, folio, 0, 0, folio_size(folio));
spin_lock(&fi->lock);
list_add_tail(&wpa->queue_entry, &fi->queued_writes);
fuse_flush_writepages(inode);
spin_unlock(&fi->lock);
return 0;
err_writepage_args:
fuse_file_put(ff, false);
err:
mapping_set_error(folio->mapping, error);
return error;
}
struct fuse_fill_wb_data {
struct fuse_writepage_args *wpa;
struct fuse_file *ff;
@ -2282,8 +2243,19 @@ static int fuse_writepages(struct address_space *mapping,
static int fuse_launder_folio(struct folio *folio)
{
int err = 0;
struct fuse_fill_wb_data data = {
.inode = folio->mapping->host,
};
struct iomap_writepage_ctx wpc = {
.inode = folio->mapping->host,
.iomap.type = IOMAP_MAPPED,
.ops = &fuse_writeback_ops,
.wb_ctx = &data,
};
if (folio_clear_dirty_for_io(folio)) {
err = fuse_writepage_locked(folio);
err = iomap_writeback_folio(&wpc, folio);
err = fuse_iomap_writeback_submit(&wpc, err);
if (!err)
folio_wait_writeback(folio);
}