mirror of
https://github.com/torvalds/linux.git
synced 2026-01-25 15:03:52 +08:00
fuse: support large folios for writeback
Add support for folios larger than one page size for writeback. Signed-off-by: Joanne Koong <joannelkoong@gmail.com> Reviewed-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
This commit is contained in:
committed by
Miklos Szeredi
parent
906354c87f
commit
f3cb8bd908
@@ -1988,7 +1988,7 @@ static void fuse_writepage_args_page_fill(struct fuse_writepage_args *wpa, struc
|
||||
|
||||
ap->folios[folio_index] = folio;
|
||||
ap->descs[folio_index].offset = 0;
|
||||
ap->descs[folio_index].length = PAGE_SIZE;
|
||||
ap->descs[folio_index].length = folio_size(folio);
|
||||
|
||||
inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK);
|
||||
}
|
||||
@@ -2062,6 +2062,7 @@ struct fuse_fill_wb_data {
|
||||
struct fuse_file *ff;
|
||||
struct inode *inode;
|
||||
unsigned int max_folios;
|
||||
unsigned int nr_pages;
|
||||
};
|
||||
|
||||
static bool fuse_pages_realloc(struct fuse_fill_wb_data *data)
|
||||
@@ -2109,15 +2110,15 @@ static bool fuse_writepage_need_send(struct fuse_conn *fc, struct folio *folio,
|
||||
WARN_ON(!ap->num_folios);
|
||||
|
||||
/* Reached max pages */
|
||||
if (ap->num_folios == fc->max_pages)
|
||||
if (data->nr_pages + folio_nr_pages(folio) > fc->max_pages)
|
||||
return true;
|
||||
|
||||
/* Reached max write bytes */
|
||||
if ((ap->num_folios + 1) * PAGE_SIZE > fc->max_write)
|
||||
if ((data->nr_pages * PAGE_SIZE) + folio_size(folio) > fc->max_write)
|
||||
return true;
|
||||
|
||||
/* Discontinuity */
|
||||
if (ap->folios[ap->num_folios - 1]->index + 1 != folio_index(folio))
|
||||
if (folio_next_index(ap->folios[ap->num_folios - 1]) != folio_index(folio))
|
||||
return true;
|
||||
|
||||
/* Need to grow the pages array? If so, did the expansion fail? */
|
||||
@@ -2148,6 +2149,7 @@ static int fuse_writepages_fill(struct folio *folio,
|
||||
if (wpa && fuse_writepage_need_send(fc, folio, ap, data)) {
|
||||
fuse_writepages_send(data);
|
||||
data->wpa = NULL;
|
||||
data->nr_pages = 0;
|
||||
}
|
||||
|
||||
if (data->wpa == NULL) {
|
||||
@@ -2162,6 +2164,7 @@ static int fuse_writepages_fill(struct folio *folio,
|
||||
folio_start_writeback(folio);
|
||||
|
||||
fuse_writepage_args_page_fill(wpa, folio, ap->num_folios);
|
||||
data->nr_pages += folio_nr_pages(folio);
|
||||
|
||||
err = 0;
|
||||
ap->num_folios++;
|
||||
@@ -2192,6 +2195,7 @@ static int fuse_writepages(struct address_space *mapping,
|
||||
data.inode = inode;
|
||||
data.wpa = NULL;
|
||||
data.ff = NULL;
|
||||
data.nr_pages = 0;
|
||||
|
||||
err = write_cache_pages(mapping, wbc, fuse_writepages_fill, &data);
|
||||
if (data.wpa) {
|
||||
|
||||
Reference in New Issue
Block a user