From: Vlastimil Babka <vbabka@suse.cz>
To: Joanne Koong <joannelkoong@gmail.com>,
Matthew Wilcox <willy@infradead.org>
Cc: "Josef Bacik" <josef@toxicpanda.com>,
"Miklos Szeredi" <miklos@szeredi.hu>,
"Christian Heusel" <christian@heusel.eu>,
"Miklos Szeredi" <mszeredi@redhat.com>,
regressions@lists.linux.dev, linux-kernel@vger.kernel.org,
linux-fsdevel@vger.kernel.org, linux-mm <linux-mm@kvack.org>,
"Mantas Mikulėnas" <grawity@gmail.com>
Subject: Re: [REGRESSION][BISECTED] Crash with Bad page state for FUSE/Flatpak related applications since v6.13
Date: Mon, 10 Feb 2025 09:27:32 +0100 [thread overview]
Message-ID: <81298bd1-e630-4940-ae5b-7882576b6bf4@suse.cz> (raw)
In-Reply-To: <CAJnrk1aY0ZFcS4JvmJL=icigencsCD8g4qmZiTuoPWj2S2Y_LQ@mail.gmail.com>
On 2/8/25 16:46, Joanne Koong wrote:
> On Sat, Feb 8, 2025 at 2:11 AM Matthew Wilcox <willy@infradead.org> wrote:
>>
>> On Fri, Feb 07, 2025 at 04:22:56PM -0800, Joanne Koong wrote:
>> > > Thanks, Josef. I guess we can at least try to confirm we're on the right track.
>> > > Can anyone affected see if this (only compile tested) patch fixes the issue?
>> > > Created on top of 6.13.1.
>> >
>> > This fixes the crash for me on 6.14.0-rc1. I ran the repro using
>> > Mantas's instructions for Obfuscate. I was able to trigger the crash
>> > on a clean build and then with this patch, I'm not seeing the crash
>> > anymore.
>>
>> Since this patch fixes the bug, we're looking for one call to folio_put()
>> too many. Is it possibly in fuse_try_move_page()? In particular, this
>> one:
>>
>> /* Drop ref for ap->pages[] array */
>> folio_put(oldfolio);
>>
>> I don't know fuse very well. Maybe this isn't it.
>
> Yeah, this looks it to me. We don't grab a folio reference for the
> ap->pages[] array for readahead and it tracks with Mantas's
> fuse_dev_splice_write() dmesg. this patch fixed the crash for me when
> I tested it yesterday:
>
> diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> index 7d92a5479998..172cab8e2caf 100644
> --- a/fs/fuse/file.c
> +++ b/fs/fuse/file.c
> @@ -955,8 +955,10 @@ static void fuse_readpages_end(struct fuse_mount
> *fm, struct fuse_args *args,
> fuse_invalidate_atime(inode);
> }
>
> - for (i = 0; i < ap->num_folios; i++)
> + for (i = 0; i < ap->num_folios; i++) {
> folio_end_read(ap->folios[i], !err);
> + folio_put(ap->folios[i]);
> + }
> if (ia->ff)
> fuse_file_put(ia->ff, false);
>
> @@ -1049,6 +1051,7 @@ static void fuse_readahead(struct readahead_control *rac)
>
> while (ap->num_folios < cur_pages) {
> folio = readahead_folio(rac);
> + folio_get(folio);
This is almost the same as my patch, but balances the folio_put() in
readahead_folio() with another folio_get(), while mine uses
__readahead_folio() that does not do folio_put() in the first place.
But I think neither patch proves the extraneous folio_put() comes from
fuse_try_move_page().
> ap->folios[ap->num_folios] = folio;
> ap->descs[ap->num_folios].length = folio_size(folio);
> ap->num_folios++;
>
>
> I reran it just now with a printk by that ref drop in
> fuse_try_move_page() and I'm indeed seeing that path get hit.
It might get hit, but is it hit in the readahead paths? One way to test
would be to instead of yours above or mine change, to stop doing the
foio_put() in fuse_try_move_page(). But maybe it's called also from other
contexts that do expect it, and will leak memory otherwise.
> Not sure why fstests didn't pick this up though since splice is
> enabled by default in passthrough_hp, i'll look into this next week.
>
next prev parent reply other threads:[~2025-02-10 8:27 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-06 10:53 Christian Heusel
2025-02-07 9:34 ` Miklos Szeredi
2025-02-07 9:45 ` Matthew Wilcox
2025-02-07 10:25 ` Vlastimil Babka
2025-02-07 10:43 ` Miklos Szeredi
2025-02-07 10:55 ` Vlastimil Babka
2025-02-07 11:16 ` Bernd Schubert
2025-02-07 18:21 ` Bernd Schubert
2025-02-07 18:40 ` Joanne Koong
2025-02-08 0:02 ` Bernd Schubert
2025-02-08 12:25 ` Mantas Mikulėnas
2025-02-07 20:35 ` Mantas Mikulėnas
2025-02-07 11:00 ` Mantas Mikulėnas
2025-02-07 16:49 ` Vlastimil Babka
2025-02-07 17:29 ` Josef Bacik
2025-02-07 18:39 ` Vlastimil Babka
2025-02-07 22:29 ` Matthew Wilcox
2025-02-08 0:22 ` Joanne Koong
2025-02-08 10:11 ` Matthew Wilcox
2025-02-08 15:46 ` Joanne Koong
2025-02-10 8:27 ` Vlastimil Babka [this message]
2025-02-10 18:13 ` Joanne Koong
2025-02-10 19:12 ` Josef Bacik
2025-02-10 19:42 ` Jeff Layton
2025-02-10 20:36 ` Matthew Wilcox
2025-02-10 22:38 ` Jeff Layton
2025-02-11 14:01 ` Jeff Layton
2025-02-11 19:23 ` Joanne Koong
2025-02-11 19:41 ` Jeff Layton
2025-02-11 21:10 ` Joanne Koong
2025-02-11 21:01 ` Vlastimil Babka
2025-02-11 21:21 ` Joanne Koong
2025-02-10 18:58 ` Jeff Layton
2025-02-12 18:48 ` Joanne Koong
2025-02-10 8:52 ` [PATCH] fuse: prevent folio use-after-free in readahead Vlastimil Babka
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=81298bd1-e630-4940-ae5b-7882576b6bf4@suse.cz \
--to=vbabka@suse.cz \
--cc=christian@heusel.eu \
--cc=grawity@gmail.com \
--cc=joannelkoong@gmail.com \
--cc=josef@toxicpanda.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=miklos@szeredi.hu \
--cc=mszeredi@redhat.com \
--cc=regressions@lists.linux.dev \
--cc=willy@infradead.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
all inboxes | Powered by JetHome®