From: Christian Brauner Date: Thu, 27 Feb 2020 22:02:31 +0000 (+0100) Subject: cgroups: honor lxc.cgroup.pattern if set explicitly X-Git-Tag: lxc-4.0.0~50^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b3ed206162fb81fee46a2f7d6e39390f17ba6e76;p=thirdparty%2Flxc.git cgroups: honor lxc.cgroup.pattern if set explicitly Link: https://discuss.linuxcontainers.org/t/lxc-cgroup-pattern-is-not-being-honored Signed-off-by: Christian Brauner --- diff --git a/configure.ac b/configure.ac index 28f34f13f..31bf90b15 100644 --- a/configure.ac +++ b/configure.ac @@ -487,7 +487,7 @@ AC_ARG_WITH([rootfs-path], # cgroup pattern specification AC_ARG_WITH([cgroup-pattern], [AS_HELP_STRING([--with-cgroup-pattern=pattern], [pattern for container cgroups])], - [with_cgroup_pattern=$withval], [with_cgroup_pattern=['lxc.payload.%n']]) + [with_cgroup_pattern=$withval], [with_cgroup_pattern=['']]) # The path for the apparmor_parser's cache for generated apparmor profiles AC_ARG_WITH([apparmor-cache-dir], diff --git a/src/lxc/cgroups/cgfsng.c b/src/lxc/cgroups/cgfsng.c index aa054a63d..5dfffcd92 100644 --- a/src/lxc/cgroups/cgfsng.c +++ b/src/lxc/cgroups/cgfsng.c @@ -1243,7 +1243,7 @@ static void cgroup_remove_leaf(struct hierarchy *h, bool payload) __cgfsng_ops static inline bool cgfsng_monitor_create(struct cgroup_ops *ops, struct lxc_handler *handler) { - __do_free char *monitor_cgroup = NULL; + __do_free char *monitor_cgroup = NULL, *__cgroup_tree = NULL; const char *cgroup_tree; int idx = 0; int i; @@ -1264,17 +1264,23 @@ __cgfsng_ops static inline bool cgfsng_monitor_create(struct cgroup_ops *ops, return ret_set_errno(false, EINVAL); conf = handler->conf; - cgroup_tree = conf->cgroup_meta.dir; - if (cgroup_tree) + if (conf->cgroup_meta.dir) { + cgroup_tree = conf->cgroup_meta.dir; monitor_cgroup = must_concat(&len, conf->cgroup_meta.dir, "/", DEFAULT_MONITOR_CGROUP_PREFIX, handler->name, CGROUP_CREATE_RETRY, NULL); - else + } else if (ops->cgroup_pattern) { + __cgroup_tree = lxc_string_replace("%n", handler->name, ops->cgroup_pattern); + cgroup_tree = __cgroup_tree; + monitor_cgroup = must_concat(&len, cgroup_tree, + CGROUP_CREATE_RETRY, NULL); + } else { monitor_cgroup = must_concat(&len, DEFAULT_MONITOR_CGROUP_PREFIX, handler->name, CGROUP_CREATE_RETRY, NULL); + } if (!monitor_cgroup) return ret_set_errno(false, ENOMEM); @@ -1311,7 +1317,7 @@ __cgfsng_ops static inline bool cgfsng_monitor_create(struct cgroup_ops *ops, __cgfsng_ops static inline bool cgfsng_payload_create(struct cgroup_ops *ops, struct lxc_handler *handler) { - __do_free char *container_cgroup = NULL; + __do_free char *container_cgroup = NULL, *__cgroup_tree = NULL; const char *cgroup_tree; int idx = 0; int i; @@ -1332,17 +1338,23 @@ __cgfsng_ops static inline bool cgfsng_payload_create(struct cgroup_ops *ops, return ret_set_errno(false, EINVAL); conf = handler->conf; - cgroup_tree = conf->cgroup_meta.dir; - if (cgroup_tree) + if (conf->cgroup_meta.dir) { + cgroup_tree = conf->cgroup_meta.dir; container_cgroup = must_concat(&len, cgroup_tree, "/", DEFAULT_PAYLOAD_CGROUP_PREFIX, handler->name, CGROUP_CREATE_RETRY, NULL); - else + } else if (ops->cgroup_pattern) { + __cgroup_tree = lxc_string_replace("%n", handler->name, ops->cgroup_pattern); + cgroup_tree = __cgroup_tree; + container_cgroup = must_concat(&len, cgroup_tree, + CGROUP_CREATE_RETRY, NULL); + } else { container_cgroup = must_concat(&len, DEFAULT_PAYLOAD_CGROUP_PREFIX, handler->name, CGROUP_CREATE_RETRY, NULL); + } if (!container_cgroup) return ret_set_errno(false, ENOMEM); @@ -3179,12 +3191,8 @@ __cgfsng_ops static int cgfsng_data_init(struct cgroup_ops *ops) /* copy system-wide cgroup information */ cgroup_pattern = lxc_global_config_value("lxc.cgroup.pattern"); - if (!cgroup_pattern) { - /* lxc.cgroup.pattern is only NULL on error. */ - ERROR("Failed to retrieve cgroup pattern"); - return ret_set_errno(-1, ENOMEM); - } - ops->cgroup_pattern = must_copy_string(cgroup_pattern); + if (cgroup_pattern && strcmp(cgroup_pattern, "") != 0) + ops->cgroup_pattern = must_copy_string(cgroup_pattern); return 0; } diff --git a/src/lxc/initutils.c b/src/lxc/initutils.c index 41ed9e942..e5d452307 100644 --- a/src/lxc/initutils.c +++ b/src/lxc/initutils.c @@ -84,13 +84,13 @@ const char *lxc_global_config_value(const char *option_name) sprintf(user_config_path, "%s/.config/lxc/lxc.conf", user_home); sprintf(user_default_config_path, "%s/.config/lxc/default.conf", user_home); sprintf(user_lxc_path, "%s/.local/share/lxc/", user_home); - user_cgroup_pattern = strdup("%n"); } else { user_config_path = strdup(LXC_GLOBAL_CONF); user_default_config_path = strdup(LXC_DEFAULT_CONFIG); user_lxc_path = strdup(LXCPATH); - user_cgroup_pattern = strdup(DEFAULT_CGROUP_PATTERN); + if (strcmp(DEFAULT_CGROUP_PATTERN, "") != 0) + user_cgroup_pattern = strdup(DEFAULT_CGROUP_PATTERN); } const char * const (*ptr)[2];