Re: [linus:master] [eventfs] 852e46e239: BUG:unable_to_handle_page_fault_for_address
From: Linus Torvalds
Date: Mon Jan 29 2024 - 17:37:23 EST
On Mon, 29 Jan 2024 at 14:21, Steven Rostedt <rostedt@xxxxxxxxxxx> wrote:
>
> But crashes with just a:
>
> # ls /sys/kernel/tracing/events
>
> [ 66.423983] ------------[ cut here ]------------
> [ 66.426447] kernel BUG at fs/dcache.c:1876!
Duh.
That's a bit too much copy-and-paste by me.
So what is going on is that a ->lookup() function should *not* call
d_instantiate() at all, and the only reason it actually used to work
here was due to the incorrect "simple_lookup()", which basically did
all the preliminaries.
A ->lookup() should do 'd_add()' on the dentry.
So just replace all the d_instantiate() calls there with "d_add()"
instead. I think that will fix it.
Basically the "simple_lookup()" had done the "d_add(dentry, NULL)",
and at that point the "d_instantiate()" just exposed the inode and
turned the negative dentry into a positive one.
So "d_add()" is "I'm adding the inode to a new dentry under lookup".
And "d_instantiate()" is "I'm adding this inode to an existing dentry
that used to be negative"
And so the old "d_add(NULL)+d_instantiate(inode)" _kind_ of worked,
except it made that negative dentry visible for a short while.
And when I did the cleanup, I didn't think of this thing, so I left
the d_instantiate() calls as such, even though they now really need to
be d_add().
Hope that explains it.
And I hope there aren't any other stupid things I missed like that.
Linus