From: Qu Wenruo <wqu@suse.com>
To: dsterba@suse.cz
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH] btrfs: apply first key check for readahead when possible
Date: Tue, 14 Apr 2026 07:17:55 +0930 [thread overview]
Message-ID: <10492f55-d744-478e-872f-1dc2bd03e680@suse.com> (raw)
In-Reply-To: <20260413175638.GC12792@twin.jikos.cz>
在 2026/4/14 03:26, David Sterba 写道:
> 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?
My bad, I was originally also setting @has_first_key there, but removed
later without reverting this part back.
Will remove this change during merge.
Thanks,
Qu
>
>> };
>> 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;
prev parent reply other threads:[~2026-04-13 21:48 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
2026-04-13 21:47 ` Qu Wenruo [this message]
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=10492f55-d744-478e-872f-1dc2bd03e680@suse.com \
--to=wqu@suse.com \
--cc=dsterba@suse.cz \
--cc=linux-btrfs@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox