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
