Skip to content

Commit cbe9c11

Browse files
joannekoongMiklos Szeredi
authored andcommitted
fuse: convert writebacks to use folios
Convert writeback 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 448895d commit cbe9c11

File tree

1 file changed

+64
-62
lines changed

1 file changed

+64
-62
lines changed

fs/fuse/file.c

Lines changed: 64 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ static struct fuse_writepage_args *fuse_find_writeback(struct fuse_inode *fi,
436436
wpa = rb_entry(n, struct fuse_writepage_args, writepages_entry);
437437
WARN_ON(get_fuse_inode(wpa->inode) != fi);
438438
curr_index = wpa->ia.write.in.offset >> PAGE_SHIFT;
439-
if (idx_from >= curr_index + wpa->ia.ap.num_pages)
439+
if (idx_from >= curr_index + wpa->ia.ap.num_folios)
440440
n = n->rb_right;
441441
else if (idx_to < curr_index)
442442
n = n->rb_left;
@@ -1837,12 +1837,12 @@ static void fuse_writepage_free(struct fuse_writepage_args *wpa)
18371837
if (wpa->bucket)
18381838
fuse_sync_bucket_dec(wpa->bucket);
18391839

1840-
for (i = 0; i < ap->num_pages; i++)
1841-
__free_page(ap->pages[i]);
1840+
for (i = 0; i < ap->num_folios; i++)
1841+
folio_put(ap->folios[i]);
18421842

18431843
fuse_file_put(wpa->ia.ff, false);
18441844

1845-
kfree(ap->pages);
1845+
kfree(ap->folios);
18461846
kfree(wpa);
18471847
}
18481848

@@ -1862,8 +1862,8 @@ static void fuse_writepage_finish(struct fuse_writepage_args *wpa)
18621862
struct fuse_inode *fi = get_fuse_inode(inode);
18631863
int i;
18641864

1865-
for (i = 0; i < ap->num_pages; i++)
1866-
fuse_writepage_finish_stat(inode, page_folio(ap->pages[i]));
1865+
for (i = 0; i < ap->num_folios; i++)
1866+
fuse_writepage_finish_stat(inode, ap->folios[i]);
18671867

18681868
wake_up(&fi->page_waitq);
18691869
}
@@ -1878,7 +1878,8 @@ __acquires(fi->lock)
18781878
struct fuse_inode *fi = get_fuse_inode(wpa->inode);
18791879
struct fuse_write_in *inarg = &wpa->ia.write.in;
18801880
struct fuse_args *args = &wpa->ia.ap.args;
1881-
__u64 data_size = wpa->ia.ap.num_pages * PAGE_SIZE;
1881+
/* Currently, all folios in FUSE are one page */
1882+
__u64 data_size = wpa->ia.ap.num_folios * PAGE_SIZE;
18821883
int err;
18831884

18841885
fi->writectr++;
@@ -1919,7 +1920,7 @@ __acquires(fi->lock)
19191920
next = aux->next;
19201921
aux->next = NULL;
19211922
fuse_writepage_finish_stat(aux->inode,
1922-
page_folio(aux->ia.ap.pages[0]));
1923+
aux->ia.ap.folios[0]);
19231924
fuse_writepage_free(aux);
19241925
}
19251926

@@ -1954,11 +1955,11 @@ static struct fuse_writepage_args *fuse_insert_writeback(struct rb_root *root,
19541955
struct fuse_writepage_args *wpa)
19551956
{
19561957
pgoff_t idx_from = wpa->ia.write.in.offset >> PAGE_SHIFT;
1957-
pgoff_t idx_to = idx_from + wpa->ia.ap.num_pages - 1;
1958+
pgoff_t idx_to = idx_from + wpa->ia.ap.num_folios - 1;
19581959
struct rb_node **p = &root->rb_node;
19591960
struct rb_node *parent = NULL;
19601961

1961-
WARN_ON(!wpa->ia.ap.num_pages);
1962+
WARN_ON(!wpa->ia.ap.num_folios);
19621963
while (*p) {
19631964
struct fuse_writepage_args *curr;
19641965
pgoff_t curr_index;
@@ -1969,7 +1970,7 @@ static struct fuse_writepage_args *fuse_insert_writeback(struct rb_root *root,
19691970
WARN_ON(curr->inode != wpa->inode);
19701971
curr_index = curr->ia.write.in.offset >> PAGE_SHIFT;
19711972

1972-
if (idx_from >= curr_index + curr->ia.ap.num_pages)
1973+
if (idx_from >= curr_index + curr->ia.ap.num_folios)
19731974
p = &(*p)->rb_right;
19741975
else if (idx_to < curr_index)
19751976
p = &(*p)->rb_left;
@@ -2101,9 +2102,10 @@ static struct fuse_writepage_args *fuse_writepage_args_alloc(void)
21012102
wpa = kzalloc(sizeof(*wpa), GFP_NOFS);
21022103
if (wpa) {
21032104
ap = &wpa->ia.ap;
2104-
ap->num_pages = 0;
2105-
ap->pages = fuse_pages_alloc(1, GFP_NOFS, &ap->descs);
2106-
if (!ap->pages) {
2105+
ap->num_folios = 0;
2106+
ap->uses_folios = true;
2107+
ap->folios = fuse_folios_alloc(1, GFP_NOFS, &ap->folio_descs);
2108+
if (!ap->folios) {
21072109
kfree(wpa);
21082110
wpa = NULL;
21092111
}
@@ -2127,16 +2129,16 @@ static void fuse_writepage_add_to_bucket(struct fuse_conn *fc,
21272129
}
21282130

21292131
static void fuse_writepage_args_page_fill(struct fuse_writepage_args *wpa, struct folio *folio,
2130-
struct folio *tmp_folio, uint32_t page_index)
2132+
struct folio *tmp_folio, uint32_t folio_index)
21312133
{
21322134
struct inode *inode = folio->mapping->host;
21332135
struct fuse_args_pages *ap = &wpa->ia.ap;
21342136

21352137
folio_copy(tmp_folio, folio);
21362138

2137-
ap->pages[page_index] = &tmp_folio->page;
2138-
ap->descs[page_index].offset = 0;
2139-
ap->descs[page_index].length = PAGE_SIZE;
2139+
ap->folios[folio_index] = tmp_folio;
2140+
ap->folio_descs[folio_index].offset = 0;
2141+
ap->folio_descs[folio_index].length = PAGE_SIZE;
21402142

21412143
inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK);
21422144
node_stat_add_folio(tmp_folio, NR_WRITEBACK_TEMP);
@@ -2193,7 +2195,7 @@ static int fuse_writepage_locked(struct folio *folio)
21932195
goto err_writepage_args;
21942196

21952197
ap = &wpa->ia.ap;
2196-
ap->num_pages = 1;
2198+
ap->num_folios = 1;
21972199

21982200
folio_start_writeback(folio);
21992201
fuse_writepage_args_page_fill(wpa, folio, tmp_folio, 0);
@@ -2221,32 +2223,32 @@ struct fuse_fill_wb_data {
22212223
struct fuse_writepage_args *wpa;
22222224
struct fuse_file *ff;
22232225
struct inode *inode;
2224-
struct page **orig_pages;
2225-
unsigned int max_pages;
2226+
struct folio **orig_folios;
2227+
unsigned int max_folios;
22262228
};
22272229

22282230
static bool fuse_pages_realloc(struct fuse_fill_wb_data *data)
22292231
{
22302232
struct fuse_args_pages *ap = &data->wpa->ia.ap;
22312233
struct fuse_conn *fc = get_fuse_conn(data->inode);
2232-
struct page **pages;
2233-
struct fuse_page_desc *descs;
2234-
unsigned int npages = min_t(unsigned int,
2235-
max_t(unsigned int, data->max_pages * 2,
2236-
FUSE_DEFAULT_MAX_PAGES_PER_REQ),
2234+
struct folio **folios;
2235+
struct fuse_folio_desc *descs;
2236+
unsigned int nfolios = min_t(unsigned int,
2237+
max_t(unsigned int, data->max_folios * 2,
2238+
FUSE_DEFAULT_MAX_PAGES_PER_REQ),
22372239
fc->max_pages);
2238-
WARN_ON(npages <= data->max_pages);
2240+
WARN_ON(nfolios <= data->max_folios);
22392241

2240-
pages = fuse_pages_alloc(npages, GFP_NOFS, &descs);
2241-
if (!pages)
2242+
folios = fuse_folios_alloc(nfolios, GFP_NOFS, &descs);
2243+
if (!folios)
22422244
return false;
22432245

2244-
memcpy(pages, ap->pages, sizeof(struct page *) * ap->num_pages);
2245-
memcpy(descs, ap->descs, sizeof(struct fuse_page_desc) * ap->num_pages);
2246-
kfree(ap->pages);
2247-
ap->pages = pages;
2248-
ap->descs = descs;
2249-
data->max_pages = npages;
2246+
memcpy(folios, ap->folios, sizeof(struct folio *) * ap->num_folios);
2247+
memcpy(descs, ap->folio_descs, sizeof(struct fuse_folio_desc) * ap->num_folios);
2248+
kfree(ap->folios);
2249+
ap->folios = folios;
2250+
ap->folio_descs = descs;
2251+
data->max_folios = nfolios;
22502252

22512253
return true;
22522254
}
@@ -2256,16 +2258,16 @@ static void fuse_writepages_send(struct fuse_fill_wb_data *data)
22562258
struct fuse_writepage_args *wpa = data->wpa;
22572259
struct inode *inode = data->inode;
22582260
struct fuse_inode *fi = get_fuse_inode(inode);
2259-
int num_pages = wpa->ia.ap.num_pages;
2261+
int num_folios = wpa->ia.ap.num_folios;
22602262
int i;
22612263

22622264
spin_lock(&fi->lock);
22632265
list_add_tail(&wpa->queue_entry, &fi->queued_writes);
22642266
fuse_flush_writepages(inode);
22652267
spin_unlock(&fi->lock);
22662268

2267-
for (i = 0; i < num_pages; i++)
2268-
end_page_writeback(data->orig_pages[i]);
2269+
for (i = 0; i < num_folios; i++)
2270+
folio_end_writeback(data->orig_folios[i]);
22692271
}
22702272

22712273
/*
@@ -2276,15 +2278,15 @@ static void fuse_writepages_send(struct fuse_fill_wb_data *data)
22762278
* swapping the new temp page with the old one.
22772279
*/
22782280
static bool fuse_writepage_add(struct fuse_writepage_args *new_wpa,
2279-
struct page *page)
2281+
struct folio *folio)
22802282
{
22812283
struct fuse_inode *fi = get_fuse_inode(new_wpa->inode);
22822284
struct fuse_writepage_args *tmp;
22832285
struct fuse_writepage_args *old_wpa;
22842286
struct fuse_args_pages *new_ap = &new_wpa->ia.ap;
22852287

2286-
WARN_ON(new_ap->num_pages != 0);
2287-
new_ap->num_pages = 1;
2288+
WARN_ON(new_ap->num_folios != 0);
2289+
new_ap->num_folios = 1;
22882290

22892291
spin_lock(&fi->lock);
22902292
old_wpa = fuse_insert_writeback(&fi->writepages, new_wpa);
@@ -2298,9 +2300,9 @@ static bool fuse_writepage_add(struct fuse_writepage_args *new_wpa,
22982300

22992301
WARN_ON(tmp->inode != new_wpa->inode);
23002302
curr_index = tmp->ia.write.in.offset >> PAGE_SHIFT;
2301-
if (curr_index == page->index) {
2302-
WARN_ON(tmp->ia.ap.num_pages != 1);
2303-
swap(tmp->ia.ap.pages[0], new_ap->pages[0]);
2303+
if (curr_index == folio->index) {
2304+
WARN_ON(tmp->ia.ap.num_folios != 1);
2305+
swap(tmp->ia.ap.folios[0], new_ap->folios[0]);
23042306
break;
23052307
}
23062308
}
@@ -2314,7 +2316,7 @@ static bool fuse_writepage_add(struct fuse_writepage_args *new_wpa,
23142316

23152317
if (tmp) {
23162318
fuse_writepage_finish_stat(new_wpa->inode,
2317-
page_folio(new_ap->pages[0]));
2319+
folio);
23182320
fuse_writepage_free(new_wpa);
23192321
}
23202322

@@ -2325,7 +2327,7 @@ static bool fuse_writepage_need_send(struct fuse_conn *fc, struct folio *folio,
23252327
struct fuse_args_pages *ap,
23262328
struct fuse_fill_wb_data *data)
23272329
{
2328-
WARN_ON(!ap->num_pages);
2330+
WARN_ON(!ap->num_folios);
23292331

23302332
/*
23312333
* Being under writeback is unlikely but possible. For example direct
@@ -2337,19 +2339,19 @@ static bool fuse_writepage_need_send(struct fuse_conn *fc, struct folio *folio,
23372339
return true;
23382340

23392341
/* Reached max pages */
2340-
if (ap->num_pages == fc->max_pages)
2342+
if (ap->num_folios == fc->max_pages)
23412343
return true;
23422344

23432345
/* Reached max write bytes */
2344-
if ((ap->num_pages + 1) * PAGE_SIZE > fc->max_write)
2346+
if ((ap->num_folios + 1) * PAGE_SIZE > fc->max_write)
23452347
return true;
23462348

23472349
/* Discontinuity */
2348-
if (data->orig_pages[ap->num_pages - 1]->index + 1 != folio_index(folio))
2350+
if (data->orig_folios[ap->num_folios - 1]->index + 1 != folio_index(folio))
23492351
return true;
23502352

23512353
/* Need to grow the pages array? If so, did the expansion fail? */
2352-
if (ap->num_pages == data->max_pages && !fuse_pages_realloc(data))
2354+
if (ap->num_folios == data->max_folios && !fuse_pages_realloc(data))
23532355
return true;
23542356

23552357
return false;
@@ -2393,7 +2395,7 @@ static int fuse_writepages_fill(struct folio *folio,
23932395
* This is ensured by holding the page lock in page_mkwrite() while
23942396
* checking fuse_page_is_writeback(). We already hold the page lock
23952397
* since clear_page_dirty_for_io() and keep it held until we add the
2396-
* request to the fi->writepages list and increment ap->num_pages.
2398+
* request to the fi->writepages list and increment ap->num_folios.
23972399
* After this fuse_page_is_writeback() will indicate that the page is
23982400
* under writeback, so we can release the page lock.
23992401
*/
@@ -2405,13 +2407,13 @@ static int fuse_writepages_fill(struct folio *folio,
24052407
goto out_unlock;
24062408
}
24072409
fuse_file_get(wpa->ia.ff);
2408-
data->max_pages = 1;
2410+
data->max_folios = 1;
24092411
ap = &wpa->ia.ap;
24102412
}
24112413
folio_start_writeback(folio);
24122414

2413-
fuse_writepage_args_page_fill(wpa, folio, tmp_folio, ap->num_pages);
2414-
data->orig_pages[ap->num_pages] = &folio->page;
2415+
fuse_writepage_args_page_fill(wpa, folio, tmp_folio, ap->num_folios);
2416+
data->orig_folios[ap->num_folios] = folio;
24152417

24162418
err = 0;
24172419
if (data->wpa) {
@@ -2420,9 +2422,9 @@ static int fuse_writepages_fill(struct folio *folio,
24202422
* fuse_page_is_writeback().
24212423
*/
24222424
spin_lock(&fi->lock);
2423-
ap->num_pages++;
2425+
ap->num_folios++;
24242426
spin_unlock(&fi->lock);
2425-
} else if (fuse_writepage_add(wpa, &folio->page)) {
2427+
} else if (fuse_writepage_add(wpa, folio)) {
24262428
data->wpa = wpa;
24272429
} else {
24282430
folio_end_writeback(folio);
@@ -2454,21 +2456,21 @@ static int fuse_writepages(struct address_space *mapping,
24542456
data.ff = NULL;
24552457

24562458
err = -ENOMEM;
2457-
data.orig_pages = kcalloc(fc->max_pages,
2458-
sizeof(struct page *),
2459-
GFP_NOFS);
2460-
if (!data.orig_pages)
2459+
data.orig_folios = kcalloc(fc->max_pages,
2460+
sizeof(struct folio *),
2461+
GFP_NOFS);
2462+
if (!data.orig_folios)
24612463
goto out;
24622464

24632465
err = write_cache_pages(mapping, wbc, fuse_writepages_fill, &data);
24642466
if (data.wpa) {
2465-
WARN_ON(!data.wpa->ia.ap.num_pages);
2467+
WARN_ON(!data.wpa->ia.ap.num_folios);
24662468
fuse_writepages_send(&data);
24672469
}
24682470
if (data.ff)
24692471
fuse_file_put(data.ff, false);
24702472

2471-
kfree(data.orig_pages);
2473+
kfree(data.orig_folios);
24722474
out:
24732475
return err;
24742476
}

0 commit comments

Comments
 (0)