On Mon, 29 Jan 2024 at 11:24, Linus Torvalds <torva...@linux-foundation.org> wrote: > > So the patch was completely broken. Here's the one that should > actually compile (although still not actually *tested*).
Note that this fixes the d_instantiate() ordering wrt initializing the inode. But as I look up the call chain, I see many more fundamental mistakes. Steven - the reason you think that the VFS doesn't have documentation is that we *do* have tons of documentation, but it's of the kind "Here is what you should do". It is *not* of the kind that says "You messed up and did something else, and how do you recover from it?". So the fundamental bug I now find is that eventfs_root_lookup() gets a target dentry, and for some unfathomable reason it then does ret = simple_lookup(dir, dentry, flags); on it. Which is *completely* broken, because what "simple_lookup()" does is just say "oh, you didn't have a dentry of this kind before, so clearly a lookup must be a non-existent file". Remember: this is for 'tmpfs' kinds of filesystems where the dentry cache cotnains *ALL* files. For the tracefs kind of filesystem, it's TOTALLY BOGUS. What the "simple_lookup()" will do is just a plain d_add(dentry, NULL); and nothing else. And guess what *that* does? It basically instantiates a negative dentry, telling all other lookups that the path does not exist. So if you have two concurrent lookups, one will do that simple_lookup(), and the other will then - depending on timing - either see the negative dentry and return -ENOENT, or - if it comes in a bit later - see the new inode that then later gets added by the first lookup with d_instantiate(). See? That simple_lookup() is not just unnecessary, but it's also actively completely WRONG. Because it instantiates a NULL pointer, other processes that race with the lookup may now end up saying "that file doesn't exist", even though it should. Basically, you can't use *any* of the "simple" filesystem helpers. Because they are all designed for that "the dentry tree is all there is" case. Linus