On Fri, Feb 07, 2025 at 09:06:58PM +0000, Al Viro wrote: > 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. Incidentally, that's where lockdep warnings you've mentioned are coming from...