Thread (1 message) 1 message, 1 author, 2021-05-21

Re: [PATCH v4 2/5] fuse: Call vfs_get_tree() for submounts

flat view

From: Greg Kurz <hidden>
Date: 2021-05-21 08:29:02
Also in: linux-fsdevel, lkml

On Fri, 21 May 2021 10:19:48 +0200
Miklos Szeredi [off-list ref] wrote:
quoted hunk
On Thu, May 20, 2021 at 05:46:51PM +0200, Greg Kurz wrote:
quoted
We don't set the SB_BORN flag on submounts superblocks. This is wrong
as these superblocks are then considered as partially constructed or
dying in the rest of the code and can break some assumptions.

One such case is when you have a virtiofs filesystem and you try to
mount it again : virtio_fs_get_tree() tries to obtain a superblock
with sget_fc(). The matching criteria in virtio_fs_test_super() is
the pointer of the underlying virtiofs device, which is shared by
the root mount and its submounts. This means that any submount can
be picked up instead of the root mount. This is itself a bug :
submounts should be ignored in this case. But, most importantly, it
then triggers an infinite loop in sget_fc() because it fails to grab
the superblock (very easy to reproduce).

The only viable solution is to set SB_BORN at some point. This
must be done with vfs_get_tree() because setting SB_BORN requires
special care, i.e. a memory barrier for super_cache_count() which
can check SB_BORN without taking any lock.
Looks correct, but...

as an easily backportable and verifiable bugfix I'd still go with the
simple two liner:
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -351,6 +351,9 @@ static struct vfsmount *fuse_dentry_automount(struct path *path)
 	list_add_tail(&fm->fc_entry, &fc->mounts);
 	up_write(&fc->killsb);
 
+	smp_wmb();
+	sb->s_flags |= SB_BORN;
+
plus the mandatory comment one must put to justify the
need for a memory barrier.
 	/* Create the submount */
 	mnt = vfs_create_mount(fsc);
 	if (IS_ERR(mnt)) {

And have this patch be the cleanup.
Fair enough.
Also we need Fixes: and a Cc: stable@... tags on that one.
Oops, I'll add these in the next round.
Thanks,
Miklos
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help