On Mon, 18 Aug 2025 10:33:52 +1000 NeilBrown wrote: > On Mon, 18 Aug 2025, Amir Goldstein wrote: > > Neil, > > > > I will have a look tomorrow. > > If you have ideas I am open to hear them. > > The repro is mounting overlayfs all over each other in concurrent threads > > and one of the rmdir of "work" dir triggers this assertion > > My guess is that by dropping and retaking the lock, we open the > possibility of a race so that by the time vfs_unlink() is called the > dentry has already been unlinked. In that case it would be unhashed. > So after retaking the lock we need to check d_unhashed() as well as > ->d_parent. > > So something like #syz test upstream master --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -1552,7 +1552,8 @@ void ovl_copyattr(struct inode *inode) int ovl_parent_lock(struct dentry *parent, struct dentry *child) { inode_lock_nested(parent->d_inode, I_MUTEX_PARENT); - if (!child || child->d_parent == parent) + if (!child || + (!d_unhashed(child) && child->d_parent == parent)) return 0; inode_unlock(parent->d_inode); --