Skip to content

Commit f2ef459

Browse files
joannekoongMiklos Szeredi
authored andcommitted
fuse: convert writes (non-writeback) to use folios
Convert non-writeback write requests to use folios instead of pages. No functional changes. Signed-off-by: Joanne Koong <[email protected]> Reviewed-by: Josef Bacik <[email protected]> Signed-off-by: Miklos Szeredi <[email protected]>
1 parent 51b0253 commit f2ef459

File tree

2 files changed

+19
-16
lines changed

2 files changed

+19
-16
lines changed

fs/fuse/file.c

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,8 +1197,8 @@ static ssize_t fuse_send_write_pages(struct fuse_io_args *ia,
11971197
bool short_write;
11981198
int err;
11991199

1200-
for (i = 0; i < ap->num_pages; i++)
1201-
fuse_wait_on_page_writeback(inode, ap->pages[i]->index);
1200+
for (i = 0; i < ap->num_folios; i++)
1201+
fuse_wait_on_folio_writeback(inode, ap->folios[i]);
12021202

12031203
fuse_write_args_fill(ia, ff, pos, count);
12041204
ia->write.in.flags = fuse_write_flags(iocb);
@@ -1210,10 +1210,10 @@ static ssize_t fuse_send_write_pages(struct fuse_io_args *ia,
12101210
err = -EIO;
12111211

12121212
short_write = ia->write.out.size < count;
1213-
offset = ap->descs[0].offset;
1213+
offset = ap->folio_descs[0].offset;
12141214
count = ia->write.out.size;
1215-
for (i = 0; i < ap->num_pages; i++) {
1216-
struct folio *folio = page_folio(ap->pages[i]);
1215+
for (i = 0; i < ap->num_folios; i++) {
1216+
struct folio *folio = ap->folios[i];
12171217

12181218
if (err) {
12191219
folio_clear_uptodate(folio);
@@ -1227,7 +1227,7 @@ static ssize_t fuse_send_write_pages(struct fuse_io_args *ia,
12271227
}
12281228
offset = 0;
12291229
}
1230-
if (ia->write.page_locked && (i == ap->num_pages - 1))
1230+
if (ia->write.folio_locked && (i == ap->num_folios - 1))
12311231
folio_unlock(folio);
12321232
folio_put(folio);
12331233
}
@@ -1243,11 +1243,12 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia,
12431243
struct fuse_args_pages *ap = &ia->ap;
12441244
struct fuse_conn *fc = get_fuse_conn(mapping->host);
12451245
unsigned offset = pos & (PAGE_SIZE - 1);
1246+
unsigned int nr_pages = 0;
12461247
size_t count = 0;
12471248
int err;
12481249

12491250
ap->args.in_pages = true;
1250-
ap->descs[0].offset = offset;
1251+
ap->folio_descs[0].offset = offset;
12511252

12521253
do {
12531254
size_t tmp;
@@ -1283,9 +1284,10 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia,
12831284
}
12841285

12851286
err = 0;
1286-
ap->pages[ap->num_pages] = &folio->page;
1287-
ap->descs[ap->num_pages].length = tmp;
1288-
ap->num_pages++;
1287+
ap->folios[ap->num_folios] = folio;
1288+
ap->folio_descs[ap->num_folios].length = tmp;
1289+
ap->num_folios++;
1290+
nr_pages++;
12891291

12901292
count += tmp;
12911293
pos += tmp;
@@ -1300,13 +1302,13 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia,
13001302
if (folio_test_uptodate(folio)) {
13011303
folio_unlock(folio);
13021304
} else {
1303-
ia->write.page_locked = true;
1305+
ia->write.folio_locked = true;
13041306
break;
13051307
}
13061308
if (!fc->big_writes)
13071309
break;
13081310
} while (iov_iter_count(ii) && count < fc->max_write &&
1309-
ap->num_pages < max_pages && offset == 0);
1311+
nr_pages < max_pages && offset == 0);
13101312

13111313
return count > 0 ? count : err;
13121314
}
@@ -1340,8 +1342,9 @@ static ssize_t fuse_perform_write(struct kiocb *iocb, struct iov_iter *ii)
13401342
unsigned int nr_pages = fuse_wr_pages(pos, iov_iter_count(ii),
13411343
fc->max_pages);
13421344

1343-
ap->pages = fuse_pages_alloc(nr_pages, GFP_KERNEL, &ap->descs);
1344-
if (!ap->pages) {
1345+
ap->uses_folios = true;
1346+
ap->folios = fuse_folios_alloc(nr_pages, GFP_KERNEL, &ap->folio_descs);
1347+
if (!ap->folios) {
13451348
err = -ENOMEM;
13461349
break;
13471350
}
@@ -1363,7 +1366,7 @@ static ssize_t fuse_perform_write(struct kiocb *iocb, struct iov_iter *ii)
13631366
err = -EIO;
13641367
}
13651368
}
1366-
kfree(ap->pages);
1369+
kfree(ap->folios);
13671370
} while (!err && iov_iter_count(ii));
13681371

13691372
fuse_write_update_attr(inode, pos, res);

fs/fuse/fuse_i.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1096,7 +1096,7 @@ struct fuse_io_args {
10961096
struct {
10971097
struct fuse_write_in in;
10981098
struct fuse_write_out out;
1099-
bool page_locked;
1099+
bool folio_locked;
11001100
} write;
11011101
};
11021102
struct fuse_args_pages ap;

0 commit comments

Comments
 (0)