On 10.07.24 20:42, Josef Bacik wrote:
On Wed, Jul 10, 2024 at 09:28:08AM +0200, Hanna Czenczek wrote:
On 09.07.24 19:56, Josef Bacik wrote:
On Tue, Jul 09, 2024 at 01:19:16PM +0200, Hanna Czenczek wrote:
Hi,
We want to be able to mount filesystems that just consist of one regular
file via virtio-fs, i.e. no root directory, just a file as the root
node.
While that is possible via FUSE itself (through the 'rootmode' mount
option, which is automatically set by the fusermount help program to
match the mount point's inode mode), there is no virtio-fs option yet
that would allow changing the rootmode from S_IFDIR to S_IFREG.
To do that, this series introduces a new 'file' mount option that does
precisely that. Alternatively, we could provide the same 'rootmode'
option that FUSE has, but as laid out in patch 1's commit description,
that option is a bit cumbersome for virtio-fs (in a way that it is not
for FUSE), and its usefulness as a more general option is limited.
All this does is make file an alias for something a little easier for users to
read, which can easily be done in libfuse. Add the code to lib/mount.c to alias
'file' to turn it into rootmode=S_IFREG when it sends it to the kernel, it's not
necessary to do this in the kernel. Thanks,
This series is not about normal FUSE filesystems (file_system_type
fuse_fs_type, “fuse”), but about virtio-fs (file_system_type virtio_fs_type,
“virtiofs”), i.e. a case where libfuse and fusermount are not involved at
all. As far as I’m aware, mounting a virtio-fs filesystem with a
non-directory root inode is currently not possible at all.
Ok so I think I had it backwards in my head, my apologies.
That being said I still don't understand why this requires a change to virtiofs
at all.
I have a virtiofs thing attached to my VM. Inside the vm I do
mount -t virtiofs <name of thing I've attached to the vm> /directory
and then on the host machine, virtiofsd is a "normal" FUSE driver, except it's
talking over the socket you setup between the guest and the host. I assume this
is all correct?
So then the question is, why does it matter what virtiofsd is exposing? I guess
that's the better question. The guest shouldn't have to care if it's a
directory or a file right? The mountpoint is going to be a directory, whatever
is backing it shouldn't matter. Could you describe the exact thing you're
trying to accomplish? Thanks,
The mount point needs to be of the same mode as the root node of the
mounted filesystem, or it’ll be inaccessible after mounting[1]. In this
case, I want to export a regular file as the root node, so the root node
must be a regular file, too:
host$ echo foo > /tmp/bar
host$ virtiofsd --shared-dir /tmp/bar --socket-path /tmp/viofsd.sock
--sandbox none
guest# mkdir /tmp/mnt-dir
guest# mount -t virtiofs virtiofs-tag /tmp/mnt-dir
guest# stat /tmp/mnt-dir
stat: cannot statx '/tmp/mnt-dir': Input/output error
guest# cat /tmp/mnt-dir
cat: /tmp/mnt-dir: Input/output error
guest# ls /tmp/mnt-dir
ls: cannot access '/tmp/mnt-dir': Input/output error
guest# umount /tmp/mnt-dir
(following with this series applied)
guest# touch /tmp/mnt-file
guest# mount -t virtiofs virtiofs-tag /tmp/mnt-file -o file
guest# stat /tmp/mnt-file
File: /tmp/mnt-file
Size: 4 Blocks: 8 IO Block: 4096 regular file
[...]
guest# cat /tmp/mnt-file
foo
guest# ls --file-type /tmp/mnt-file
/tmp/mnt-file
guest# ls --file-type /tmp
mnt-dir/
mnt-file
[...]
[1] As far as I remember, FUSE/virtio-fs will present the root node’s
mode as 'rootmode' during mounting, and so the d_is_dir() equality
checks in do_move_mount() and graft_tree() just check whether that
matches the mount point’s mode. So, like in the example above, mounting
a filesystem whose root node is a regular file to a directory mount
point without '-o file' succeeds. But accessing it then fails, probably
because the mismatch is then noticed somewhere (virtiofsd receives a
GETATTR request, that’s it), i.e. the root node is supposed to be a
directory, but it turns out not to be after all.
Hanna