Skip to content

Commit f3cb8bd

Browse files
joannekoongMiklos Szeredi
authored andcommitted
fuse: support large folios for writeback
Add support for folios larger than one page size for writeback. Signed-off-by: Joanne Koong <[email protected]> Reviewed-by: Josef Bacik <[email protected]> Reviewed-by: Jeff Layton <[email protected]> Signed-off-by: Miklos Szeredi <[email protected]>
1 parent 906354c commit f3cb8bd

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

fs/fuse/file.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1988,7 +1988,7 @@ static void fuse_writepage_args_page_fill(struct fuse_writepage_args *wpa, struc
19881988

19891989
ap->folios[folio_index] = folio;
19901990
ap->descs[folio_index].offset = 0;
1991-
ap->descs[folio_index].length = PAGE_SIZE;
1991+
ap->descs[folio_index].length = folio_size(folio);
19921992

19931993
inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK);
19941994
}
@@ -2062,6 +2062,7 @@ struct fuse_fill_wb_data {
20622062
struct fuse_file *ff;
20632063
struct inode *inode;
20642064
unsigned int max_folios;
2065+
unsigned int nr_pages;
20652066
};
20662067

20672068
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,
21092110
WARN_ON(!ap->num_folios);
21102111

21112112
/* Reached max pages */
2112-
if (ap->num_folios == fc->max_pages)
2113+
if (data->nr_pages + folio_nr_pages(folio) > fc->max_pages)
21132114
return true;
21142115

21152116
/* Reached max write bytes */
2116-
if ((ap->num_folios + 1) * PAGE_SIZE > fc->max_write)
2117+
if ((data->nr_pages * PAGE_SIZE) + folio_size(folio) > fc->max_write)
21172118
return true;
21182119

21192120
/* Discontinuity */
2120-
if (ap->folios[ap->num_folios - 1]->index + 1 != folio_index(folio))
2121+
if (folio_next_index(ap->folios[ap->num_folios - 1]) != folio_index(folio))
21212122
return true;
21222123

21232124
/* Need to grow the pages array? If so, did the expansion fail? */
@@ -2148,6 +2149,7 @@ static int fuse_writepages_fill(struct folio *folio,
21482149
if (wpa && fuse_writepage_need_send(fc, folio, ap, data)) {
21492150
fuse_writepages_send(data);
21502151
data->wpa = NULL;
2152+
data->nr_pages = 0;
21512153
}
21522154

21532155
if (data->wpa == NULL) {
@@ -2162,6 +2164,7 @@ static int fuse_writepages_fill(struct folio *folio,
21622164
folio_start_writeback(folio);
21632165

21642166
fuse_writepage_args_page_fill(wpa, folio, ap->num_folios);
2167+
data->nr_pages += folio_nr_pages(folio);
21652168

21662169
err = 0;
21672170
ap->num_folios++;
@@ -2192,6 +2195,7 @@ static int fuse_writepages(struct address_space *mapping,
21922195
data.inode = inode;
21932196
data.wpa = NULL;
21942197
data.ff = NULL;
2198+
data.nr_pages = 0;
21952199

21962200
err = write_cache_pages(mapping, wbc, fuse_writepages_fill, &data);
21972201
if (data.wpa) {

0 commit comments

Comments
 (0)