Skip to content

Commit 4c14d5c

Browse files
adam900710kdave
authored andcommitted
btrfs: subpage: make btrfs_is_subpage() check against a folio
To support large data folios, we can no longer assume every filemap folio is page sized. So btrfs_is_subpage() check must be done against a folio. Thankfully for metadata folios, we have the full control and ensure a large folio will not be large than nodesize, so btrfs_meta_is_subpage() doesn't need this change. Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
1 parent 19e60b2 commit 4c14d5c

File tree

4 files changed

+26
-26
lines changed

4 files changed

+26
-26
lines changed

fs/btrfs/extent_io.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ static void end_folio_read(struct folio *folio, bool uptodate, u64 start, u32 le
432432
else
433433
btrfs_folio_clear_uptodate(fs_info, folio, start, len);
434434

435-
if (!btrfs_is_subpage(fs_info, folio->mapping))
435+
if (!btrfs_is_subpage(fs_info, folio))
436436
folio_unlock(folio);
437437
else
438438
btrfs_folio_end_lock(fs_info, folio, start, len);
@@ -488,7 +488,7 @@ static void end_bbio_data_write(struct btrfs_bio *bbio)
488488
static void begin_folio_read(struct btrfs_fs_info *fs_info, struct folio *folio)
489489
{
490490
ASSERT(folio_test_locked(folio));
491-
if (!btrfs_is_subpage(fs_info, folio->mapping))
491+
if (!btrfs_is_subpage(fs_info, folio))
492492
return;
493493

494494
ASSERT(folio_test_private(folio));
@@ -870,7 +870,7 @@ int set_folio_extent_mapped(struct folio *folio)
870870

871871
fs_info = folio_to_fs_info(folio);
872872

873-
if (btrfs_is_subpage(fs_info, folio->mapping))
873+
if (btrfs_is_subpage(fs_info, folio))
874874
return btrfs_attach_subpage(fs_info, folio, BTRFS_SUBPAGE_DATA);
875875

876876
folio_attach_private(folio, (void *)EXTENT_FOLIO_PRIVATE);
@@ -887,7 +887,7 @@ void clear_folio_extent_mapped(struct folio *folio)
887887
return;
888888

889889
fs_info = folio_to_fs_info(folio);
890-
if (btrfs_is_subpage(fs_info, folio->mapping))
890+
if (btrfs_is_subpage(fs_info, folio))
891891
return btrfs_detach_subpage(fs_info, folio, BTRFS_SUBPAGE_DATA);
892892

893893
folio_detach_private(folio);
@@ -1327,7 +1327,7 @@ static noinline_for_stack int writepage_delalloc(struct btrfs_inode *inode,
13271327
{
13281328
struct btrfs_fs_info *fs_info = inode_to_fs_info(&inode->vfs_inode);
13291329
struct writeback_control *wbc = bio_ctrl->wbc;
1330-
const bool is_subpage = btrfs_is_subpage(fs_info, folio->mapping);
1330+
const bool is_subpage = btrfs_is_subpage(fs_info, folio);
13311331
const u64 page_start = folio_pos(folio);
13321332
const u64 page_end = page_start + folio_size(folio) - 1;
13331333
const unsigned int blocks_per_folio = btrfs_blocks_per_folio(fs_info, folio);
@@ -1355,7 +1355,7 @@ static noinline_for_stack int writepage_delalloc(struct btrfs_inode *inode,
13551355
int bit;
13561356

13571357
/* Save the dirty bitmap as our submission bitmap will be a subset of it. */
1358-
if (btrfs_is_subpage(fs_info, inode->vfs_inode.i_mapping)) {
1358+
if (btrfs_is_subpage(fs_info, folio)) {
13591359
ASSERT(blocks_per_folio > 1);
13601360
btrfs_get_subpage_dirty_bitmap(fs_info, folio, &bio_ctrl->submit_bitmap);
13611361
} else {
@@ -2407,7 +2407,7 @@ static int extent_write_cache_pages(struct address_space *mapping,
24072407
* regular submission.
24082408
*/
24092409
if (wbc->sync_mode != WB_SYNC_NONE ||
2410-
btrfs_is_subpage(inode_to_fs_info(inode), mapping)) {
2410+
btrfs_is_subpage(inode_to_fs_info(inode), folio)) {
24112411
if (folio_test_writeback(folio))
24122412
submit_write_bio(bio_ctrl, 0);
24132413
folio_wait_writeback(folio);

fs/btrfs/inode.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7273,7 +7273,7 @@ static void wait_subpage_spinlock(struct folio *folio)
72737273
struct btrfs_fs_info *fs_info = folio_to_fs_info(folio);
72747274
struct btrfs_subpage *subpage;
72757275

7276-
if (!btrfs_is_subpage(fs_info, folio->mapping))
7276+
if (!btrfs_is_subpage(fs_info, folio))
72777277
return;
72787278

72797279
ASSERT(folio_test_private(folio) && folio_get_private(folio));

fs/btrfs/subpage.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ int btrfs_attach_subpage(const struct btrfs_fs_info *fs_info,
8383
return 0;
8484
if (type == BTRFS_SUBPAGE_METADATA && !btrfs_meta_is_subpage(fs_info))
8585
return 0;
86-
if (type == BTRFS_SUBPAGE_DATA && !btrfs_is_subpage(fs_info, folio->mapping))
86+
if (type == BTRFS_SUBPAGE_DATA && !btrfs_is_subpage(fs_info, folio))
8787
return 0;
8888

8989
subpage = btrfs_alloc_subpage(fs_info, type);
@@ -104,7 +104,7 @@ void btrfs_detach_subpage(const struct btrfs_fs_info *fs_info, struct folio *fol
104104
return;
105105
if (type == BTRFS_SUBPAGE_METADATA && !btrfs_meta_is_subpage(fs_info))
106106
return;
107-
if (type == BTRFS_SUBPAGE_DATA && !btrfs_is_subpage(fs_info, folio->mapping))
107+
if (type == BTRFS_SUBPAGE_DATA && !btrfs_is_subpage(fs_info, folio))
108108
return;
109109

110110
subpage = folio_detach_private(folio);
@@ -286,7 +286,7 @@ void btrfs_folio_end_lock(const struct btrfs_fs_info *fs_info,
286286

287287
ASSERT(folio_test_locked(folio));
288288

289-
if (unlikely(!fs_info) || !btrfs_is_subpage(fs_info, folio->mapping)) {
289+
if (unlikely(!fs_info) || !btrfs_is_subpage(fs_info, folio)) {
290290
folio_unlock(folio);
291291
return;
292292
}
@@ -320,7 +320,7 @@ void btrfs_folio_end_lock_bitmap(const struct btrfs_fs_info *fs_info,
320320
int cleared = 0;
321321
int bit;
322322

323-
if (!btrfs_is_subpage(fs_info, folio->mapping)) {
323+
if (!btrfs_is_subpage(fs_info, folio)) {
324324
folio_unlock(folio);
325325
return;
326326
}
@@ -572,7 +572,7 @@ void btrfs_folio_set_##name(const struct btrfs_fs_info *fs_info, \
572572
struct folio *folio, u64 start, u32 len) \
573573
{ \
574574
if (unlikely(!fs_info) || \
575-
!btrfs_is_subpage(fs_info, folio->mapping)) { \
575+
!btrfs_is_subpage(fs_info, folio)) { \
576576
folio_set_func(folio); \
577577
return; \
578578
} \
@@ -582,7 +582,7 @@ void btrfs_folio_clear_##name(const struct btrfs_fs_info *fs_info, \
582582
struct folio *folio, u64 start, u32 len) \
583583
{ \
584584
if (unlikely(!fs_info) || \
585-
!btrfs_is_subpage(fs_info, folio->mapping)) { \
585+
!btrfs_is_subpage(fs_info, folio)) { \
586586
folio_clear_func(folio); \
587587
return; \
588588
} \
@@ -592,15 +592,15 @@ bool btrfs_folio_test_##name(const struct btrfs_fs_info *fs_info, \
592592
struct folio *folio, u64 start, u32 len) \
593593
{ \
594594
if (unlikely(!fs_info) || \
595-
!btrfs_is_subpage(fs_info, folio->mapping)) \
595+
!btrfs_is_subpage(fs_info, folio)) \
596596
return folio_test_func(folio); \
597597
return btrfs_subpage_test_##name(fs_info, folio, start, len); \
598598
} \
599599
void btrfs_folio_clamp_set_##name(const struct btrfs_fs_info *fs_info, \
600600
struct folio *folio, u64 start, u32 len) \
601601
{ \
602602
if (unlikely(!fs_info) || \
603-
!btrfs_is_subpage(fs_info, folio->mapping)) { \
603+
!btrfs_is_subpage(fs_info, folio)) { \
604604
folio_set_func(folio); \
605605
return; \
606606
} \
@@ -611,7 +611,7 @@ void btrfs_folio_clamp_clear_##name(const struct btrfs_fs_info *fs_info, \
611611
struct folio *folio, u64 start, u32 len) \
612612
{ \
613613
if (unlikely(!fs_info) || \
614-
!btrfs_is_subpage(fs_info, folio->mapping)) { \
614+
!btrfs_is_subpage(fs_info, folio)) { \
615615
folio_clear_func(folio); \
616616
return; \
617617
} \
@@ -622,7 +622,7 @@ bool btrfs_folio_clamp_test_##name(const struct btrfs_fs_info *fs_info, \
622622
struct folio *folio, u64 start, u32 len) \
623623
{ \
624624
if (unlikely(!fs_info) || \
625-
!btrfs_is_subpage(fs_info, folio->mapping)) \
625+
!btrfs_is_subpage(fs_info, folio)) \
626626
return folio_test_func(folio); \
627627
btrfs_subpage_clamp_range(folio, &start, &len); \
628628
return btrfs_subpage_test_##name(fs_info, folio, start, len); \
@@ -700,7 +700,7 @@ void btrfs_folio_assert_not_dirty(const struct btrfs_fs_info *fs_info,
700700
if (!IS_ENABLED(CONFIG_BTRFS_ASSERT))
701701
return;
702702

703-
if (!btrfs_is_subpage(fs_info, folio->mapping)) {
703+
if (!btrfs_is_subpage(fs_info, folio)) {
704704
ASSERT(!folio_test_dirty(folio));
705705
return;
706706
}
@@ -735,7 +735,7 @@ void btrfs_folio_set_lock(const struct btrfs_fs_info *fs_info,
735735
int ret;
736736

737737
ASSERT(folio_test_locked(folio));
738-
if (unlikely(!fs_info) || !btrfs_is_subpage(fs_info, folio->mapping))
738+
if (unlikely(!fs_info) || !btrfs_is_subpage(fs_info, folio))
739739
return;
740740

741741
subpage = folio_get_private(folio);

fs/btrfs/subpage.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,10 @@ static inline bool btrfs_meta_is_subpage(const struct btrfs_fs_info *fs_info)
8585
return fs_info->nodesize < PAGE_SIZE;
8686
}
8787
static inline bool btrfs_is_subpage(const struct btrfs_fs_info *fs_info,
88-
struct address_space *mapping)
88+
struct folio *folio)
8989
{
90-
if (mapping && mapping->host)
91-
ASSERT(is_data_inode(BTRFS_I(mapping->host)));
90+
if (folio->mapping && folio->mapping->host)
91+
ASSERT(is_data_inode(BTRFS_I(folio->mapping->host)));
9292
return fs_info->sectorsize < PAGE_SIZE;
9393
}
9494
#else
@@ -97,10 +97,10 @@ static inline bool btrfs_meta_is_subpage(const struct btrfs_fs_info *fs_info)
9797
return false;
9898
}
9999
static inline bool btrfs_is_subpage(const struct btrfs_fs_info *fs_info,
100-
struct address_space *mapping)
100+
struct folio *folio)
101101
{
102-
if (mapping && mapping->host)
103-
ASSERT(is_data_inode(BTRFS_I(mapping->host)));
102+
if (folio->mapping && folio->mapping->host)
103+
ASSERT(is_data_inode(BTRFS_I(folio->mapping->host)));
104104
return false;
105105
}
106106
#endif

0 commit comments

Comments
 (0)