]> git.proxmox.com Git - mirror_lxc.git/commitdiff
cgmanager: detect whether cgmanager supports name= subsystems
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Thu, 8 May 2014 17:23:53 +0000 (12:23 -0500)
committerStéphane Graber <stgraber@ubuntu.com>
Thu, 8 May 2014 17:57:03 +0000 (12:57 -0500)
On older cgmanager the support was broken.  So rather than
fail container starts altogether, just keep the old lxc behavior
in this case by not using name= subsystems.

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
Acked-by: Stéphane Graber <stgraber@ubuntu.com>
src/lxc/cgmanager.c

index 1c9ac55860affa2a33433d5e2fba6632ea5ffff0..9b06d3182f4503e1e532ed25910f7d0652438bab 100644 (file)
@@ -51,6 +51,9 @@
 #include "start.h"
 #include "state.h"
 
+#define CGM_SUPPORTS_GET_ABS 3
+#define CGM_SUPPORTS_NAMED 4
+
 #ifdef HAVE_CGMANAGER
 lxc_log_define(lxc_cgmanager, lxc);
 
@@ -113,6 +116,7 @@ static struct cgroup_ops cgmanager_ops;
 static int nr_subsystems;
 static char **subsystems;
 static bool dbus_threads_initialized = false;
+static void cull_user_controllers(void);
 
 static void cgm_dbus_disconnect(void)
 {
@@ -172,6 +176,8 @@ static bool cgm_dbus_connect(void)
                cgm_dbus_disconnect();
                return false;
        }
+       if (api_version < CGM_SUPPORTS_NAMED)
+               cull_user_controllers();
        return true;
 }
 
@@ -617,7 +623,7 @@ static const char *cgm_get_cgroup(void *hdata, const char *subsystem)
 
 #if HAVE_CGMANAGER_GET_PID_CGROUP_ABS_SYNC
 static inline bool abs_cgroup_supported(void) {
-       return api_version >= 3;
+       return api_version >= CGM_SUPPORTS_GET_ABS;
 }
 #else
 static inline bool abs_cgroup_supported(void) {
@@ -813,6 +819,19 @@ static void free_subsystems(void)
        nr_subsystems = 0;
 }
 
+static void cull_user_controllers(void)
+{
+       int i, j;
+
+       for (i = 0;  i < nr_subsystems; i++) {
+               if (strncmp(subsystems[i], "name=", 5) != 0)
+                       continue;
+               for (j = i;  j < nr_subsystems-1; j++)
+                       subsystems[j] = subsystems[j+1];
+               nr_subsystems--;
+       }
+}
+
 static bool collect_subsytems(void)
 {
        char *line = NULL;