From: Serge Hallyn Date: Thu, 8 May 2014 17:23:53 +0000 (-0500) Subject: cgmanager: detect whether cgmanager supports name= subsystems X-Git-Tag: lxc-1.1.0.alpha1~101 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=29b0b04b32a5aa22ebcf043984a2a12c180104d3;p=thirdparty%2Flxc.git cgmanager: detect whether cgmanager supports name= subsystems 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 Acked-by: Stéphane Graber --- diff --git a/src/lxc/cgmanager.c b/src/lxc/cgmanager.c index 1c9ac5586..9b06d3182 100644 --- a/src/lxc/cgmanager.c +++ b/src/lxc/cgmanager.c @@ -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;