Re: [PATCH v3 04/19] VFS: use wait_var_event for waiting in d_alloc_parallel()

NeilBrown <[email protected]> Fri, 01 May 2026 11:20:38 +1000
Newsgroups org.kernel.vger.linux-unionfs,org.kernel.vger.linux-efi,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel,org.kernel.vger.linux-nfs
Message-ID <[email protected]>
On Fri, 01 May 2026, NeilBrown wrote:
> On Thu, 30 Apr 2026, Al Viro wrote:
> > On Wed, Apr 29, 2026 at 06:26:26AM +0100, Al Viro wrote:
> > 
> > > with obvious adjustments in end_dir_add().  That's it.  Outside of fs/dcache.c,
> > > same as in the patch you've posted, modulo renaming you've suggested for new flag.
> > 
> > Something like patch below (on top of -rc1, completely untested).  I've lifted
> > the wakeup part out of end_dir_add() into its callers - less confusing that way.
> > Note that in __d_move() the dentry you've ended up passing to end_dir_add() was
> > *NOT* the one added - it was the one replaced with existing one spliced in its place.
> 
> I saw this comment the first time I read this email, but I didn't
> process it properly.  That code is wrong.  It only makes sense to 
> __d_wake_in_lookup_waiters() a dentry that we know was in-lookup, and in
> d_move, that is target.
> This can only happen (I think) in nfs where nfs_lookup() skips the lookup
> for LOOKUP_RENAME_TARGET and leaves the dentry in-lookup.  Other threads
> looking up that name will then block.
> After the rename completes that in-lookup dentry will now be unhashed
> but we need to wake it up so other threads can continue (and repeat the
> lookup). 
> 
> So we need
> 
> 		__d_wake_in_lookup_waiters(target);
> 
> in d_move.  target, not dentry.
> 
> Thanks for flagging this,
> 
> Also my testing has hit a problem with some sort of deadlock in the nfs
> server (so accessing and XFS filesystem).  They are tring to unlink a
> file and are waiting in d_alloc_parallel() under reconnect_path.
> This is running generic/467.
> 
> So better hold off this patchset until I have that understood.

The two problems are actually one.

__d_move() is called in d_splice_alias() with the target dentry often
being in-lookup.  reconnect_path() does exactly this and is expected to
find an existing dentry for a directory and to splice that dentry to the
in-lookup dentry is has.
So the wakeup of the wrong dentry in __d_move() is causing the deadlock
in nfsd.

I'll resend that short series after some testing.

Thanks,
NeilBrown