From: David Sterba <dsterba@suse.cz>
To: Qu Wenruo <wqu@suse.com>
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH] btrfs: apply first key check for readahead when possible
Date: Mon, 13 Apr 2026 19:56:38 +0200 [thread overview]
Message-ID: <20260413175638.GC12792@twin.jikos.cz> (raw)
In-Reply-To: <49ae0f6badb787c1111daff252f034b7ae94f257.1775991651.git.wqu@suse.com>
On Sun, Apr 12, 2026 at 08:31:05PM +0930, Qu Wenruo wrote:
> Currently for tree block readahead we never pass a
> btrfs_tree_parent_check with @has_first_key set.
>
> Without @has_first_key set, btrfs will skip the following extra
> checks:
>
> - Header generation check
> This is a minor one.
>
> - Empty leaf/node checks
> This is more serious, for certain trees like the csum tree, they are
> allowed to be empty, thus an empty leaf can pass the tree checker.
> But if there is a parent node for such an empty leaf, it indicates
> corruption.
>
> Without @has_first_key set, we can no longer detect such a problem.
>
> In fact there is already a fuzzed image report that a corrupted csum
> leaf which has zero nritems but still has a parent node can trigger
> a BUG_ON() during csum deletion.
>
> However there are only two call sites of btrfs_readahead_tree_block():
>
> - Inside relocate_tree_blocks()
> At this call site we are trying to grab the first key of the tree
> block, thus we are not able to pass a @first_key parameter.
>
> - Inside btrfs_readahead_node_child()
> This is the more common call site, where we have the parent node and
> want to readahead the child tree blocks.
>
> In this case we can easily grab the node key and pass it for checks.
>
> Add a new parameter @first_key to btrfs_readahead_tree_block() and pass
> the node key to it inside btrfs_readahead_node_child().
>
> This should plug the gap in empty leaf detection during readahead.
>
> Link: https://lore.kernel.org/linux-btrfs/20260409071255.3358044-1-gality369@gmail.com/
> Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
> ---
> fs/btrfs/extent_io.c | 16 +++++++++++++---
> fs/btrfs/extent_io.h | 3 ++-
> fs/btrfs/relocation.c | 2 +-
> 3 files changed, 16 insertions(+), 5 deletions(-)
>
> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> index 3f59fb0a9ee5..4d5605aaf827 100644
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@ -4635,15 +4635,21 @@ int try_release_extent_buffer(struct folio *folio)
> * to read the block we will not block on anything.
> */
> void btrfs_readahead_tree_block(struct btrfs_fs_info *fs_info,
> - u64 bytenr, u64 owner_root, u64 gen, int level)
> + u64 bytenr, u64 owner_root, u64 gen, int level,
> + const struct btrfs_key *first_key)
> {
> struct btrfs_tree_parent_check check = {
> .level = level,
> - .transid = gen
> + .transid = gen,
It's not necessary to add the "," or was there another reason?
> };
> struct extent_buffer *eb;
> int ret;
>
> + if (first_key) {
> + memcpy(&check.first_key, first_key, sizeof(struct btrfs_key));
> + check.has_first_key = true;
> + }
> +
> eb = btrfs_find_create_tree_block(fs_info, bytenr, owner_root, level);
> if (IS_ERR(eb))
> return;
next prev parent reply other threads:[~2026-04-13 17:56 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-12 11:01 [PATCH] btrfs: apply first key check for readahead when possible Qu Wenruo
2026-04-13 17:56 ` David Sterba [this message]
2026-04-13 21:47 ` Qu Wenruo
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=20260413175638.GC12792@twin.jikos.cz \
--to=dsterba@suse.cz \
--cc=linux-btrfs@vger.kernel.org \
--cc=wqu@suse.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox