mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 16:12:59 +02:00
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:
parent
ef7e7cbb32
commit
1097a87dcb
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user