Skip to content

Commit d550114

Browse files
luis-henrixbrauner
authored andcommitted
fuse: fix possible deadlock if rings are never initialized
When mounting a user-space filesystem using io_uring, the initialization of the rings is done separately in the server side. If for some reason (e.g. a server bug) this step is not performed it will be impossible to unmount the filesystem if there are already requests waiting. This issue is easily reproduced with the libfuse passthrough_ll example, if the queue depth is set to '0' and a request is queued before trying to unmount the filesystem. When trying to force the unmount, fuse_abort_conn() will try to wake up all tasks waiting in fc->blocked_waitq, but because the rings were never initialized, fuse_uring_ready() will never return 'true'. Fixes: 3393ff9 ("fuse: block request allocation until io-uring init is complete") Signed-off-by: Luis Henriques <[email protected]> Link: https://lore.kernel.org/r/[email protected] Acked-by: Miklos Szeredi <[email protected]> Reviewed-by: Bernd Schubert <[email protected]> Signed-off-by: Christian Brauner <[email protected]>
1 parent 613218f commit d550114

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

fs/fuse/dev.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ void fuse_set_initialized(struct fuse_conn *fc)
7777
static bool fuse_block_alloc(struct fuse_conn *fc, bool for_background)
7878
{
7979
return !fc->initialized || (for_background && fc->blocked) ||
80-
(fc->io_uring && !fuse_uring_ready(fc));
80+
(fc->io_uring && fc->connected && !fuse_uring_ready(fc));
8181
}
8282

8383
static void fuse_drop_waiting(struct fuse_conn *fc)

0 commit comments

Comments
 (0)