@@ -62,6 +63,13 @@ static struct dentry *public_dev_mount(struct
file_system_type *fs_type, int fla
const char *dev_name, void *data)
{
struct super_block *s = mnt->mnt_sb;
+#ifdef CONFIG_VE
+ struct ve_struct *ve = get_exec_env();
+
+ if (!ve_is_super(ve))
+ s = ve->devtmpfs_mnt->mnt_sb;
+#endif
+
We don't have any lock here, so why can't we get a race with ve_destroy()?
Because ve_destroy() is called on ve cgroup destruction and no processes
are in this cgroup and thus get_exec_env() can't return semi-dead ve
cgroup?
Yea in common case current is holding ve cgroup and it can't get to
ve_destroy as cgroup is populated.
https://github.com/OpenVZ/vzkernel/blob/branch-rh8-4.18.0-305.3.1.vz8.7.x-ovz/kernel/cgroup/cgroup.c#L5485
But in uncommon case where we first do ve=get_exec_env() and then
current task is moved into another ve cgroup and our old ve cgroup is
destroyed and freed and only after that we access
ve->devtmpfs_mnt->mnt_sb and probably crash on it.
Any other place where we access pointers from ve got from get_exec_env()
without locks are affected e.g. in ve_relative_clock() and probably many
more... We could fix this by adding actual reference count to
get_exec_env() and adding new helper e.g. put_ve(ve) to drop this
reference... But it would change code everywhere and this case of task
moved to other ve by other task while in syscall is probably a rare one...
atomic_inc(&s->s_active);
down_write(&s->s_umount);
return dget(s->s_root);
@@ -82,6 +90,7 @@ static struct file_system_type internal_fs_type = {
static struct file_system_type dev_fs_type = {
.name = "devtmpfs",
.mount = public_dev_mount,
+ .fs_flags = FS_VIRTUALIZED | FS_USERNS_MOUNT,
i'll put FS_VE_MOUNT instead of FS_USERNS_MOUNT.
i've checked on host:
# unshare -U
# mount -t devtmpfs devtmpfs /mnt
does not work
If you have any arguments against this - please let me know.
Right, I was initially planning to do so, but forgot.
--
Best regards, Tikhomirov Pavel
Software Developer, Virtuozzo.
_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel