[Virtio-fs] Fwd: [PATCH 0/3] virtiofsd: Find original inode ID of mount points
Max Reitz
mreitz at redhat.com
Wed May 12 14:37:49 UTC 2021
Sorry, forgot to CC the virtio-fs list. I hope forwarding the cover
letter is enough...
Here’s the link to the qemu-devel archive:
https://lists.nongnu.org/archive/html/qemu-devel/2021-05/msg03366.html
-------- Forwarded Message --------
Subject: [PATCH 0/3] virtiofsd: Find original inode ID of mount points
Date: Wed, 12 May 2021 14:55:41 +0200
From: Max Reitz <mreitz at redhat.com>
To: qemu-devel at nongnu.org
Copy (CC): Max Reitz <mreitz at redhat.com>, Dr . David Alan Gilbert
<dgilbert at redhat.com>, Stefan Hajnoczi <stefanha at redhat.com>
Hi,
Not announcing submounts to the guest may lead to duplicated
st_dev/st_ino combinations, because inodes on different filesystems
(different st_dev) may share the same inode ID (st_ino). If the guest
only sees a single st_dev, those inodes will appear to have the same
st_dev/st_ino combination.
Announcing submounts is supposed to solve this problem by making the
guest report different st_dev IDs for different filesystems.
However, there is one loop hole: Submounts are implemented as
auto-mounts, meaning when the virtio-fs filesystem is mounted, the
submounts will not be mounted immediately. In the guest, it is possible
to stat() these mount points with AT_NO_AUTOMOUNT to receive information
without mounting them, so they will then show whatever st_ino virtiofsd
passes, and the st_dev of the parent filesystem.
Unfortunately, as far as we understood, the only st_ino that virtiofsd
could inquire was the one on the submounted filesystem, i.e. the st_ino
of that FS’s root node.
Thus, we again got a collision: In said case, the guest would see st_dev
of the parent FS, but st_ino of the submounted FS. This is very likely
to be the same st_dev/st_ino combination as the root node of the parent
FS.
For nested mount structures, this can be reproduced with `find`:
Mounting several filesystems under each other, passing everything into a
guest, mounting the root virtio-fs FS there, and then invoking `find`
would likely result in it complaining about filesystem loops and
refusing to visit the submount points. (These loops are reported
because it takes notes of st_dev/st_ino combinations, and then reports a
loop when some combination reappears.) This can only be fixed by
forcing all submounts to be (auto-)mounted.
What we’d need to do is report the inode ID of the mount point directory
that it has on the parent filesystem to the guest, until the submount is
auto-mounted there. It’s just that we thought there was no way to
inquire this parent FS st_ino.
It turns out that our understand was wrong, though: There is a way,
namely readdir(). The dirent.d_ino field represents (in practice) the
st_ino of some directory entry on the directory’s filesystem, and so is
exactly the value we want to give to the guest.
Let’s do that.
Max Reitz (3):
virtiofsd: Find original inode ID of mount points
virtiofs_submounts.py: Do not generate ssh key
virtiofs_submounts.py: Check `find`
tools/virtiofsd/passthrough_ll.c | 104 +++++++++++++++++-
tests/acceptance/virtiofs_submounts.py | 10 +-
.../virtiofs_submounts.py.data/guest.sh | 56 ++++------
3 files changed, 122 insertions(+), 48 deletions(-)
--
2.31.1
More information about the Virtio-fs
mailing list