[Devel] [PATCH rh7 v2] ve/devpts: Force devpts mounting to use @newinstance inside VE
Cyrill Gorcunov
gorcunov at virtuozzo.com
Tue Jul 21 03:23:51 PDT 2015
Modern systemd based containers (such as fedora-21, centos-7) already
mounting initial devpts filesystem with @newinstance option but it
turned out that ubuntu-14 lts doesn't, which makes restore procedure
to fail because we're using get_exec_env as a namespace mark and the
kernel mounts new superblock for container internally. This is done
to isolate devpts between containers but somehow incomplete: @devpts_sb
should server as a root superblock for VE mount namespace. Fix it
adjusting first mount if no @devpts_sb has been assigned.
https://jira.sw.ru/browse/PSBM-34931
Signed-off-by: Cyrill Gorcunov <gorcunov at virtuozzo.com>
CC: Andrey Vagin <avagin at virtuozzo.com>
CC: Vladimir Davydov <vdavydov at virtuozzo.com>
CC: Konstantin Khorenko <khorenko at virtuozzo.com>
CC: Pavel Emelyanov <xemul at virtuozzo.com>
---
Andrew, would this be more suitable?
fs/devpts/inode.c | 25 ++++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)
Index: linux-pcs7.git/fs/devpts/inode.c
===================================================================
--- linux-pcs7.git.orig/fs/devpts/inode.c
+++ linux-pcs7.git/fs/devpts/inode.c
@@ -449,10 +449,29 @@ static struct dentry *devpts_mount(struc
(current_user_ns() != &init_user_ns) && !opts.newinstance)
return ERR_PTR(-EINVAL);
- if (opts.newinstance)
+ /*
+ * When we mount devpts it is somehow tricky because of ours
+ * virtualization for containers sake.
+ *
+ * 1) If container mounts devpts without @newinstance option
+ * the superblock should point to virtualized one.
+ *
+ * 2) If container mounts devpts with @newinstance option
+ * the superblock should point into a newly created one.
+ *
+ * Thus we use @devpts_sb as a global root superblock for
+ * each container (including VE0) so if there is no
+ * @devpts_sb exist we drop @newinstance option and
+ * mount it in context of container's mount namespace,
+ * otherwise the old logic remains -- next calls to
+ * mount with @newinstance allocate new superblocks.
+ */
+ if (opts.newinstance && get_exec_env()->devpts_sb) {
root = mount_nodev(fs_type, flags, data, devpts_fill_super);
- else
+ } else {
+ opts.newinstance = 0;
root = mount_ns(fs_type, flags, data, get_exec_env(), devpts_fill_super);
+ }
if (IS_ERR(root))
return ERR_CAST(root);
@@ -464,7 +483,7 @@ static struct dentry *devpts_mount(struc
if (error)
goto out_undo_sget;
- if (!opts.newinstance) {
+ if (!opts.newinstance && !get_exec_env()->devpts_sb) {
atomic_inc(&s->s_active);
get_exec_env()->devpts_sb = s;
}
More information about the Devel
mailing list