From: Qu Wenruo <quwenruo.btrfs@gmx.com>
To: Hongling Zeng <zenghongling@kylinos.cn>,
clm@fb.com, dsterba@suse.com, lizetao1@huawei.com
Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org,
zhongling0719@126.com, stable@vger.kernel.org
Subject: Re: [PATCH] btrfs: handle highmem folios in read_key_bytes
Date: Mon, 17 Aug 2026 12:25:58 +0930 [thread overview]
Message-ID: <8e30fed1-5879-4a26-a1a2-d1a3302bc068@gmx.com> (raw)
In-Reply-To: <20260817022012.19658-1-zenghongling@kylinos.cn>
在 2026/8/17 11:50, Hongling Zeng 写道:
> On 32-bit systems with highmem, folio_address() can return NULL for
> unmapped highmem folios. When this NULL is passed as the dest parameter
> to read_key_bytes() with a non-NULL dest_folio, it violates the function's
> contract (which requires dest to be non-NULL when dest_folio is provided).
But metadata folios are not allocated by page cache, but by btrfs
itself, which always use GFP_NOFS then attach the folio to page cache,
thus should not get highmem memory in the first place.
And there is no way to trigger read from userspace on btree inode, so
there should be no highmem folios from the beginning.
>
> The original bug had two symptoms:
> 1. Unsigned len underflow when len -= copy_bytes executes (infinite loop)
> 2. The folio remains uninitialized because the copy block is skipped
So did you really hit the problem in the real world?
>
> Fix requires two changes:
>
> 1. Change "if (!dest)" to "if (!dest && !dest_folio)"
> - Prevents the "counting-only" mode when dest_folio is provided
> - Fixes the underflow/infinite loop
>
> 2. Change "if (dest)" to "if (dest || dest_folio)"
> - Ensures the copy block executes when dest_folio is provided
> - Allows kmap_local_folio() to properly map the highmem folio
> - Actually writes data to the folio
>
> Without the second change, the highmem folio is not populated even
> though the read succeeds, causing subsequent fs-verity verification to
> operate on stale or uninitialized data.
>
> Fixes: 884937793db5 ("btrfs: convert read_key_bytes() to take a folio")
> Cc: stable@vger.kernel.org
> Signed-off-by: Hongling Zeng <zenghongling@kylinos.cn>
Missing LLM disclosure.
> ---
> fs/btrfs/verity.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/fs/btrfs/verity.c b/fs/btrfs/verity.c
> index 983365a73541..80bc945c7dcb 100644
> --- a/fs/btrfs/verity.c
> +++ b/fs/btrfs/verity.c
> @@ -351,7 +351,7 @@ static int read_key_bytes(struct btrfs_inode *inode, u8 key_type, u64 offset,
> }
>
> /* desc = NULL to just sum all the item lengths */
> - if (!dest)
> + if (!dest && !dest_folio)
> copy_end = item_end;
> else
> copy_end = min(offset + len, item_end);
> @@ -362,7 +362,7 @@ static int read_key_bytes(struct btrfs_inode *inode, u8 key_type, u64 offset,
> /* Offset from the start of item for copying */
> copy_offset = offset - key.offset;
>
> - if (dest) {
> + if (dest || dest_folio) {
> if (dest_folio)
> kaddr = kmap_local_folio(dest_folio, 0);
>
next prev parent reply other threads:[~2026-08-17 2:56 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-17 2:20 Hongling Zeng
2026-08-17 2:55 ` Qu Wenruo [this message]
2026-08-17 4:14 ` Hongling Zeng
2026-08-17 6:02 ` Qu Wenruo
2026-08-17 6:37 ` Hongling Zeng
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=8e30fed1-5879-4a26-a1a2-d1a3302bc068@gmx.com \
--to=quwenruo.btrfs@gmx.com \
--cc=clm@fb.com \
--cc=dsterba@suse.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lizetao1@huawei.com \
--cc=stable@vger.kernel.org \
--cc=zenghongling@kylinos.cn \
--cc=zhongling0719@126.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
all inboxes | Powered by JetHome®