f2fs: Add f2fs_get_node_folio()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Tue, 18 Feb 2025 05:51:51 +0000 (05:51 +0000)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 4 Mar 2025 17:02:25 +0000 (17:02 +0000)
Change __get_node_page() to return a folio and convert back to a page in
f2fs_get_node_page() and f2fs_get_node_page_ra().

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/f2fs.h
fs/f2fs/node.c

index 8c74005161642331653f011c7ad0b79faa610a6e..46eac4d3386baf0fe87c8fdfda37dd32b67e9054 100644 (file)
@@ -3700,6 +3700,7 @@ struct page *f2fs_new_inode_page(struct inode *inode);
 struct page *f2fs_new_node_page(struct dnode_of_data *dn, unsigned int ofs);
 void f2fs_ra_node_page(struct f2fs_sb_info *sbi, nid_t nid);
 struct page *f2fs_get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid);
+struct folio *f2fs_get_node_folio(struct f2fs_sb_info *sbi, pgoff_t nid);
 struct page *f2fs_get_node_page_ra(struct page *parent, int start);
 int f2fs_move_node_page(struct page *node_page, int gc_type);
 void f2fs_flush_inline_data(struct f2fs_sb_info *sbi);
index cd37eeaf01a1969bc100e09229ade938cbaa2389..2969c1644ad3d14e78aa8bd2d102d361aa8712fd 100644 (file)
@@ -1456,7 +1456,7 @@ void f2fs_ra_node_page(struct f2fs_sb_info *sbi, nid_t nid)
        f2fs_put_page(apage, err ? 1 : 0);
 }
 
-static struct page *__get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid,
+static struct folio *__get_node_folio(struct f2fs_sb_info *sbi, pgoff_t nid,
                                        struct page *parent, int start)
 {
        struct folio *folio;
@@ -1469,7 +1469,7 @@ static struct page *__get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid,
 repeat:
        folio = f2fs_grab_cache_folio(NODE_MAPPING(sbi), nid, false);
        if (IS_ERR(folio))
-               return ERR_CAST(folio);
+               return folio;
 
        err = read_node_page(&folio->page, 0);
        if (err < 0) {
@@ -1500,7 +1500,7 @@ repeat:
        }
 page_hit:
        if (likely(nid == nid_of_node(&folio->page)))
-               return &folio->page;
+               return folio;
 
        f2fs_warn(sbi, "inconsistent node block, nid:%lu, node_footer[nid:%u,ino:%u,ofs:%u,cpver:%llu,blkaddr:%u]",
                          nid, nid_of_node(&folio->page), ino_of_node(&folio->page),
@@ -1519,17 +1519,25 @@ out_put_err:
        return ERR_PTR(err);
 }
 
+struct folio *f2fs_get_node_folio(struct f2fs_sb_info *sbi, pgoff_t nid)
+{
+       return __get_node_folio(sbi, nid, NULL, 0);
+}
+
 struct page *f2fs_get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid)
 {
-       return __get_node_page(sbi, nid, NULL, 0);
+       struct folio *folio = __get_node_folio(sbi, nid, NULL, 0);
+
+       return &folio->page;
 }
 
 struct page *f2fs_get_node_page_ra(struct page *parent, int start)
 {
        struct f2fs_sb_info *sbi = F2FS_P_SB(parent);
        nid_t nid = get_nid(parent, start, false);
+       struct folio *folio = __get_node_folio(sbi, nid, parent, start);
 
-       return __get_node_page(sbi, nid, parent, start);
+       return &folio->page;
 }
 
 static void flush_inline_data(struct f2fs_sb_info *sbi, nid_t ino)