Unverified Commit 1097a87d authored by Joanne Koong's avatar Joanne Koong Committed by Christian Brauner
Browse files

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: default avatarJoanne Koong <joannelkoong@gmail.com>
Link: https://lore.kernel.org/20250715202122.2282532-4-joannelkoong@gmail.com


Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent ef7e7cbb
Loading
Loading
Loading
Loading
+12 −40
Original line number Diff line number Diff line
@@ -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);
	}