@@ -130,7 +130,7 @@ enum {
130
130
scrub_bitmap_nr_last ,
131
131
};
132
132
133
- #define SCRUB_STRIPE_PAGES (BTRFS_STRIPE_LEN / PAGE_SIZE)
133
+ #define SCRUB_STRIPE_MAX_FOLIOS (BTRFS_STRIPE_LEN / PAGE_SIZE)
134
134
135
135
/*
136
136
* Represent one contiguous range with a length of BTRFS_STRIPE_LEN.
@@ -139,7 +139,7 @@ struct scrub_stripe {
139
139
struct scrub_ctx * sctx ;
140
140
struct btrfs_block_group * bg ;
141
141
142
- struct page * pages [ SCRUB_STRIPE_PAGES ];
142
+ struct folio * folios [ SCRUB_STRIPE_MAX_FOLIOS ];
143
143
struct scrub_sector_verification * sectors ;
144
144
145
145
struct btrfs_device * dev ;
@@ -339,10 +339,10 @@ static void release_scrub_stripe(struct scrub_stripe *stripe)
339
339
if (!stripe )
340
340
return ;
341
341
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 ;
346
346
}
347
347
kfree (stripe -> sectors );
348
348
kfree (stripe -> csums );
@@ -355,6 +355,7 @@ static void release_scrub_stripe(struct scrub_stripe *stripe)
355
355
static int init_scrub_stripe (struct btrfs_fs_info * fs_info ,
356
356
struct scrub_stripe * stripe )
357
357
{
358
+ const u32 min_folio_shift = PAGE_SHIFT + fs_info -> block_min_order ;
358
359
int ret ;
359
360
360
361
memset (stripe , 0 , sizeof (* stripe ));
@@ -367,7 +368,9 @@ static int init_scrub_stripe(struct btrfs_fs_info *fs_info,
367
368
atomic_set (& stripe -> pending_io , 0 );
368
369
spin_lock_init (& stripe -> write_error_lock );
369
370
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 );
371
374
if (ret < 0 )
372
375
goto error ;
373
376
@@ -687,27 +690,30 @@ static int fill_writer_pointer_gap(struct scrub_ctx *sctx, u64 physical)
687
690
688
691
static void * scrub_stripe_get_kaddr (struct scrub_stripe * stripe , int sector_nr )
689
692
{
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 ];
692
697
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 );
697
702
}
698
703
699
704
static phys_addr_t scrub_stripe_get_paddr (struct scrub_stripe * stripe , int sector_nr )
700
705
{
701
706
struct btrfs_fs_info * fs_info = stripe -> bg -> fs_info ;
707
+ const u32 min_folio_shift = PAGE_SHIFT + fs_info -> block_min_order ;
702
708
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 ];
704
710
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 );
711
717
}
712
718
713
719
static 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,
1872
1878
{
1873
1879
struct btrfs_fs_info * fs_info = sctx -> fs_info ;
1874
1880
struct btrfs_bio * bbio ;
1881
+ const u32 min_folio_shift = PAGE_SHIFT + fs_info -> block_min_order ;
1875
1882
unsigned int nr_sectors = stripe_length (stripe ) >> fs_info -> sectorsize_bits ;
1876
1883
int mirror = stripe -> mirror_num ;
1877
1884
@@ -1884,7 +1891,7 @@ static void scrub_submit_initial_read(struct scrub_ctx *sctx,
1884
1891
return ;
1885
1892
}
1886
1893
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 ,
1888
1895
scrub_read_endio , stripe );
1889
1896
1890
1897
bbio -> bio .bi_iter .bi_sector = stripe -> logical >> SECTOR_SHIFT ;
@@ -2215,7 +2222,7 @@ static int scrub_raid56_parity_stripe(struct scrub_ctx *sctx,
2215
2222
for (int i = 0 ; i < data_stripes ; i ++ ) {
2216
2223
stripe = & sctx -> raid56_data_stripes [i ];
2217
2224
2218
- raid56_parity_cache_data_pages (rbio , stripe -> pages ,
2225
+ raid56_parity_cache_data_folios (rbio , stripe -> folios ,
2219
2226
full_stripe_start + (i << BTRFS_STRIPE_LEN_SHIFT ));
2220
2227
}
2221
2228
raid56_parity_submit_scrub_rbio (rbio );
0 commit comments