[Devel] [PATCH RH6 v2] proc: fix mangling cgroup mount source path in container

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Tue Oct 6 03:21:50 PDT 2015


Docker uses /proc/self/cgroup to know where he is in cgroup tree
and also it uses /proc/self/mountinfo to get from where cgroup
sub-tree(on which he is) is mounted, using both it can understand
where his cgroups are in his /sys/fs/cgroup sub-tree.

We need to mangle cgroup paths in mountinfo output consistently
with cgroup output, in /proc/self/cgroup we remove prefix "/$ctid"
do the same in mountinfo. It is not enought to show just "/" for
docker in docker: docker will bindmount in container sub-tree of
this container.

v2: fix compilation

https://jira.sw.ru/browse/PSBM-34295

Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
---
 kernel/cgroup.c | 38 +++++++++++++++++++++++++++++++++-----
 1 file changed, 33 insertions(+), 5 deletions(-)

diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index ad61c97..4268373 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -1375,11 +1375,39 @@ static int cgroup_remount(struct super_block *sb, int *flags, char *data)
 #ifdef CONFIG_VE
 int cgroup_show_path(struct seq_file *m, struct dentry *dentry)
 {
-	if (!ve_is_super(get_exec_env()))
-		seq_puts(m, "/");
-	else
-		seq_dentry(m, dentry, " \t\n\\");
-	return 0;
+	char *buf;
+	size_t size = seq_get_buf(m, &buf);
+	int res = -1, err = 0;
+
+	if (size) {
+		char *p = dentry_path(dentry, buf, size);
+		if (!IS_ERR(p)) {
+			char *end;
+			if (!ve_is_super(get_exec_env())) {
+				while (*++p != '/') {
+					/*
+					 * Mangle one level when showing
+					 * cgroup mount source in container
+					 * e.g.: "/111" -> "/",
+					 * "/111/test.slice/test.scope" ->
+					 * "/test.slice/test.scope"
+					 */
+					if (*p == '\0') {
+						*--p = '/';
+						break;
+					}
+				}
+			}
+			end = mangle_path(buf, p, " \t\n\\");
+			if (end)
+				res = end - buf;
+		} else {
+			err = PTR_ERR(p);
+		}
+	}
+	seq_commit(m, res);
+
+	return err;
 }
 #endif
 
-- 
1.9.3




More information about the Devel mailing list