@@ -1452,9 +1452,10 @@ static int ext4_mb_get_buddy_page_lock(struct super_block *sb,
1452
1452
int block , pnum , poff ;
1453
1453
int blocks_per_page ;
1454
1454
struct page * page ;
1455
+ struct folio * folio ;
1455
1456
1456
1457
e4b -> bd_buddy_page = NULL ;
1457
- e4b -> bd_bitmap_page = NULL ;
1458
+ e4b -> bd_bitmap_folio = NULL ;
1458
1459
1459
1460
blocks_per_page = PAGE_SIZE / sb -> s_blocksize ;
1460
1461
/*
@@ -1465,12 +1466,13 @@ static int ext4_mb_get_buddy_page_lock(struct super_block *sb,
1465
1466
block = group * 2 ;
1466
1467
pnum = block / blocks_per_page ;
1467
1468
poff = block % blocks_per_page ;
1468
- page = find_or_create_page (inode -> i_mapping , pnum , gfp );
1469
- if (!page )
1470
- return - ENOMEM ;
1471
- BUG_ON (page -> mapping != inode -> i_mapping );
1472
- e4b -> bd_bitmap_page = page ;
1473
- e4b -> bd_bitmap = page_address (page ) + (poff * sb -> s_blocksize );
1469
+ folio = __filemap_get_folio (inode -> i_mapping , pnum ,
1470
+ FGP_LOCK | FGP_ACCESSED | FGP_CREAT , gfp );
1471
+ if (IS_ERR (folio ))
1472
+ return PTR_ERR (folio );
1473
+ BUG_ON (folio -> mapping != inode -> i_mapping );
1474
+ e4b -> bd_bitmap_folio = folio ;
1475
+ e4b -> bd_bitmap = folio_address (folio ) + (poff * sb -> s_blocksize );
1474
1476
1475
1477
if (blocks_per_page >= 2 ) {
1476
1478
/* buddy and bitmap are on the same page */
@@ -1488,9 +1490,9 @@ static int ext4_mb_get_buddy_page_lock(struct super_block *sb,
1488
1490
1489
1491
static void ext4_mb_put_buddy_page_lock (struct ext4_buddy * e4b )
1490
1492
{
1491
- if (e4b -> bd_bitmap_page ) {
1492
- unlock_page (e4b -> bd_bitmap_page );
1493
- put_page (e4b -> bd_bitmap_page );
1493
+ if (e4b -> bd_bitmap_folio ) {
1494
+ folio_unlock (e4b -> bd_bitmap_folio );
1495
+ folio_put (e4b -> bd_bitmap_folio );
1494
1496
}
1495
1497
if (e4b -> bd_buddy_page ) {
1496
1498
unlock_page (e4b -> bd_buddy_page );
@@ -1510,6 +1512,7 @@ int ext4_mb_init_group(struct super_block *sb, ext4_group_t group, gfp_t gfp)
1510
1512
struct ext4_group_info * this_grp ;
1511
1513
struct ext4_buddy e4b ;
1512
1514
struct page * page ;
1515
+ struct folio * folio ;
1513
1516
int ret = 0 ;
1514
1517
1515
1518
might_sleep ();
@@ -1536,11 +1539,11 @@ int ext4_mb_init_group(struct super_block *sb, ext4_group_t group, gfp_t gfp)
1536
1539
goto err ;
1537
1540
}
1538
1541
1539
- page = e4b .bd_bitmap_page ;
1540
- ret = ext4_mb_init_cache (page , NULL , gfp );
1542
+ folio = e4b .bd_bitmap_folio ;
1543
+ ret = ext4_mb_init_cache (& folio -> page , NULL , gfp );
1541
1544
if (ret )
1542
1545
goto err ;
1543
- if (!PageUptodate ( page )) {
1546
+ if (!folio_test_uptodate ( folio )) {
1544
1547
ret = - EIO ;
1545
1548
goto err ;
1546
1549
}
@@ -1582,6 +1585,7 @@ ext4_mb_load_buddy_gfp(struct super_block *sb, ext4_group_t group,
1582
1585
int pnum ;
1583
1586
int poff ;
1584
1587
struct page * page ;
1588
+ struct folio * folio ;
1585
1589
int ret ;
1586
1590
struct ext4_group_info * grp ;
1587
1591
struct ext4_sb_info * sbi = EXT4_SB (sb );
@@ -1600,7 +1604,7 @@ ext4_mb_load_buddy_gfp(struct super_block *sb, ext4_group_t group,
1600
1604
e4b -> bd_sb = sb ;
1601
1605
e4b -> bd_group = group ;
1602
1606
e4b -> bd_buddy_page = NULL ;
1603
- e4b -> bd_bitmap_page = NULL ;
1607
+ e4b -> bd_bitmap_folio = NULL ;
1604
1608
1605
1609
if (unlikely (EXT4_MB_GRP_NEED_INIT (grp ))) {
1606
1610
/*
@@ -1621,53 +1625,53 @@ ext4_mb_load_buddy_gfp(struct super_block *sb, ext4_group_t group,
1621
1625
pnum = block / blocks_per_page ;
1622
1626
poff = block % blocks_per_page ;
1623
1627
1624
- /* we could use find_or_create_page(), but it locks page
1625
- * what we'd like to avoid in fast path ... */
1626
- page = find_get_page_flags (inode -> i_mapping , pnum , FGP_ACCESSED );
1627
- if (page == NULL || !PageUptodate (page )) {
1628
- if (page )
1628
+ /* Avoid locking the folio in the fast path ... */
1629
+ folio = __filemap_get_folio (inode -> i_mapping , pnum , FGP_ACCESSED , 0 );
1630
+ if (IS_ERR (folio ) || !folio_test_uptodate (folio )) {
1631
+ if (!IS_ERR (folio ))
1629
1632
/*
1630
- * drop the page reference and try
1631
- * to get the page with lock. If we
1633
+ * drop the folio reference and try
1634
+ * to get the folio with lock. If we
1632
1635
* are not uptodate that implies
1633
- * somebody just created the page but
1634
- * is yet to initialize the same . So
1636
+ * somebody just created the folio but
1637
+ * is yet to initialize it . So
1635
1638
* wait for it to initialize.
1636
1639
*/
1637
- put_page (page );
1638
- page = find_or_create_page (inode -> i_mapping , pnum , gfp );
1639
- if (page ) {
1640
- if (WARN_RATELIMIT (page -> mapping != inode -> i_mapping ,
1641
- "ext4: bitmap's paging->mapping != inode->i_mapping\n" )) {
1640
+ folio_put (folio );
1641
+ folio = __filemap_get_folio (inode -> i_mapping , pnum ,
1642
+ FGP_LOCK | FGP_ACCESSED | FGP_CREAT , gfp );
1643
+ if (!IS_ERR (folio )) {
1644
+ if (WARN_RATELIMIT (folio -> mapping != inode -> i_mapping ,
1645
+ "ext4: bitmap's mapping != inode->i_mapping\n" )) {
1642
1646
/* should never happen */
1643
- unlock_page ( page );
1647
+ folio_unlock ( folio );
1644
1648
ret = - EINVAL ;
1645
1649
goto err ;
1646
1650
}
1647
- if (!PageUptodate ( page )) {
1648
- ret = ext4_mb_init_cache (page , NULL , gfp );
1651
+ if (!folio_test_uptodate ( folio )) {
1652
+ ret = ext4_mb_init_cache (& folio -> page , NULL , gfp );
1649
1653
if (ret ) {
1650
- unlock_page ( page );
1654
+ folio_unlock ( folio );
1651
1655
goto err ;
1652
1656
}
1653
- mb_cmp_bitmaps (e4b , page_address ( page ) +
1657
+ mb_cmp_bitmaps (e4b , folio_address ( folio ) +
1654
1658
(poff * sb -> s_blocksize ));
1655
1659
}
1656
- unlock_page ( page );
1660
+ folio_unlock ( folio );
1657
1661
}
1658
1662
}
1659
- if (page == NULL ) {
1660
- ret = - ENOMEM ;
1663
+ if (IS_ERR ( folio ) ) {
1664
+ ret = PTR_ERR ( folio ) ;
1661
1665
goto err ;
1662
1666
}
1663
- if (!PageUptodate ( page )) {
1667
+ if (!folio_test_uptodate ( folio )) {
1664
1668
ret = - EIO ;
1665
1669
goto err ;
1666
1670
}
1667
1671
1668
1672
/* Pages marked accessed already */
1669
- e4b -> bd_bitmap_page = page ;
1670
- e4b -> bd_bitmap = page_address ( page ) + (poff * sb -> s_blocksize );
1673
+ e4b -> bd_bitmap_folio = folio ;
1674
+ e4b -> bd_bitmap = folio_address ( folio ) + (poff * sb -> s_blocksize );
1671
1675
1672
1676
block ++ ;
1673
1677
pnum = block / blocks_per_page ;
@@ -1715,8 +1719,8 @@ ext4_mb_load_buddy_gfp(struct super_block *sb, ext4_group_t group,
1715
1719
err :
1716
1720
if (page )
1717
1721
put_page (page );
1718
- if (e4b -> bd_bitmap_page )
1719
- put_page (e4b -> bd_bitmap_page );
1722
+ if (e4b -> bd_bitmap_folio )
1723
+ folio_put (e4b -> bd_bitmap_folio );
1720
1724
1721
1725
e4b -> bd_buddy = NULL ;
1722
1726
e4b -> bd_bitmap = NULL ;
@@ -1731,8 +1735,8 @@ static int ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group,
1731
1735
1732
1736
static void ext4_mb_unload_buddy (struct ext4_buddy * e4b )
1733
1737
{
1734
- if (e4b -> bd_bitmap_page )
1735
- put_page (e4b -> bd_bitmap_page );
1738
+ if (e4b -> bd_bitmap_folio )
1739
+ folio_put (e4b -> bd_bitmap_folio );
1736
1740
if (e4b -> bd_buddy_page )
1737
1741
put_page (e4b -> bd_buddy_page );
1738
1742
}
@@ -2157,7 +2161,7 @@ static void ext4_mb_use_best_found(struct ext4_allocation_context *ac,
2157
2161
* double allocate blocks. The reference is dropped
2158
2162
* in ext4_mb_release_context
2159
2163
*/
2160
- ac -> ac_bitmap_page = e4b -> bd_bitmap_page ;
2164
+ ac -> ac_bitmap_page = & e4b -> bd_bitmap_folio -> page ;
2161
2165
get_page (ac -> ac_bitmap_page );
2162
2166
ac -> ac_buddy_page = e4b -> bd_buddy_page ;
2163
2167
get_page (ac -> ac_buddy_page );
@@ -3894,7 +3898,7 @@ static void ext4_free_data_in_buddy(struct super_block *sb,
3894
3898
* balance refcounts from ext4_mb_free_metadata()
3895
3899
*/
3896
3900
put_page (e4b .bd_buddy_page );
3897
- put_page (e4b .bd_bitmap_page );
3901
+ folio_put (e4b .bd_bitmap_folio );
3898
3902
}
3899
3903
ext4_unlock_group (sb , entry -> efd_group );
3900
3904
ext4_mb_unload_buddy (& e4b );
@@ -6316,7 +6320,7 @@ ext4_mb_free_metadata(handle_t *handle, struct ext4_buddy *e4b,
6316
6320
struct rb_node * parent = NULL , * new_node ;
6317
6321
6318
6322
BUG_ON (!ext4_handle_valid (handle ));
6319
- BUG_ON (e4b -> bd_bitmap_page == NULL );
6323
+ BUG_ON (e4b -> bd_bitmap_folio == NULL );
6320
6324
BUG_ON (e4b -> bd_buddy_page == NULL );
6321
6325
6322
6326
new_node = & new_entry -> efd_node ;
@@ -6329,7 +6333,7 @@ ext4_mb_free_metadata(handle_t *handle, struct ext4_buddy *e4b,
6329
6333
* on-disk bitmap and lose not-yet-available
6330
6334
* blocks */
6331
6335
get_page (e4b -> bd_buddy_page );
6332
- get_page (e4b -> bd_bitmap_page );
6336
+ folio_get (e4b -> bd_bitmap_folio );
6333
6337
}
6334
6338
while (* n ) {
6335
6339
parent = * n ;
0 commit comments