@@ -1443,18 +1443,17 @@ static int ext4_mb_init_cache(struct page *page, char *incore, gfp_t gfp)
1443
1443
* Lock the buddy and bitmap pages. This make sure other parallel init_group
1444
1444
* on the same buddy page doesn't happen whild holding the buddy page lock.
1445
1445
* Return locked buddy and bitmap pages on e4b struct. If buddy and bitmap
1446
- * are on the same page e4b->bd_buddy_page is NULL and return value is 0.
1446
+ * are on the same page e4b->bd_buddy_folio is NULL and return value is 0.
1447
1447
*/
1448
1448
static int ext4_mb_get_buddy_page_lock (struct super_block * sb ,
1449
1449
ext4_group_t group , struct ext4_buddy * e4b , gfp_t gfp )
1450
1450
{
1451
1451
struct inode * inode = EXT4_SB (sb )-> s_buddy_cache ;
1452
1452
int block , pnum , poff ;
1453
1453
int blocks_per_page ;
1454
- struct page * page ;
1455
1454
struct folio * folio ;
1456
1455
1457
- e4b -> bd_buddy_page = NULL ;
1456
+ e4b -> bd_buddy_folio = NULL ;
1458
1457
e4b -> bd_bitmap_folio = NULL ;
1459
1458
1460
1459
blocks_per_page = PAGE_SIZE / sb -> s_blocksize ;
@@ -1480,11 +1479,12 @@ static int ext4_mb_get_buddy_page_lock(struct super_block *sb,
1480
1479
}
1481
1480
1482
1481
/* blocks_per_page == 1, hence we need another page for the buddy */
1483
- page = find_or_create_page (inode -> i_mapping , block + 1 , gfp );
1484
- if (!page )
1485
- return - ENOMEM ;
1486
- BUG_ON (page -> mapping != inode -> i_mapping );
1487
- e4b -> bd_buddy_page = page ;
1482
+ folio = __filemap_get_folio (inode -> i_mapping , block + 1 ,
1483
+ FGP_LOCK | FGP_ACCESSED | FGP_CREAT , gfp );
1484
+ if (IS_ERR (folio ))
1485
+ return PTR_ERR (folio );
1486
+ BUG_ON (folio -> mapping != inode -> i_mapping );
1487
+ e4b -> bd_buddy_folio = folio ;
1488
1488
return 0 ;
1489
1489
}
1490
1490
@@ -1494,9 +1494,9 @@ static void ext4_mb_put_buddy_page_lock(struct ext4_buddy *e4b)
1494
1494
folio_unlock (e4b -> bd_bitmap_folio );
1495
1495
folio_put (e4b -> bd_bitmap_folio );
1496
1496
}
1497
- if (e4b -> bd_buddy_page ) {
1498
- unlock_page (e4b -> bd_buddy_page );
1499
- put_page (e4b -> bd_buddy_page );
1497
+ if (e4b -> bd_buddy_folio ) {
1498
+ folio_unlock (e4b -> bd_buddy_folio );
1499
+ folio_put (e4b -> bd_buddy_folio );
1500
1500
}
1501
1501
}
1502
1502
@@ -1511,7 +1511,6 @@ int ext4_mb_init_group(struct super_block *sb, ext4_group_t group, gfp_t gfp)
1511
1511
1512
1512
struct ext4_group_info * this_grp ;
1513
1513
struct ext4_buddy e4b ;
1514
- struct page * page ;
1515
1514
struct folio * folio ;
1516
1515
int ret = 0 ;
1517
1516
@@ -1548,7 +1547,7 @@ int ext4_mb_init_group(struct super_block *sb, ext4_group_t group, gfp_t gfp)
1548
1547
goto err ;
1549
1548
}
1550
1549
1551
- if (e4b .bd_buddy_page == NULL ) {
1550
+ if (e4b .bd_buddy_folio == NULL ) {
1552
1551
/*
1553
1552
* If both the bitmap and buddy are in
1554
1553
* the same page we don't need to force
@@ -1558,11 +1557,11 @@ int ext4_mb_init_group(struct super_block *sb, ext4_group_t group, gfp_t gfp)
1558
1557
goto err ;
1559
1558
}
1560
1559
/* init buddy cache */
1561
- page = e4b .bd_buddy_page ;
1562
- ret = ext4_mb_init_cache (page , e4b .bd_bitmap , gfp );
1560
+ folio = e4b .bd_buddy_folio ;
1561
+ ret = ext4_mb_init_cache (& folio -> page , e4b .bd_bitmap , gfp );
1563
1562
if (ret )
1564
1563
goto err ;
1565
- if (!PageUptodate ( page )) {
1564
+ if (!folio_test_uptodate ( folio )) {
1566
1565
ret = - EIO ;
1567
1566
goto err ;
1568
1567
}
@@ -1584,7 +1583,6 @@ ext4_mb_load_buddy_gfp(struct super_block *sb, ext4_group_t group,
1584
1583
int block ;
1585
1584
int pnum ;
1586
1585
int poff ;
1587
- struct page * page ;
1588
1586
struct folio * folio ;
1589
1587
int ret ;
1590
1588
struct ext4_group_info * grp ;
@@ -1603,7 +1601,7 @@ ext4_mb_load_buddy_gfp(struct super_block *sb, ext4_group_t group,
1603
1601
e4b -> bd_info = grp ;
1604
1602
e4b -> bd_sb = sb ;
1605
1603
e4b -> bd_group = group ;
1606
- e4b -> bd_buddy_page = NULL ;
1604
+ e4b -> bd_buddy_folio = NULL ;
1607
1605
e4b -> bd_bitmap_folio = NULL ;
1608
1606
1609
1607
if (unlikely (EXT4_MB_GRP_NEED_INIT (grp ))) {
@@ -1669,56 +1667,57 @@ ext4_mb_load_buddy_gfp(struct super_block *sb, ext4_group_t group,
1669
1667
goto err ;
1670
1668
}
1671
1669
1672
- /* Pages marked accessed already */
1670
+ /* Folios marked accessed already */
1673
1671
e4b -> bd_bitmap_folio = folio ;
1674
1672
e4b -> bd_bitmap = folio_address (folio ) + (poff * sb -> s_blocksize );
1675
1673
1676
1674
block ++ ;
1677
1675
pnum = block / blocks_per_page ;
1678
1676
poff = block % blocks_per_page ;
1679
1677
1680
- page = find_get_page_flags (inode -> i_mapping , pnum , FGP_ACCESSED );
1681
- if (page == NULL || !PageUptodate (page )) {
1682
- if (page )
1683
- put_page (page );
1684
- page = find_or_create_page (inode -> i_mapping , pnum , gfp );
1685
- if (page ) {
1686
- if (WARN_RATELIMIT (page -> mapping != inode -> i_mapping ,
1687
- "ext4: buddy bitmap's page->mapping != inode->i_mapping\n" )) {
1678
+ folio = __filemap_get_folio (inode -> i_mapping , pnum , FGP_ACCESSED , 0 );
1679
+ if (IS_ERR (folio ) || !folio_test_uptodate (folio )) {
1680
+ if (!IS_ERR (folio ))
1681
+ folio_put (folio );
1682
+ folio = __filemap_get_folio (inode -> i_mapping , pnum ,
1683
+ FGP_LOCK | FGP_ACCESSED | FGP_CREAT , gfp );
1684
+ if (!IS_ERR (folio )) {
1685
+ if (WARN_RATELIMIT (folio -> mapping != inode -> i_mapping ,
1686
+ "ext4: buddy bitmap's mapping != inode->i_mapping\n" )) {
1688
1687
/* should never happen */
1689
- unlock_page ( page );
1688
+ folio_unlock ( folio );
1690
1689
ret = - EINVAL ;
1691
1690
goto err ;
1692
1691
}
1693
- if (!PageUptodate ( page )) {
1694
- ret = ext4_mb_init_cache (page , e4b -> bd_bitmap ,
1692
+ if (!folio_test_uptodate ( folio )) {
1693
+ ret = ext4_mb_init_cache (& folio -> page , e4b -> bd_bitmap ,
1695
1694
gfp );
1696
1695
if (ret ) {
1697
- unlock_page ( page );
1696
+ folio_unlock ( folio );
1698
1697
goto err ;
1699
1698
}
1700
1699
}
1701
- unlock_page ( page );
1700
+ folio_unlock ( folio );
1702
1701
}
1703
1702
}
1704
- if (page == NULL ) {
1705
- ret = - ENOMEM ;
1703
+ if (IS_ERR ( folio ) ) {
1704
+ ret = PTR_ERR ( folio ) ;
1706
1705
goto err ;
1707
1706
}
1708
- if (!PageUptodate ( page )) {
1707
+ if (!folio_test_uptodate ( folio )) {
1709
1708
ret = - EIO ;
1710
1709
goto err ;
1711
1710
}
1712
1711
1713
- /* Pages marked accessed already */
1714
- e4b -> bd_buddy_page = page ;
1715
- e4b -> bd_buddy = page_address ( page ) + (poff * sb -> s_blocksize );
1712
+ /* Folios marked accessed already */
1713
+ e4b -> bd_buddy_folio = folio ;
1714
+ e4b -> bd_buddy = folio_address ( folio ) + (poff * sb -> s_blocksize );
1716
1715
1717
1716
return 0 ;
1718
1717
1719
1718
err :
1720
- if (page )
1721
- put_page ( page );
1719
+ if (folio )
1720
+ folio_put ( folio );
1722
1721
if (e4b -> bd_bitmap_folio )
1723
1722
folio_put (e4b -> bd_bitmap_folio );
1724
1723
@@ -1737,8 +1736,8 @@ static void ext4_mb_unload_buddy(struct ext4_buddy *e4b)
1737
1736
{
1738
1737
if (e4b -> bd_bitmap_folio )
1739
1738
folio_put (e4b -> bd_bitmap_folio );
1740
- if (e4b -> bd_buddy_page )
1741
- put_page (e4b -> bd_buddy_page );
1739
+ if (e4b -> bd_buddy_folio )
1740
+ folio_put (e4b -> bd_buddy_folio );
1742
1741
}
1743
1742
1744
1743
@@ -2163,7 +2162,7 @@ static void ext4_mb_use_best_found(struct ext4_allocation_context *ac,
2163
2162
*/
2164
2163
ac -> ac_bitmap_page = & e4b -> bd_bitmap_folio -> page ;
2165
2164
get_page (ac -> ac_bitmap_page );
2166
- ac -> ac_buddy_page = e4b -> bd_buddy_page ;
2165
+ ac -> ac_buddy_page = & e4b -> bd_buddy_folio -> page ;
2167
2166
get_page (ac -> ac_buddy_page );
2168
2167
/* store last allocated for subsequent stream allocation */
2169
2168
if (ac -> ac_flags & EXT4_MB_STREAM_ALLOC ) {
@@ -3897,7 +3896,7 @@ static void ext4_free_data_in_buddy(struct super_block *sb,
3897
3896
/* No more items in the per group rb tree
3898
3897
* balance refcounts from ext4_mb_free_metadata()
3899
3898
*/
3900
- put_page (e4b .bd_buddy_page );
3899
+ folio_put (e4b .bd_buddy_folio );
3901
3900
folio_put (e4b .bd_bitmap_folio );
3902
3901
}
3903
3902
ext4_unlock_group (sb , entry -> efd_group );
@@ -6321,7 +6320,7 @@ ext4_mb_free_metadata(handle_t *handle, struct ext4_buddy *e4b,
6321
6320
6322
6321
BUG_ON (!ext4_handle_valid (handle ));
6323
6322
BUG_ON (e4b -> bd_bitmap_folio == NULL );
6324
- BUG_ON (e4b -> bd_buddy_page == NULL );
6323
+ BUG_ON (e4b -> bd_buddy_folio == NULL );
6325
6324
6326
6325
new_node = & new_entry -> efd_node ;
6327
6326
cluster = new_entry -> efd_start_cluster ;
@@ -6332,7 +6331,7 @@ ext4_mb_free_metadata(handle_t *handle, struct ext4_buddy *e4b,
6332
6331
* otherwise we'll refresh it from
6333
6332
* on-disk bitmap and lose not-yet-available
6334
6333
* blocks */
6335
- get_page (e4b -> bd_buddy_page );
6334
+ folio_get (e4b -> bd_buddy_folio );
6336
6335
folio_get (e4b -> bd_bitmap_folio );
6337
6336
}
6338
6337
while (* n ) {
0 commit comments