]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
fuse: allow synchronous FUSE_INIT
authorMiklos Szeredi <mszeredi@redhat.com>
Fri, 22 Aug 2025 11:10:44 +0000 (13:10 +0200)
committerMiklos Szeredi <mszeredi@redhat.com>
Tue, 2 Sep 2025 09:14:15 +0000 (11:14 +0200)
commitdfb84c33079497bf27058b15780e1c7bba4c371b
treee45caf557d5bcfc1dcd6cc81e8de84a5531e570a
parent3ca1b311181072415b6432a169de765ac2034e5a
fuse: allow synchronous FUSE_INIT

FUSE_INIT has always been asynchronous with mount.  That means that the
server processed this request after the mount syscall returned.

This means that FUSE_INIT can't supply the root inode's ID, hence it
currently has a hardcoded value.  There are other limitations such as not
being able to perform getxattr during mount, which is needed by selinux.

To remove these limitations allow server to process FUSE_INIT while
initializing the in-core super block for the fuse filesystem.  This can
only be done if the server is prepared to handle this, so add
FUSE_DEV_IOC_SYNC_INIT ioctl, which

 a) lets the server know whether this feature is supported, returning
 ENOTTY othewrwise.

 b) lets the kernel know to perform a synchronous initialization

The implementation is slightly tricky, since fuse_dev/fuse_conn are set up
only during super block creation.  This is solved by setting the private
data of the fuse device file to a special value ((struct fuse_dev *) 1) and
waiting for this to be turned into a proper fuse_dev before commecing with
operations on the device file.

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/fuse/cuse.c
fs/fuse/dev.c
fs/fuse/dev_uring.c
fs/fuse/fuse_dev_i.h
fs/fuse/fuse_i.h
fs/fuse/inode.c
include/uapi/linux/fuse.h