Unverified Commit 1e2c1af1 authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Christian Brauner
Browse files

fuse: make sure dentry is evicted if stale



d_dispose_if_unused() may find the dentry with a positive refcount, in
which case it won't be put on the dispose list even though it has already
timed out.

"Reinstall" the d_delete() callback, which was optimized out in
fuse_dentry_settime().  This will result in the dentry being evicted as
soon as the refcount hits zero.

Fixes: ab84ad59 ("fuse: new work queue to periodically invalidate expired dentries")
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
Link: https://patch.msgid.link/20260114145344.468856-3-mszeredi@redhat.com


Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent cb8d2bdc
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -172,6 +172,10 @@ static void fuse_dentry_tree_work(struct work_struct *work)
			if (time_after64(get_jiffies_64(), fd->time)) {
				rb_erase(&fd->node, &dentry_hash[i].tree);
				RB_CLEAR_NODE(&fd->node);
				spin_lock(&fd->dentry->d_lock);
				/* If dentry is still referenced, let next dput release it */
				fd->dentry->d_flags |= DCACHE_OP_DELETE;
				spin_unlock(&fd->dentry->d_lock);
				d_dispose_if_unused(fd->dentry, &dispose);
				spin_unlock(&dentry_hash[i].lock);
				cond_resched();