Re: [RFC][PATCH] btrfs_get_tree_subvol(): switch from fc_mount() to vfs_create_mount()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2025-05-06 20:33:05 +0100, Al Viro wrote:
> On Tue, May 06, 2025 at 08:58:59PM +0200, Klara Modin wrote:
> > > OK, let's try to see what clone_private_mount() is unhappy about...
> > > Could you try the following on top of -next + braino fix and see
> > > what shows up?  Another interesting thing, assuming you can get
> > > to shell after overlayfs mount failure, would be /proc/self/mountinfo
> > > contents and stat(1) output for upper path of your overlayfs mount...
> > 
> > 	ret = vfs_get_tree(dup_fc);
> > 	if (!ret) {
> > 		ret = btrfs_reconfigure_for_mount(dup_fc);
> > 		up_write(&dup_fc->root->d_sb->s_umount);
> > 	}
> > 	if (!ret)
> > 		mnt = vfs_create_mount(fc);
> > 	else
> > 		mnt = ERR_PTR(ret);
> > 	put_fs_context(dup_fc);
> > 
> > 
> > I tried replacing fc with dup_fc in vfs_create_mount and it seems to
> > work.
> 
> *blink*
> 
> OK, I'm a blind idiot - blind for not seeing the braino duplication,
> idiot for not thinking to check if the same thing has happened
> more than once.

No worries, thanks for taking the time to debug.

> 
> Kudos for catching that.  I still wonder what the hell got passed
> to overlayfs, though - vfs_create_mount() should've hit
>         if (!fc->root)
> 		return ERR_PTR(-EINVAL);
> since fc->root definitely was NULL there.  So we should've gotten
> a failing btrfs mount; fine, but that does not explain the form
> of breakage you are seeing on the overlayfs side...  Actually...
> is that mount attempted while still on initramfs?  Because if
> it is, we are running into a separate clone_private_mount()
> bug.
> 
> There's nothing to prohibit an overlayfs mount with writable layer
> being a subtree of initramfs; odd, but nothing inherently wrong
> with that setup.  And prior to that clone_private_mount() change
> it used to be fine; we would get a private mount with root
> pointing to subtree of initramfs and went on to use that.
> 

Yep, this is still within the initramfs. I later switch_root into the
overlay.

> We used to require the original mount to be in our namespace;
> Christian's change added "... or root of anon namespace".
> The order of checks went wrong, though.  We check for "is
> it an absolute root" *first* and treat that as a discriminator
> between the new and old cases.  It should be the other way
> round - "is it in our namespace" should take precedence.
> 
> IOW,
> 	if (!check_mount(...)) { // if it's not ours...
> 		// ... it should be root...
> 		if (mnt_has_parent(...))
> 			fail
> 		// ... of anon namespace...
> 		if (!is_mounted(...) || !is_anon_ns(...))
> 			fail
> 		// ... and create no namespace loops -
> 		// or no hidden references to namespaces, period
> 		if (mnt_ns_loop(...)) // or, perhaps, if (mnt_ns_from_dentry(...))
> 			fail
> 	}
> Anyway, that's a separate issue.




[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux