Re: [PATCH RESEND 1/1] vfs: Really check for inode ptr in lookup_fast

From: Al Viro
Date: Tue Oct 22 2019 - 10:50:56 EST


On Tue, Oct 22, 2019 at 03:37:36PM +0100, Al Viro wrote:

> I'm somewhat tempted to make __d_set_inode_and_type() do smp_store_release()
> for setting ->d_flags and __d_entry_type() - smp_load_acquire(); that would
> be pretty much free for x86 (as well as sparc, s390 and itanic) and reasonably
> cheap on ppc and arm64. How badly would e.g. SMP arm suffer from the below
> (completely untested)?

PS: if we really go that way, we'd probably want __d_is_negative(), to be
used only under ->d_lock or with ->d_seq validation.

d_is_negative() callers in fs/dcache.c (all under ->d_lock) as well as
the RCU-side one in lookup_fast() (->d_seq validated) would you that.

Another fun place is do_unlinkat() - there we want to reorder
inode = dentry->d_inode;
if (d_is_negative(dentry))
goto slashes;
As it were, the same race here can lead to unbalanced iput(), if you
hit the window just right.