@@ -130,7 +130,7 @@ enum {
130130 scrub_bitmap_nr_last ,
131131};
132132
133- #define SCRUB_STRIPE_PAGES (BTRFS_STRIPE_LEN / PAGE_SIZE)
133+ #define SCRUB_STRIPE_MAX_FOLIOS (BTRFS_STRIPE_LEN / PAGE_SIZE)
134134
135135/*
136136 * Represent one contiguous range with a length of BTRFS_STRIPE_LEN.
@@ -139,7 +139,7 @@ struct scrub_stripe {
139139 struct scrub_ctx * sctx ;
140140 struct btrfs_block_group * bg ;
141141
142- struct page * pages [ SCRUB_STRIPE_PAGES ];
142+ struct folio * folios [ SCRUB_STRIPE_MAX_FOLIOS ];
143143 struct scrub_sector_verification * sectors ;
144144
145145 struct btrfs_device * dev ;
@@ -339,10 +339,10 @@ static void release_scrub_stripe(struct scrub_stripe *stripe)
339339 if (!stripe )
340340 return ;
341341
342- for (int i = 0 ; i < SCRUB_STRIPE_PAGES ; i ++ ) {
343- if (stripe -> pages [i ])
344- __free_page (stripe -> pages [i ]);
345- stripe -> pages [i ] = NULL ;
342+ for (int i = 0 ; i < SCRUB_STRIPE_MAX_FOLIOS ; i ++ ) {
343+ if (stripe -> folios [i ])
344+ folio_put (stripe -> folios [i ]);
345+ stripe -> folios [i ] = NULL ;
346346 }
347347 kfree (stripe -> sectors );
348348 kfree (stripe -> csums );
@@ -355,6 +355,7 @@ static void release_scrub_stripe(struct scrub_stripe *stripe)
355355static int init_scrub_stripe (struct btrfs_fs_info * fs_info ,
356356 struct scrub_stripe * stripe )
357357{
358+ const u32 min_folio_shift = PAGE_SHIFT + fs_info -> block_min_order ;
358359 int ret ;
359360
360361 memset (stripe , 0 , sizeof (* stripe ));
@@ -367,7 +368,9 @@ static int init_scrub_stripe(struct btrfs_fs_info *fs_info,
367368 atomic_set (& stripe -> pending_io , 0 );
368369 spin_lock_init (& stripe -> write_error_lock );
369370
370- ret = btrfs_alloc_page_array (SCRUB_STRIPE_PAGES , stripe -> pages , false);
371+ ASSERT (BTRFS_STRIPE_LEN >> min_folio_shift <= SCRUB_STRIPE_MAX_FOLIOS );
372+ ret = btrfs_alloc_folio_array (BTRFS_STRIPE_LEN >> min_folio_shift ,
373+ fs_info -> block_min_order , stripe -> folios );
371374 if (ret < 0 )
372375 goto error ;
373376
@@ -687,27 +690,30 @@ static int fill_writer_pointer_gap(struct scrub_ctx *sctx, u64 physical)
687690
688691static void * scrub_stripe_get_kaddr (struct scrub_stripe * stripe , int sector_nr )
689692{
690- u32 offset = (sector_nr << stripe -> bg -> fs_info -> sectorsize_bits );
691- const struct page * page = stripe -> pages [offset >> PAGE_SHIFT ];
693+ struct btrfs_fs_info * fs_info = stripe -> bg -> fs_info ;
694+ const u32 min_folio_shift = PAGE_SHIFT + fs_info -> block_min_order ;
695+ u32 offset = (sector_nr << fs_info -> sectorsize_bits );
696+ const struct folio * folio = stripe -> folios [offset >> min_folio_shift ];
692697
693- /* stripe->pages [] is allocated by us and no highmem is allowed. */
694- ASSERT (page );
695- ASSERT (!PageHighMem ( page ));
696- return page_address ( page ) + offset_in_page ( offset );
698+ /* stripe->folios [] is allocated by us and no highmem is allowed. */
699+ ASSERT (folio );
700+ ASSERT (!folio_test_partial_kmap ( folio ));
701+ return folio_address ( folio ) + offset_in_folio ( folio , offset );
697702}
698703
699704static phys_addr_t scrub_stripe_get_paddr (struct scrub_stripe * stripe , int sector_nr )
700705{
701706 struct btrfs_fs_info * fs_info = stripe -> bg -> fs_info ;
707+ const u32 min_folio_shift = PAGE_SHIFT + fs_info -> block_min_order ;
702708 u32 offset = (sector_nr << fs_info -> sectorsize_bits );
703- const struct page * page = stripe -> pages [offset >> PAGE_SHIFT ];
709+ const struct folio * folio = stripe -> folios [offset >> min_folio_shift ];
704710
705- /* stripe->pages [] is allocated by us and no highmem is allowed. */
706- ASSERT (page );
707- ASSERT (!PageHighMem ( page ));
708- /* And the range must be contained inside the page . */
709- ASSERT (offset_in_page ( offset ) + fs_info -> sectorsize <= PAGE_SIZE );
710- return page_to_phys (page ) + offset_in_page ( offset );
711+ /* stripe->folios [] is allocated by us and no highmem is allowed. */
712+ ASSERT (folio );
713+ ASSERT (!folio_test_partial_kmap ( folio ));
714+ /* And the range must be contained inside the folio . */
715+ ASSERT (offset_in_folio ( folio , offset ) + fs_info -> sectorsize <= folio_size ( folio ) );
716+ return page_to_phys (folio_page ( folio , 0 )) + offset_in_folio ( folio , offset );
711717}
712718
713719static void scrub_verify_one_metadata (struct scrub_stripe * stripe , int sector_nr )
@@ -1872,6 +1878,7 @@ static void scrub_submit_initial_read(struct scrub_ctx *sctx,
18721878{
18731879 struct btrfs_fs_info * fs_info = sctx -> fs_info ;
18741880 struct btrfs_bio * bbio ;
1881+ const u32 min_folio_shift = PAGE_SHIFT + fs_info -> block_min_order ;
18751882 unsigned int nr_sectors = stripe_length (stripe ) >> fs_info -> sectorsize_bits ;
18761883 int mirror = stripe -> mirror_num ;
18771884
@@ -1884,7 +1891,7 @@ static void scrub_submit_initial_read(struct scrub_ctx *sctx,
18841891 return ;
18851892 }
18861893
1887- bbio = btrfs_bio_alloc (SCRUB_STRIPE_PAGES , REQ_OP_READ , fs_info ,
1894+ bbio = btrfs_bio_alloc (BTRFS_STRIPE_LEN >> min_folio_shift , REQ_OP_READ , fs_info ,
18881895 scrub_read_endio , stripe );
18891896
18901897 bbio -> bio .bi_iter .bi_sector = stripe -> logical >> SECTOR_SHIFT ;
@@ -2215,7 +2222,7 @@ static int scrub_raid56_parity_stripe(struct scrub_ctx *sctx,
22152222 for (int i = 0 ; i < data_stripes ; i ++ ) {
22162223 stripe = & sctx -> raid56_data_stripes [i ];
22172224
2218- raid56_parity_cache_data_pages (rbio , stripe -> pages ,
2225+ raid56_parity_cache_data_folios (rbio , stripe -> folios ,
22192226 full_stripe_start + (i << BTRFS_STRIPE_LEN_SHIFT ));
22202227 }
22212228 raid56_parity_submit_scrub_rbio (rbio );
0 commit comments