@@ -436,7 +436,7 @@ static struct fuse_writepage_args *fuse_find_writeback(struct fuse_inode *fi,
436
436
wpa = rb_entry (n , struct fuse_writepage_args , writepages_entry );
437
437
WARN_ON (get_fuse_inode (wpa -> inode ) != fi );
438
438
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 )
440
440
n = n -> rb_right ;
441
441
else if (idx_to < curr_index )
442
442
n = n -> rb_left ;
@@ -1837,12 +1837,12 @@ static void fuse_writepage_free(struct fuse_writepage_args *wpa)
1837
1837
if (wpa -> bucket )
1838
1838
fuse_sync_bucket_dec (wpa -> bucket );
1839
1839
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 ]);
1842
1842
1843
1843
fuse_file_put (wpa -> ia .ff , false);
1844
1844
1845
- kfree (ap -> pages );
1845
+ kfree (ap -> folios );
1846
1846
kfree (wpa );
1847
1847
}
1848
1848
@@ -1862,8 +1862,8 @@ static void fuse_writepage_finish(struct fuse_writepage_args *wpa)
1862
1862
struct fuse_inode * fi = get_fuse_inode (inode );
1863
1863
int i ;
1864
1864
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 ]);
1867
1867
1868
1868
wake_up (& fi -> page_waitq );
1869
1869
}
@@ -1878,7 +1878,8 @@ __acquires(fi->lock)
1878
1878
struct fuse_inode * fi = get_fuse_inode (wpa -> inode );
1879
1879
struct fuse_write_in * inarg = & wpa -> ia .write .in ;
1880
1880
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 ;
1882
1883
int err ;
1883
1884
1884
1885
fi -> writectr ++ ;
@@ -1919,7 +1920,7 @@ __acquires(fi->lock)
1919
1920
next = aux -> next ;
1920
1921
aux -> next = NULL ;
1921
1922
fuse_writepage_finish_stat (aux -> inode ,
1922
- page_folio ( aux -> ia .ap .pages [0 ]) );
1923
+ aux -> ia .ap .folios [0 ]);
1923
1924
fuse_writepage_free (aux );
1924
1925
}
1925
1926
@@ -1954,11 +1955,11 @@ static struct fuse_writepage_args *fuse_insert_writeback(struct rb_root *root,
1954
1955
struct fuse_writepage_args * wpa )
1955
1956
{
1956
1957
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 ;
1958
1959
struct rb_node * * p = & root -> rb_node ;
1959
1960
struct rb_node * parent = NULL ;
1960
1961
1961
- WARN_ON (!wpa -> ia .ap .num_pages );
1962
+ WARN_ON (!wpa -> ia .ap .num_folios );
1962
1963
while (* p ) {
1963
1964
struct fuse_writepage_args * curr ;
1964
1965
pgoff_t curr_index ;
@@ -1969,7 +1970,7 @@ static struct fuse_writepage_args *fuse_insert_writeback(struct rb_root *root,
1969
1970
WARN_ON (curr -> inode != wpa -> inode );
1970
1971
curr_index = curr -> ia .write .in .offset >> PAGE_SHIFT ;
1971
1972
1972
- if (idx_from >= curr_index + curr -> ia .ap .num_pages )
1973
+ if (idx_from >= curr_index + curr -> ia .ap .num_folios )
1973
1974
p = & (* p )-> rb_right ;
1974
1975
else if (idx_to < curr_index )
1975
1976
p = & (* p )-> rb_left ;
@@ -2101,9 +2102,10 @@ static struct fuse_writepage_args *fuse_writepage_args_alloc(void)
2101
2102
wpa = kzalloc (sizeof (* wpa ), GFP_NOFS );
2102
2103
if (wpa ) {
2103
2104
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 ) {
2107
2109
kfree (wpa );
2108
2110
wpa = NULL ;
2109
2111
}
@@ -2127,16 +2129,16 @@ static void fuse_writepage_add_to_bucket(struct fuse_conn *fc,
2127
2129
}
2128
2130
2129
2131
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 )
2131
2133
{
2132
2134
struct inode * inode = folio -> mapping -> host ;
2133
2135
struct fuse_args_pages * ap = & wpa -> ia .ap ;
2134
2136
2135
2137
folio_copy (tmp_folio , folio );
2136
2138
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 ;
2140
2142
2141
2143
inc_wb_stat (& inode_to_bdi (inode )-> wb , WB_WRITEBACK );
2142
2144
node_stat_add_folio (tmp_folio , NR_WRITEBACK_TEMP );
@@ -2193,7 +2195,7 @@ static int fuse_writepage_locked(struct folio *folio)
2193
2195
goto err_writepage_args ;
2194
2196
2195
2197
ap = & wpa -> ia .ap ;
2196
- ap -> num_pages = 1 ;
2198
+ ap -> num_folios = 1 ;
2197
2199
2198
2200
folio_start_writeback (folio );
2199
2201
fuse_writepage_args_page_fill (wpa , folio , tmp_folio , 0 );
@@ -2221,32 +2223,32 @@ struct fuse_fill_wb_data {
2221
2223
struct fuse_writepage_args * wpa ;
2222
2224
struct fuse_file * ff ;
2223
2225
struct inode * inode ;
2224
- struct page * * orig_pages ;
2225
- unsigned int max_pages ;
2226
+ struct folio * * orig_folios ;
2227
+ unsigned int max_folios ;
2226
2228
};
2227
2229
2228
2230
static bool fuse_pages_realloc (struct fuse_fill_wb_data * data )
2229
2231
{
2230
2232
struct fuse_args_pages * ap = & data -> wpa -> ia .ap ;
2231
2233
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 ),
2237
2239
fc -> max_pages );
2238
- WARN_ON (npages <= data -> max_pages );
2240
+ WARN_ON (nfolios <= data -> max_folios );
2239
2241
2240
- pages = fuse_pages_alloc ( npages , GFP_NOFS , & descs );
2241
- if (!pages )
2242
+ folios = fuse_folios_alloc ( nfolios , GFP_NOFS , & descs );
2243
+ if (!folios )
2242
2244
return false;
2243
2245
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 ;
2250
2252
2251
2253
return true;
2252
2254
}
@@ -2256,16 +2258,16 @@ static void fuse_writepages_send(struct fuse_fill_wb_data *data)
2256
2258
struct fuse_writepage_args * wpa = data -> wpa ;
2257
2259
struct inode * inode = data -> inode ;
2258
2260
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 ;
2260
2262
int i ;
2261
2263
2262
2264
spin_lock (& fi -> lock );
2263
2265
list_add_tail (& wpa -> queue_entry , & fi -> queued_writes );
2264
2266
fuse_flush_writepages (inode );
2265
2267
spin_unlock (& fi -> lock );
2266
2268
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 ]);
2269
2271
}
2270
2272
2271
2273
/*
@@ -2276,15 +2278,15 @@ static void fuse_writepages_send(struct fuse_fill_wb_data *data)
2276
2278
* swapping the new temp page with the old one.
2277
2279
*/
2278
2280
static bool fuse_writepage_add (struct fuse_writepage_args * new_wpa ,
2279
- struct page * page )
2281
+ struct folio * folio )
2280
2282
{
2281
2283
struct fuse_inode * fi = get_fuse_inode (new_wpa -> inode );
2282
2284
struct fuse_writepage_args * tmp ;
2283
2285
struct fuse_writepage_args * old_wpa ;
2284
2286
struct fuse_args_pages * new_ap = & new_wpa -> ia .ap ;
2285
2287
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 ;
2288
2290
2289
2291
spin_lock (& fi -> lock );
2290
2292
old_wpa = fuse_insert_writeback (& fi -> writepages , new_wpa );
@@ -2298,9 +2300,9 @@ static bool fuse_writepage_add(struct fuse_writepage_args *new_wpa,
2298
2300
2299
2301
WARN_ON (tmp -> inode != new_wpa -> inode );
2300
2302
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 ]);
2304
2306
break ;
2305
2307
}
2306
2308
}
@@ -2314,7 +2316,7 @@ static bool fuse_writepage_add(struct fuse_writepage_args *new_wpa,
2314
2316
2315
2317
if (tmp ) {
2316
2318
fuse_writepage_finish_stat (new_wpa -> inode ,
2317
- page_folio ( new_ap -> pages [ 0 ]) );
2319
+ folio );
2318
2320
fuse_writepage_free (new_wpa );
2319
2321
}
2320
2322
@@ -2325,7 +2327,7 @@ static bool fuse_writepage_need_send(struct fuse_conn *fc, struct folio *folio,
2325
2327
struct fuse_args_pages * ap ,
2326
2328
struct fuse_fill_wb_data * data )
2327
2329
{
2328
- WARN_ON (!ap -> num_pages );
2330
+ WARN_ON (!ap -> num_folios );
2329
2331
2330
2332
/*
2331
2333
* 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,
2337
2339
return true;
2338
2340
2339
2341
/* Reached max pages */
2340
- if (ap -> num_pages == fc -> max_pages )
2342
+ if (ap -> num_folios == fc -> max_pages )
2341
2343
return true;
2342
2344
2343
2345
/* 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 )
2345
2347
return true;
2346
2348
2347
2349
/* 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 ))
2349
2351
return true;
2350
2352
2351
2353
/* 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 ))
2353
2355
return true;
2354
2356
2355
2357
return false;
@@ -2393,7 +2395,7 @@ static int fuse_writepages_fill(struct folio *folio,
2393
2395
* This is ensured by holding the page lock in page_mkwrite() while
2394
2396
* checking fuse_page_is_writeback(). We already hold the page lock
2395
2397
* 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 .
2397
2399
* After this fuse_page_is_writeback() will indicate that the page is
2398
2400
* under writeback, so we can release the page lock.
2399
2401
*/
@@ -2405,13 +2407,13 @@ static int fuse_writepages_fill(struct folio *folio,
2405
2407
goto out_unlock ;
2406
2408
}
2407
2409
fuse_file_get (wpa -> ia .ff );
2408
- data -> max_pages = 1 ;
2410
+ data -> max_folios = 1 ;
2409
2411
ap = & wpa -> ia .ap ;
2410
2412
}
2411
2413
folio_start_writeback (folio );
2412
2414
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 ;
2415
2417
2416
2418
err = 0 ;
2417
2419
if (data -> wpa ) {
@@ -2420,9 +2422,9 @@ static int fuse_writepages_fill(struct folio *folio,
2420
2422
* fuse_page_is_writeback().
2421
2423
*/
2422
2424
spin_lock (& fi -> lock );
2423
- ap -> num_pages ++ ;
2425
+ ap -> num_folios ++ ;
2424
2426
spin_unlock (& fi -> lock );
2425
- } else if (fuse_writepage_add (wpa , & folio -> page )) {
2427
+ } else if (fuse_writepage_add (wpa , folio )) {
2426
2428
data -> wpa = wpa ;
2427
2429
} else {
2428
2430
folio_end_writeback (folio );
@@ -2454,21 +2456,21 @@ static int fuse_writepages(struct address_space *mapping,
2454
2456
data .ff = NULL ;
2455
2457
2456
2458
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 )
2461
2463
goto out ;
2462
2464
2463
2465
err = write_cache_pages (mapping , wbc , fuse_writepages_fill , & data );
2464
2466
if (data .wpa ) {
2465
- WARN_ON (!data .wpa -> ia .ap .num_pages );
2467
+ WARN_ON (!data .wpa -> ia .ap .num_folios );
2466
2468
fuse_writepages_send (& data );
2467
2469
}
2468
2470
if (data .ff )
2469
2471
fuse_file_put (data .ff , false);
2470
2472
2471
- kfree (data .orig_pages );
2473
+ kfree (data .orig_folios );
2472
2474
out :
2473
2475
return err ;
2474
2476
}
0 commit comments