@@ -93,6 +93,9 @@ int btrfs_attach_subpage(const struct btrfs_fs_info *fs_info,
9393{
9494 struct btrfs_subpage * subpage ;
9595
96+ /* For metadata we don't support large folio yet. */
97+ ASSERT (!folio_test_large (folio ));
98+
9699 /*
97100 * We have cases like a dummy extent buffer page, which is not mapped
98101 * and doesn't need to be locked.
@@ -134,7 +137,8 @@ struct btrfs_subpage *btrfs_alloc_subpage(const struct btrfs_fs_info *fs_info,
134137 ASSERT (fs_info -> sectorsize < PAGE_SIZE );
135138
136139 real_size = struct_size (ret , bitmaps ,
137- BITS_TO_LONGS (btrfs_bitmap_nr_max * fs_info -> sectors_per_page ));
140+ BITS_TO_LONGS (btrfs_bitmap_nr_max *
141+ (PAGE_SIZE >> fs_info -> sectorsize_bits )));
138142 ret = kzalloc (real_size , GFP_NOFS );
139143 if (!ret )
140144 return ERR_PTR (- ENOMEM );
@@ -211,11 +215,13 @@ static void btrfs_subpage_assert(const struct btrfs_fs_info *fs_info,
211215
212216#define subpage_calc_start_bit (fs_info , folio , name , start , len ) \
213217({ \
214- unsigned int __start_bit; \
218+ unsigned int __start_bit; \
219+ const unsigned int blocks_per_folio = \
220+ btrfs_blocks_per_folio(fs_info, folio); \
215221 \
216222 btrfs_subpage_assert(fs_info, folio, start, len); \
217223 __start_bit = offset_in_page(start) >> fs_info->sectorsize_bits; \
218- __start_bit += fs_info->sectors_per_page * btrfs_bitmap_nr_##name; \
224+ __start_bit += blocks_per_folio * btrfs_bitmap_nr_##name; \
219225 __start_bit; \
220226})
221227
@@ -323,7 +329,8 @@ void btrfs_folio_end_lock_bitmap(const struct btrfs_fs_info *fs_info,
323329 struct folio * folio , unsigned long bitmap )
324330{
325331 struct btrfs_subpage * subpage = folio_get_private (folio );
326- const int start_bit = fs_info -> sectors_per_page * btrfs_bitmap_nr_locked ;
332+ const unsigned int blocks_per_folio = btrfs_blocks_per_folio (fs_info , folio );
333+ const int start_bit = blocks_per_folio * btrfs_bitmap_nr_locked ;
327334 unsigned long flags ;
328335 bool last = false;
329336 int cleared = 0 ;
@@ -341,7 +348,7 @@ void btrfs_folio_end_lock_bitmap(const struct btrfs_fs_info *fs_info,
341348 }
342349
343350 spin_lock_irqsave (& subpage -> lock , flags );
344- for_each_set_bit (bit , & bitmap , fs_info -> sectors_per_page ) {
351+ for_each_set_bit (bit , & bitmap , blocks_per_folio ) {
345352 if (test_and_clear_bit (bit + start_bit , subpage -> bitmaps ))
346353 cleared ++ ;
347354 }
@@ -352,15 +359,27 @@ void btrfs_folio_end_lock_bitmap(const struct btrfs_fs_info *fs_info,
352359 folio_unlock (folio );
353360}
354361
355- #define subpage_test_bitmap_all_set (fs_info , subpage , name ) \
362+ #define subpage_test_bitmap_all_set (fs_info , folio , name ) \
363+ ({ \
364+ struct btrfs_subpage *subpage = folio_get_private(folio); \
365+ const unsigned int blocks_per_folio = \
366+ btrfs_blocks_per_folio(fs_info, folio); \
367+ \
356368 bitmap_test_range_all_set(subpage->bitmaps, \
357- fs_info->sectors_per_page * btrfs_bitmap_nr_##name, \
358- fs_info->sectors_per_page)
369+ blocks_per_folio * btrfs_bitmap_nr_##name, \
370+ blocks_per_folio); \
371+ })
359372
360- #define subpage_test_bitmap_all_zero (fs_info , subpage , name ) \
373+ #define subpage_test_bitmap_all_zero (fs_info , folio , name ) \
374+ ({ \
375+ struct btrfs_subpage *subpage = folio_get_private(folio); \
376+ const unsigned int blocks_per_folio = \
377+ btrfs_blocks_per_folio(fs_info, folio); \
378+ \
361379 bitmap_test_range_all_zero(subpage->bitmaps, \
362- fs_info->sectors_per_page * btrfs_bitmap_nr_##name, \
363- fs_info->sectors_per_page)
380+ blocks_per_folio * btrfs_bitmap_nr_##name, \
381+ blocks_per_folio); \
382+ })
364383
365384void btrfs_subpage_set_uptodate (const struct btrfs_fs_info * fs_info ,
366385 struct folio * folio , u64 start , u32 len )
@@ -372,7 +391,7 @@ void btrfs_subpage_set_uptodate(const struct btrfs_fs_info *fs_info,
372391
373392 spin_lock_irqsave (& subpage -> lock , flags );
374393 bitmap_set (subpage -> bitmaps , start_bit , len >> fs_info -> sectorsize_bits );
375- if (subpage_test_bitmap_all_set (fs_info , subpage , uptodate ))
394+ if (subpage_test_bitmap_all_set (fs_info , folio , uptodate ))
376395 folio_mark_uptodate (folio );
377396 spin_unlock_irqrestore (& subpage -> lock , flags );
378397}
@@ -426,7 +445,7 @@ bool btrfs_subpage_clear_and_test_dirty(const struct btrfs_fs_info *fs_info,
426445
427446 spin_lock_irqsave (& subpage -> lock , flags );
428447 bitmap_clear (subpage -> bitmaps , start_bit , len >> fs_info -> sectorsize_bits );
429- if (subpage_test_bitmap_all_zero (fs_info , subpage , dirty ))
448+ if (subpage_test_bitmap_all_zero (fs_info , folio , dirty ))
430449 last = true;
431450 spin_unlock_irqrestore (& subpage -> lock , flags );
432451 return last ;
@@ -484,7 +503,7 @@ void btrfs_subpage_clear_writeback(const struct btrfs_fs_info *fs_info,
484503
485504 spin_lock_irqsave (& subpage -> lock , flags );
486505 bitmap_clear (subpage -> bitmaps , start_bit , len >> fs_info -> sectorsize_bits );
487- if (subpage_test_bitmap_all_zero (fs_info , subpage , writeback )) {
506+ if (subpage_test_bitmap_all_zero (fs_info , folio , writeback )) {
488507 ASSERT (folio_test_writeback (folio ));
489508 folio_end_writeback (folio );
490509 }
@@ -515,7 +534,7 @@ void btrfs_subpage_clear_ordered(const struct btrfs_fs_info *fs_info,
515534
516535 spin_lock_irqsave (& subpage -> lock , flags );
517536 bitmap_clear (subpage -> bitmaps , start_bit , len >> fs_info -> sectorsize_bits );
518- if (subpage_test_bitmap_all_zero (fs_info , subpage , ordered ))
537+ if (subpage_test_bitmap_all_zero (fs_info , folio , ordered ))
519538 folio_clear_ordered (folio );
520539 spin_unlock_irqrestore (& subpage -> lock , flags );
521540}
@@ -530,7 +549,7 @@ void btrfs_subpage_set_checked(const struct btrfs_fs_info *fs_info,
530549
531550 spin_lock_irqsave (& subpage -> lock , flags );
532551 bitmap_set (subpage -> bitmaps , start_bit , len >> fs_info -> sectorsize_bits );
533- if (subpage_test_bitmap_all_set (fs_info , subpage , checked ))
552+ if (subpage_test_bitmap_all_set (fs_info , folio , checked ))
534553 folio_set_checked (folio );
535554 spin_unlock_irqrestore (& subpage -> lock , flags );
536555}
@@ -652,26 +671,29 @@ IMPLEMENT_BTRFS_PAGE_OPS(ordered, folio_set_ordered, folio_clear_ordered,
652671IMPLEMENT_BTRFS_PAGE_OPS (checked , folio_set_checked , folio_clear_checked ,
653672 folio_test_checked );
654673
655- #define GET_SUBPAGE_BITMAP (subpage , fs_info , name , dst ) \
674+ #define GET_SUBPAGE_BITMAP (fs_info , folio , name , dst ) \
656675{ \
657- const int sectors_per_page = fs_info->sectors_per_page; \
676+ const unsigned int blocks_per_folio = \
677+ btrfs_blocks_per_folio(fs_info, folio); \
678+ const struct btrfs_subpage *subpage = folio_get_private(folio); \
658679 \
659- ASSERT(sectors_per_page < BITS_PER_LONG); \
680+ ASSERT(blocks_per_folio < BITS_PER_LONG); \
660681 *dst = bitmap_read(subpage->bitmaps, \
661- sectors_per_page * btrfs_bitmap_nr_##name, \
662- sectors_per_page ); \
682+ blocks_per_folio * btrfs_bitmap_nr_##name, \
683+ blocks_per_folio ); \
663684}
664685
665686#define SUBPAGE_DUMP_BITMAP (fs_info , folio , name , start , len ) \
666687{ \
667- const struct btrfs_subpage *subpage = folio_get_private(folio); \
668688 unsigned long bitmap; \
689+ const unsigned int blocks_per_folio = \
690+ btrfs_blocks_per_folio(fs_info, folio); \
669691 \
670- GET_SUBPAGE_BITMAP(subpage, fs_info , name, &bitmap); \
692+ GET_SUBPAGE_BITMAP(fs_info, folio , name, &bitmap); \
671693 btrfs_warn(fs_info, \
672694 "dumpping bitmap start=%llu len=%u folio=%llu " #name "_bitmap=%*pbl", \
673695 start, len, folio_pos(folio), \
674- fs_info->sectors_per_page , &bitmap); \
696+ blocks_per_folio , &bitmap); \
675697}
676698
677699/*
@@ -738,15 +760,15 @@ void btrfs_folio_set_lock(const struct btrfs_fs_info *fs_info,
738760 }
739761 bitmap_set (subpage -> bitmaps , start_bit , nbits );
740762 ret = atomic_add_return (nbits , & subpage -> nr_locked );
741- ASSERT (ret <= fs_info -> sectors_per_page );
763+ ASSERT (ret <= btrfs_blocks_per_folio ( fs_info , folio ) );
742764 spin_unlock_irqrestore (& subpage -> lock , flags );
743765}
744766
745767void __cold btrfs_subpage_dump_bitmap (const struct btrfs_fs_info * fs_info ,
746768 struct folio * folio , u64 start , u32 len )
747769{
748770 struct btrfs_subpage * subpage ;
749- const u32 sectors_per_page = fs_info -> sectors_per_page ;
771+ const unsigned int blocks_per_folio = btrfs_blocks_per_folio ( fs_info , folio ) ;
750772 unsigned long uptodate_bitmap ;
751773 unsigned long dirty_bitmap ;
752774 unsigned long writeback_bitmap ;
@@ -756,28 +778,28 @@ void __cold btrfs_subpage_dump_bitmap(const struct btrfs_fs_info *fs_info,
756778 unsigned long flags ;
757779
758780 ASSERT (folio_test_private (folio ) && folio_get_private (folio ));
759- ASSERT (sectors_per_page > 1 );
781+ ASSERT (blocks_per_folio > 1 );
760782 subpage = folio_get_private (folio );
761783
762784 spin_lock_irqsave (& subpage -> lock , flags );
763- GET_SUBPAGE_BITMAP (subpage , fs_info , uptodate , & uptodate_bitmap );
764- GET_SUBPAGE_BITMAP (subpage , fs_info , dirty , & dirty_bitmap );
765- GET_SUBPAGE_BITMAP (subpage , fs_info , writeback , & writeback_bitmap );
766- GET_SUBPAGE_BITMAP (subpage , fs_info , ordered , & ordered_bitmap );
767- GET_SUBPAGE_BITMAP (subpage , fs_info , checked , & checked_bitmap );
768- GET_SUBPAGE_BITMAP (subpage , fs_info , locked , & locked_bitmap );
785+ GET_SUBPAGE_BITMAP (fs_info , folio , uptodate , & uptodate_bitmap );
786+ GET_SUBPAGE_BITMAP (fs_info , folio , dirty , & dirty_bitmap );
787+ GET_SUBPAGE_BITMAP (fs_info , folio , writeback , & writeback_bitmap );
788+ GET_SUBPAGE_BITMAP (fs_info , folio , ordered , & ordered_bitmap );
789+ GET_SUBPAGE_BITMAP (fs_info , folio , checked , & checked_bitmap );
790+ GET_SUBPAGE_BITMAP (fs_info , folio , locked , & locked_bitmap );
769791 spin_unlock_irqrestore (& subpage -> lock , flags );
770792
771793 dump_page (folio_page (folio , 0 ), "btrfs subpage dump" );
772794 btrfs_warn (fs_info ,
773795"start=%llu len=%u page=%llu, bitmaps uptodate=%*pbl dirty=%*pbl locked=%*pbl writeback=%*pbl ordered=%*pbl checked=%*pbl" ,
774796 start , len , folio_pos (folio ),
775- sectors_per_page , & uptodate_bitmap ,
776- sectors_per_page , & dirty_bitmap ,
777- sectors_per_page , & locked_bitmap ,
778- sectors_per_page , & writeback_bitmap ,
779- sectors_per_page , & ordered_bitmap ,
780- sectors_per_page , & checked_bitmap );
797+ blocks_per_folio , & uptodate_bitmap ,
798+ blocks_per_folio , & dirty_bitmap ,
799+ blocks_per_folio , & locked_bitmap ,
800+ blocks_per_folio , & writeback_bitmap ,
801+ blocks_per_folio , & ordered_bitmap ,
802+ blocks_per_folio , & checked_bitmap );
781803}
782804
783805void btrfs_get_subpage_dirty_bitmap (struct btrfs_fs_info * fs_info ,
@@ -788,10 +810,10 @@ void btrfs_get_subpage_dirty_bitmap(struct btrfs_fs_info *fs_info,
788810 unsigned long flags ;
789811
790812 ASSERT (folio_test_private (folio ) && folio_get_private (folio ));
791- ASSERT (fs_info -> sectors_per_page > 1 );
813+ ASSERT (btrfs_blocks_per_folio ( fs_info , folio ) > 1 );
792814 subpage = folio_get_private (folio );
793815
794816 spin_lock_irqsave (& subpage -> lock , flags );
795- GET_SUBPAGE_BITMAP (subpage , fs_info , dirty , ret_bitmap );
817+ GET_SUBPAGE_BITMAP (fs_info , folio , dirty , ret_bitmap );
796818 spin_unlock_irqrestore (& subpage -> lock , flags );
797819}
0 commit comments