@@ -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
21292131static 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
22282230static 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 */
22782280static 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 );
24722474out :
24732475 return err ;
24742476}
0 commit comments