All directory blocks are within the scope of i_size, so let's limit
the end_block to just check valid dirent blocks.

Meanwhile, it uses dir_blocks() instead of variable for cleanup in
__f2fs_find_entry().

Signed-off-by: Chao Yu <[email protected]>
---
 fs/f2fs/dir.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
index 02c9355176d3..d4591c215f07 100644
--- a/fs/f2fs/dir.c
+++ b/fs/f2fs/dir.c
@@ -305,18 +305,21 @@ static struct f2fs_dir_entry *find_in_level(struct inode 
*dir,
        int s = GET_DENTRY_SLOTS(fname->disk_name.len);
        unsigned int nbucket, nblock;
        unsigned int bidx, end_block;
+       unsigned long last_block;
        struct page *dentry_page;
        struct f2fs_dir_entry *de = NULL;
        pgoff_t next_pgofs;
        bool room = false;
        int max_slots;
 
+       last_block = dir_blocks(dir);
        nbucket = dir_buckets(level, F2FS_I(dir)->i_dir_level);
        nblock = bucket_blocks(level);
 
        bidx = dir_block_index(level, F2FS_I(dir)->i_dir_level,
                               le32_to_cpu(fname->hash) % nbucket);
        end_block = bidx + nblock;
+       end_block = min_t(unsigned int, end_block, last_block);
 
        while (bidx < end_block) {
                /* no need to allocate new dentry pages to all the indices */
@@ -361,7 +364,6 @@ struct f2fs_dir_entry *__f2fs_find_entry(struct inode *dir,
                                         const struct f2fs_filename *fname,
                                         struct page **res_page)
 {
-       unsigned long npages = dir_blocks(dir);
        struct f2fs_dir_entry *de = NULL;
        unsigned int max_depth;
        unsigned int level;
@@ -373,7 +375,7 @@ struct f2fs_dir_entry *__f2fs_find_entry(struct inode *dir,
                goto out;
        }
 
-       if (npages == 0)
+       if (dir_blocks(dir) == 0)
                goto out;
 
        max_depth = F2FS_I(dir)->i_current_depth;
-- 
2.40.1



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to