--- x/fs/libfs.c +++ y/fs/libfs.c @@ -2234,6 +2234,7 @@ int path_from_stashed(struct dentry **st path->dentry = stash_dentry(stashed, dentry); if (path->dentry != dentry) dput(dentry); + dget(dentry); out_path: WARN_ON_ONCE(path->dentry->d_fsdata != stashed); @@ -2258,5 +2259,6 @@ void stashed_dentry_prune(struct dentry * already cleared out @dentry and stashed their own * dentry in there. */ - cmpxchg(stashed, dentry, NULL); + if (dentry == cmpxchg(stashed, dentry, NULL)) + dput(dentry); }