]> git.ipfire.org Git - thirdparty/linux.git/commit
fuse: fix conversion of fuse_reverse_inval_entry() to start_removing()
authorNeilBrown <neil@brown.name>
Sun, 30 Nov 2025 22:06:18 +0000 (09:06 +1100)
committerChristian Brauner <brauner@kernel.org>
Mon, 12 Jan 2026 09:39:58 +0000 (10:39 +0100)
commitcab012375122304a6343c1ed09404e5143b9dc01
treee530a4211dee35b5cc084ebfcc798a08b3dab2f7
parent0f61b1860cc3f52aef9036d7235ed1f017632193
fuse: fix conversion of fuse_reverse_inval_entry() to start_removing()

The recent conversion of fuse_reverse_inval_entry() to use
start_removing() was wrong.
As Val Packett points out the original code did not call ->lookup
while the new code does.  This can lead to a deadlock.

Rather than using full_name_hash() and d_lookup() as the old code
did, we can use try_lookup_noperm() which combines these.  Then
the result can be given to start_removing_dentry() to get the required
locks for removal.  We then double check that the name hasn't
changed.

As 'dir' needs to be used several times now, we load the dput() until
the end, and initialise to NULL so dput() is always safe.

Reported-by: Val Packett <val@packett.cool>
Closes: https://lore.kernel.org/all/6713ea38-b583-4c86-b74a-bea55652851d@packett.cool
Fixes: c9ba789dad15 ("VFS: introduce start_creating_noperm() and start_removing_noperm()")
Signed-off-by: NeilBrown <neil@brown.name>
Link: https://patch.msgid.link/176454037897.634289.3566631742434963788@noble.neil.brown.name
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/fuse/dir.c