f2fs: Pass a folio to __f2fs_find_entry()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 31 Mar 2025 20:12:26 +0000 (21:12 +0100)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 28 Apr 2025 15:26:44 +0000 (15:26 +0000)
Also pass a folio to f2fs_find_in_inline_dir() and find_in_level().
Remove three calls to compound_head().

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/dir.c
fs/f2fs/f2fs.h
fs/f2fs/inline.c
fs/f2fs/namei.c
fs/f2fs/recovery.c

index 284f4ef11e25508b226cb5086c1db93e0abd9e0e..9f2700905b3b193691a9f041ad3b47e04d0bdf73 100644 (file)
@@ -260,7 +260,7 @@ found:
 static struct f2fs_dir_entry *find_in_level(struct inode *dir,
                                        unsigned int level,
                                        const struct f2fs_filename *fname,
-                                       struct page **res_page,
+                                       struct folio **res_folio,
                                        bool use_hash)
 {
        int s = GET_DENTRY_SLOTS(fname->disk_name.len);
@@ -291,18 +291,18 @@ start_find_bucket:
                                bidx = next_pgofs;
                                continue;
                        } else {
-                               *res_page = &dentry_folio->page;
+                               *res_folio = dentry_folio;
                                break;
                        }
                }
 
                de = find_in_block(dir, dentry_folio, fname, &max_slots, use_hash);
                if (IS_ERR(de)) {
-                       *res_page = ERR_CAST(de);
+                       *res_folio = ERR_CAST(de);
                        de = NULL;
                        break;
                } else if (de) {
-                       *res_page = &dentry_folio->page;
+                       *res_folio = dentry_folio;
                        break;
                }
 
@@ -329,7 +329,7 @@ start_find_bucket:
 
 struct f2fs_dir_entry *__f2fs_find_entry(struct inode *dir,
                                         const struct f2fs_filename *fname,
-                                        struct page **res_page)
+                                        struct folio **res_folio)
 {
        unsigned long npages = dir_blocks(dir);
        struct f2fs_dir_entry *de = NULL;
@@ -337,13 +337,13 @@ struct f2fs_dir_entry *__f2fs_find_entry(struct inode *dir,
        unsigned int level;
        bool use_hash = true;
 
-       *res_page = NULL;
+       *res_folio = NULL;
 
 #if IS_ENABLED(CONFIG_UNICODE)
 start_find_entry:
 #endif
        if (f2fs_has_inline_dentry(dir)) {
-               de = f2fs_find_in_inline_dir(dir, fname, res_page, use_hash);
+               de = f2fs_find_in_inline_dir(dir, fname, res_folio, use_hash);
                goto out;
        }
 
@@ -359,8 +359,8 @@ start_find_entry:
        }
 
        for (level = 0; level < max_depth; level++) {
-               de = find_in_level(dir, level, fname, res_page, use_hash);
-               if (de || IS_ERR(*res_page))
+               de = find_in_level(dir, level, fname, res_folio, use_hash);
+               if (de || IS_ERR(*res_folio))
                        break;
        }
 
@@ -389,6 +389,7 @@ struct f2fs_dir_entry *f2fs_find_entry(struct inode *dir,
 {
        struct f2fs_dir_entry *de = NULL;
        struct f2fs_filename fname;
+       struct folio *rfolio;
        int err;
 
        err = f2fs_setup_filename(dir, child, 1, &fname);
@@ -400,7 +401,8 @@ struct f2fs_dir_entry *f2fs_find_entry(struct inode *dir,
                return NULL;
        }
 
-       de = __f2fs_find_entry(dir, &fname, res_page);
+       de = __f2fs_find_entry(dir, &fname, &rfolio);
+       *res_page = &rfolio->page;
 
        f2fs_free_filename(&fname);
        return de;
@@ -782,7 +784,7 @@ int f2fs_do_add_link(struct inode *dir, const struct qstr *name,
                                struct inode *inode, nid_t ino, umode_t mode)
 {
        struct f2fs_filename fname;
-       struct page *page = NULL;
+       struct folio *folio = NULL;
        struct f2fs_dir_entry *de = NULL;
        int err;
 
@@ -798,14 +800,14 @@ int f2fs_do_add_link(struct inode *dir, const struct qstr *name,
         * consistency more.
         */
        if (current != F2FS_I(dir)->task) {
-               de = __f2fs_find_entry(dir, &fname, &page);
+               de = __f2fs_find_entry(dir, &fname, &folio);
                F2FS_I(dir)->task = NULL;
        }
        if (de) {
-               f2fs_put_page(page, 0);
+               f2fs_folio_put(folio, false);
                err = -EEXIST;
-       } else if (IS_ERR(page)) {
-               err = PTR_ERR(page);
+       } else if (IS_ERR(folio)) {
+               err = PTR_ERR(folio);
        } else {
                err = f2fs_add_dentry(dir, &fname, inode, ino, mode);
        }
index beed738769334aa2f426e59f65a87df9da7e2062..bb3cd60f2c37b5dd6a741b5b262c418f46c5a54d 100644 (file)
@@ -3659,8 +3659,7 @@ void f2fs_update_parent_metadata(struct inode *dir, struct inode *inode,
 int f2fs_room_for_filename(const void *bitmap, int slots, int max_slots);
 void f2fs_drop_nlink(struct inode *dir, struct inode *inode);
 struct f2fs_dir_entry *__f2fs_find_entry(struct inode *dir,
-                                        const struct f2fs_filename *fname,
-                                        struct page **res_page);
+               const struct f2fs_filename *fname, struct folio **res_folio);
 struct f2fs_dir_entry *f2fs_find_entry(struct inode *dir,
                        const struct qstr *child, struct page **res_page);
 struct f2fs_dir_entry *f2fs_parent_dir(struct inode *dir, struct page **p);
@@ -4297,9 +4296,8 @@ int f2fs_try_convert_inline_dir(struct inode *dir, struct dentry *dentry);
 int f2fs_write_inline_data(struct inode *inode, struct folio *folio);
 int f2fs_recover_inline_data(struct inode *inode, struct page *npage);
 struct f2fs_dir_entry *f2fs_find_in_inline_dir(struct inode *dir,
-                                       const struct f2fs_filename *fname,
-                                       struct page **res_page,
-                                       bool use_hash);
+               const struct f2fs_filename *fname, struct folio **res_folio,
+               bool use_hash);
 int f2fs_make_empty_inline_dir(struct inode *inode, struct inode *parent,
                        struct folio *ifolio);
 int f2fs_add_inline_entry(struct inode *dir, const struct f2fs_filename *fname,
index bce99af7f4ef95ac419f1500924231b944c9acc5..c2e97e230cd1d13f4fdf0985206fa630ce3b9b6c 100644 (file)
@@ -352,7 +352,7 @@ process_inline:
 
 struct f2fs_dir_entry *f2fs_find_in_inline_dir(struct inode *dir,
                                        const struct f2fs_filename *fname,
-                                       struct page **res_page,
+                                       struct folio **res_folio,
                                        bool use_hash)
 {
        struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);
@@ -363,7 +363,7 @@ struct f2fs_dir_entry *f2fs_find_in_inline_dir(struct inode *dir,
 
        ifolio = f2fs_get_inode_folio(sbi, dir->i_ino);
        if (IS_ERR(ifolio)) {
-               *res_page = &ifolio->page;
+               *res_folio = ifolio;
                return NULL;
        }
 
@@ -373,11 +373,11 @@ struct f2fs_dir_entry *f2fs_find_in_inline_dir(struct inode *dir,
        de = f2fs_find_target_dentry(&d, fname, NULL, use_hash);
        folio_unlock(ifolio);
        if (IS_ERR(de)) {
-               *res_page = ERR_CAST(de);
+               *res_folio = ERR_CAST(de);
                de = NULL;
        }
        if (de)
-               *res_page = &ifolio->page;
+               *res_folio = ifolio;
        else
                f2fs_folio_put(ifolio, false);
 
index f17cb2489a732d4e44d43cb4846325ae6b98ba9d..6b2485f06683385f057fc903dd0f3e867e24665b 100644 (file)
@@ -463,7 +463,7 @@ static struct dentry *f2fs_lookup(struct inode *dir, struct dentry *dentry,
 {
        struct inode *inode = NULL;
        struct f2fs_dir_entry *de;
-       struct page *page;
+       struct folio *folio;
        struct dentry *new;
        nid_t ino = -1;
        int err = 0;
@@ -481,12 +481,12 @@ static struct dentry *f2fs_lookup(struct inode *dir, struct dentry *dentry,
                goto out_splice;
        if (err)
                goto out;
-       de = __f2fs_find_entry(dir, &fname, &page);
+       de = __f2fs_find_entry(dir, &fname, &folio);
        f2fs_free_filename(&fname);
 
        if (!de) {
-               if (IS_ERR(page)) {
-                       err = PTR_ERR(page);
+               if (IS_ERR(folio)) {
+                       err = PTR_ERR(folio);
                        goto out;
                }
                err = -ENOENT;
@@ -494,7 +494,7 @@ static struct dentry *f2fs_lookup(struct inode *dir, struct dentry *dentry,
        }
 
        ino = le32_to_cpu(de->ino);
-       f2fs_put_page(page, 0);
+       f2fs_folio_put(folio, false);
 
        inode = f2fs_iget(dir->i_sb, ino);
        if (IS_ERR(inode)) {
index 69d8eaaf9013b29738c288742b449fbbd0e5b3fc..849d014023d43b9b6e1371468160f819ce2d6e9d 100644 (file)
@@ -165,7 +165,7 @@ static int recover_dentry(struct inode *inode, struct page *ipage,
        struct f2fs_dir_entry *de;
        struct f2fs_filename fname;
        struct qstr usr_fname;
-       struct page *page;
+       struct folio *folio;
        struct inode *dir, *einode;
        struct fsync_inode_entry *entry;
        int err = 0;
@@ -187,7 +187,7 @@ static int recover_dentry(struct inode *inode, struct page *ipage,
        if (err)
                goto out;
 retry:
-       de = __f2fs_find_entry(dir, &fname, &page);
+       de = __f2fs_find_entry(dir, &fname, &folio);
        if (de && inode->i_ino == le32_to_cpu(de->ino))
                goto out_put;
 
@@ -212,11 +212,11 @@ retry:
                        iput(einode);
                        goto out_put;
                }
-               f2fs_delete_entry(de, page, dir, einode);
+               f2fs_delete_entry(de, &folio->page, dir, einode);
                iput(einode);
                goto retry;
-       } else if (IS_ERR(page)) {
-               err = PTR_ERR(page);
+       } else if (IS_ERR(folio)) {
+               err = PTR_ERR(folio);
        } else {
                err = f2fs_add_dentry(dir, &fname, inode,
                                        inode->i_ino, inode->i_mode);
@@ -226,7 +226,7 @@ retry:
        goto out;
 
 out_put:
-       f2fs_put_page(page, 0);
+       f2fs_folio_put(folio, false);
 out:
        if (file_enc_name(inode))
                name = "<encrypted>";