From 7eb44573b01b70b21bd007ab3f917e56a2a555d4 Mon Sep 17 00:00:00 2001 From: Serge Hallyn Date: Sat, 15 Feb 2014 00:16:58 +0100 Subject: [PATCH] re-open cgmanager socket after fork in daemonized start MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Serge Hallyn Acked-by: Stéphane Graber --- src/lxc/cgmanager.c | 4 +++- src/lxc/cgroup.c | 8 ++++++++ src/lxc/cgroup.h | 2 ++ src/lxc/lxccontainer.c | 1 + 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/lxc/cgmanager.c b/src/lxc/cgmanager.c index e4bd7349c..d683bdedb 100644 --- a/src/lxc/cgmanager.c +++ b/src/lxc/cgmanager.c @@ -114,7 +114,8 @@ static bool cgm_dbus_connect(void) static void cgm_dbus_disconnect(void) { - nih_free(cgroup_manager); + if (cgroup_manager) + nih_free(cgroup_manager); cgroup_manager = NULL; } @@ -886,5 +887,6 @@ static struct cgroup_ops cgmanager_ops = { .attach = cgm_attach, .mount_cgroup = cgm_mount_cgroup, .nrtasks = cgm_get_nrtasks, + .disconnect = cgm_dbus_disconnect, }; #endif diff --git a/src/lxc/cgroup.c b/src/lxc/cgroup.c index b03f69de6..d931520b2 100644 --- a/src/lxc/cgroup.c +++ b/src/lxc/cgroup.c @@ -167,3 +167,11 @@ int lxc_cgroup_get(const char *filename, char *value, size_t len, const char *na return ops->get(filename, value, len, name, lxcpath); return -1; } + +void restart_cgroups(void) +{ + if (ops && ops->disconnect) + ops->disconnect(); + ops = NULL; + cgroup_ops_init(); +} diff --git a/src/lxc/cgroup.h b/src/lxc/cgroup.h index 6f9e5f645..e3cf6e0ff 100644 --- a/src/lxc/cgroup.h +++ b/src/lxc/cgroup.h @@ -49,6 +49,7 @@ struct cgroup_ops { bool (*attach)(const char *name, const char *lxcpath, pid_t pid); bool (*mount_cgroup)(void *hdata, const char *root, int type); int (*nrtasks)(void *hdata); + void (*disconnect)(void); }; extern bool cgroup_attach(const char *name, const char *lxcpath, pid_t pid); @@ -64,5 +65,6 @@ extern bool cgroup_create_legacy(struct lxc_handler *handler); extern int cgroup_nrtasks(struct lxc_handler *handler); extern const char *cgroup_get_cgroup(struct lxc_handler *handler, const char *subsystem); extern bool cgroup_unfreeze(struct lxc_handler *handler); +extern void restart_cgroups(void); #endif diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index ee7d4059c..2e9798f12 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -637,6 +637,7 @@ static bool lxcapi_start(struct lxc_container *c, int useinit, char * const argv open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); setsid(); + restart_cgroups(); } else { if (!am_single_threaded()) { ERROR("Cannot start non-daemonized container when threaded"); -- 2.39.5