On Mon, 29 Jan 2024 at 14:21, Steven Rostedt <rost...@goodmis.org> 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