Commit 7eb44573 by Serge Hallyn Committed by Stéphane Graber

re-open cgmanager socket after fork in daemonized start

parent 1d167857
...@@ -114,7 +114,8 @@ static bool cgm_dbus_connect(void) ...@@ -114,7 +114,8 @@ static bool cgm_dbus_connect(void)
static void cgm_dbus_disconnect(void) static void cgm_dbus_disconnect(void)
{ {
nih_free(cgroup_manager); if (cgroup_manager)
nih_free(cgroup_manager);
cgroup_manager = NULL; cgroup_manager = NULL;
} }
...@@ -886,5 +887,6 @@ static struct cgroup_ops cgmanager_ops = { ...@@ -886,5 +887,6 @@ static struct cgroup_ops cgmanager_ops = {
.attach = cgm_attach, .attach = cgm_attach,
.mount_cgroup = cgm_mount_cgroup, .mount_cgroup = cgm_mount_cgroup,
.nrtasks = cgm_get_nrtasks, .nrtasks = cgm_get_nrtasks,
.disconnect = cgm_dbus_disconnect,
}; };
#endif #endif
...@@ -167,3 +167,11 @@ int lxc_cgroup_get(const char *filename, char *value, size_t len, const char *na ...@@ -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 ops->get(filename, value, len, name, lxcpath);
return -1; return -1;
} }
void restart_cgroups(void)
{
if (ops && ops->disconnect)
ops->disconnect();
ops = NULL;
cgroup_ops_init();
}
...@@ -49,6 +49,7 @@ struct cgroup_ops { ...@@ -49,6 +49,7 @@ struct cgroup_ops {
bool (*attach)(const char *name, const char *lxcpath, pid_t pid); bool (*attach)(const char *name, const char *lxcpath, pid_t pid);
bool (*mount_cgroup)(void *hdata, const char *root, int type); bool (*mount_cgroup)(void *hdata, const char *root, int type);
int (*nrtasks)(void *hdata); int (*nrtasks)(void *hdata);
void (*disconnect)(void);
}; };
extern bool cgroup_attach(const char *name, const char *lxcpath, pid_t pid); 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); ...@@ -64,5 +65,6 @@ extern bool cgroup_create_legacy(struct lxc_handler *handler);
extern int cgroup_nrtasks(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 const char *cgroup_get_cgroup(struct lxc_handler *handler, const char *subsystem);
extern bool cgroup_unfreeze(struct lxc_handler *handler); extern bool cgroup_unfreeze(struct lxc_handler *handler);
extern void restart_cgroups(void);
#endif #endif
...@@ -637,6 +637,7 @@ static bool lxcapi_start(struct lxc_container *c, int useinit, char * const argv ...@@ -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);
open("/dev/null", O_RDWR); open("/dev/null", O_RDWR);
setsid(); setsid();
restart_cgroups();
} else { } else {
if (!am_single_threaded()) { if (!am_single_threaded()) {
ERROR("Cannot start non-daemonized container when threaded"); ERROR("Cannot start non-daemonized container when threaded");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment