On Thu, Feb 06, 2025 at 04:42:51PM +1100, NeilBrown wrote: > vfs_rmdir takes an exclusive lock on the target directory to ensure > nothing new is created in it while the rmdir progresses. With the > possibility of async updates continuing after the inode lock is dropped > we now need extra protection. > > Any async updates will have DCACHE_PAR_UPDATE set on the dentry. We > simply wait for that flag to be cleared on all children. > +static void d_update_wait(struct dentry *dentry, unsigned int subclass) > +{ > + /* Note this may only ever be called in a context where we have > + * a lock preventing this dentry from becoming locked, possibly > + * an update lock on the parent dentry. The must be a smp_mb() > + * after that lock is taken and before this is called so that > + * the following test is safe. d_update_lock() provides that > + * barrier. > + */ > + if (!(dentry->d_flags & DCACHE_PAR_UPDATE)) > + return > + lock_acquire_exclusive(&dentry->d_update_map, subclass, > + 0, NULL, _THIS_IP_); What the fuck? > + spin_lock(&dentry->d_lock); > + wait_var_event_spinlock(&dentry->d_flags, > + !check_dentry_locked(dentry), > + &dentry->d_lock); > + spin_unlock(&dentry->d_lock); > + lock_map_release(&dentry->d_update_map); > +} OK, I realize that it compiles, but it should've raised all kinds of red flags for anyone reading that. return + <newline> is already fishy, but having the next line indented *less* than that return is firmly in the "somebody's trying to hide something nasty here" territory, even without parsing the damn thing.