From: Jaegeuk Kim <jaegeuk@kernel.org>
To: Chao Yu <chao@kernel.org>
Cc: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH] f2fs: don't traverse directory blocks after EOF
Date: Sat, 27 Jul 2024 03:27:24 +0000 [thread overview]
Message-ID: <ZqRpHOJyWU3Sn8Ma@google.com> (raw)
In-Reply-To: <c2b7d0cd-ea10-4e25-829c-53967927bd03@kernel.org>
On 07/26, Chao Yu wrote:
> On 2024/7/26 0:55, Jaegeuk Kim wrote:
> > On 07/12, Chao Yu wrote:
> > > All directory blocks are within the scope of i_size, so let's limit
> > > the end_block to just check valid dirent blocks.
> >
> > Do we really need this?
>
> f2fs_readdir() and f2fs_empty_dir() uses dir_blocks() for upper boundary,
> this patch aligns find_in_level() w/ them.
>
> Also, it can avoid grabbing never used page cache across EOF.
>
> So, we can consider taking this patch?
I'm wondering whether the current code has a bug or not.
>
> Thanks,
>
> >
> > >
> > > Meanwhile, it uses dir_blocks() instead of variable for cleanup in
> > > __f2fs_find_entry().
> > >
> > > Signed-off-by: Chao Yu <chao@kernel.org>
> > > ---
> > > 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
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
WARNING: multiple messages have this Message-ID (diff)
From: Jaegeuk Kim <jaegeuk@kernel.org>
To: Chao Yu <chao@kernel.org>
Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] f2fs: don't traverse directory blocks after EOF
Date: Sat, 27 Jul 2024 03:27:24 +0000 [thread overview]
Message-ID: <ZqRpHOJyWU3Sn8Ma@google.com> (raw)
In-Reply-To: <c2b7d0cd-ea10-4e25-829c-53967927bd03@kernel.org>
On 07/26, Chao Yu wrote:
> On 2024/7/26 0:55, Jaegeuk Kim wrote:
> > On 07/12, Chao Yu wrote:
> > > All directory blocks are within the scope of i_size, so let's limit
> > > the end_block to just check valid dirent blocks.
> >
> > Do we really need this?
>
> f2fs_readdir() and f2fs_empty_dir() uses dir_blocks() for upper boundary,
> this patch aligns find_in_level() w/ them.
>
> Also, it can avoid grabbing never used page cache across EOF.
>
> So, we can consider taking this patch?
I'm wondering whether the current code has a bug or not.
>
> Thanks,
>
> >
> > >
> > > Meanwhile, it uses dir_blocks() instead of variable for cleanup in
> > > __f2fs_find_entry().
> > >
> > > Signed-off-by: Chao Yu <chao@kernel.org>
> > > ---
> > > 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
next prev parent reply other threads:[~2024-07-27 3:27 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-12 7:34 [f2fs-dev] [PATCH] f2fs: don't traverse directory blocks after EOF Chao Yu
2024-07-12 7:34 ` Chao Yu
2024-07-25 16:55 ` [f2fs-dev] " Jaegeuk Kim
2024-07-25 16:55 ` Jaegeuk Kim
2024-07-26 1:06 ` [f2fs-dev] " Chao Yu
2024-07-26 1:06 ` Chao Yu
2024-07-27 3:27 ` Jaegeuk Kim [this message]
2024-07-27 3:27 ` Jaegeuk Kim
2024-07-29 2:54 ` [f2fs-dev] " Chao Yu
2024-07-29 2:54 ` Chao Yu
2024-07-29 16:21 ` [f2fs-dev] " Jaegeuk Kim
2024-07-29 16:21 ` Jaegeuk Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZqRpHOJyWU3Sn8Ma@google.com \
--to=jaegeuk@kernel.org \
--cc=chao@kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.