Re: [PATCH 0/2] virtio-fs: Add 'file' mount option

From: Hanna Czenczek
Date: Thu Jul 11 2024 - 04:21:52 EST


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