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 <david.w...@ll.mit.edu>
---
 src/lxc/cgroup.c |   50 ++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/src/lxc/cgroup.c b/src/lxc/cgroup.c
index 06aa1a0..8ccbc50 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
@@ -124,8 +157,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;
+               }
 
                ret = snprintf(mnt, MAXPATHLEN, "%s%s/lxc", mntent->mnt_dir,
                               get_init_cgroup(subsystem, NULL, initcgroup));
@@ -252,6 +292,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);
@@ -405,6 +447,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);
@@ -502,6 +546,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)
-- 
1.7.1


------------------------------------------------------------------------------
Try before you buy = See our experts in action!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-dev2
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to