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.