From 1d39a0658370ac104825e796bf90bb96ae0b7027 Mon Sep 17 00:00:00 2001 From: David Ward Date: Fri, 4 May 2012 00:50:15 +0200 Subject: [PATCH] cgroup: only touch hierarchies that are bound to subsystems Obtain a list of subsystems from /proc/cgroups, and ignore hierarchies that are not bound to any of them (especially the 'systemd' hierarchy: http://www.freedesktop.org/wiki/Software/systemd/PaxControlGroups ). Signed-off-by: David Ward Signed-off-by: Daniel Lezcano --- src/lxc/cgroup.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/lxc/cgroup.c b/src/lxc/cgroup.c index 7d91bbc0a..e124499e7 100644 --- a/src/lxc/cgroup.c +++ b/src/lxc/cgroup.c @@ -53,6 +53,39 @@ enum { CGROUP_CLONE_CHILDREN, }; +/* Check if a mount is a cgroup hierarchy for any subsystem. + * Return the first subsystem found (or NULL if none). + */ +static char *mount_has_subsystem(const struct mntent *mntent) +{ + FILE *f; + char *c, *ret; + char line[MAXPATHLEN]; + + /* read the list of subsystems from the kernel */ + f = fopen("/proc/cgroups", "r"); + if (!f) + return 0; + + /* skip the first line, which contains column headings */ + if (!fgets(line, MAXPATHLEN, f)) + return 0; + + while (fgets(line, MAXPATHLEN, f)) { + c = strchr(line, '\t'); + if (!c) + continue; + *c = '\0'; + + ret = hasmntopt(mntent, line); + if (ret) + break; + } + + fclose(f); + return ret; +} + /* * get_init_cgroup: get the cgroup init is in. * dsg: preallocated buffer to put the output in @@ -139,8 +172,15 @@ static int get_cgroup_mount(const char *subsystem, char *mnt) while ((mntent = getmntent(file))) { if (strcmp(mntent->mnt_type, "cgroup")) continue; - if (subsystem && !hasmntopt(mntent, subsystem)) - continue; + + if (subsystem) { + if (!hasmntopt(mntent, subsystem)) + continue; + } + else { + if (!mount_has_subsystem(mntent)) + continue; + } flags = get_cgroup_flags(mntent); ret = snprintf(mnt, MAXPATHLEN, "%s%s%s", mntent->mnt_dir, @@ -266,6 +306,8 @@ int lxc_cgroup_attach(const char *name, pid_t pid) if (strcmp(mntent->mnt_type, "cgroup")) continue; + if (!mount_has_subsystem(mntent)) + continue; INFO("[%d] found cgroup mounted at '%s',opts='%s'", ++found, mntent->mnt_dir, mntent->mnt_opts); @@ -420,6 +462,8 @@ int lxc_cgroup_create(const char *name, pid_t pid) if (strcmp(mntent->mnt_type, "cgroup")) continue; + if (!mount_has_subsystem(mntent)) + continue; INFO("[%d] found cgroup mounted at '%s',opts='%s'", ++found, mntent->mnt_dir, mntent->mnt_opts); @@ -519,6 +563,8 @@ int lxc_cgroup_destroy(const char *name) while ((mntent = getmntent(file))) { if (strcmp(mntent->mnt_type, "cgroup")) continue; + if (!mount_has_subsystem(mntent)) + continue; err = lxc_one_cgroup_destroy(mntent, name); if (err) -- 2.39.2