Ignore trailing /init.scope in init cgroups

The lxc monitor does not store the container's cgroups, rather it
recalculates them whenever needed.

Systemd moves itself into a /init.scope cgroup for the systemd
controller.

It might be worth changing that (by storing all cgroup info in the
lxc_handler), but for now go the hacky route and chop off any
trailing /init.scope.

I definately thinkg we want to switch to storing as that will be
more bullet-proof, but for now we need a quick backportable fix
for systemd 226 guests.

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
Acked-by: Stéphane Graber <stgraber@ubuntu.com>
This commit is contained in:
Serge Hallyn 2015-10-15 18:56:17 +00:00 committed by Stéphane Graber
parent 27c278a769
commit f348e47c93
4 changed files with 18 additions and 0 deletions

View File

@ -1220,6 +1220,7 @@ static char *lxc_cgroup_get_hierarchy_path_data(const char *subsystem, struct cg
info = find_info_for_subsystem(info, subsystem); info = find_info_for_subsystem(info, subsystem);
if (!info) if (!info)
return NULL; return NULL;
prune_init_scope(info->cgroup_path);
return info->cgroup_path; return info->cgroup_path;
} }

View File

@ -776,6 +776,7 @@ static char *try_get_abs_cgroup(const char *name, const char *lxcpath,
nerr = nih_error_get(); nerr = nih_error_get();
nih_free(nerr); nih_free(nerr);
} }
prune_init_scope(cgroup);
return cgroup; return cgroup;
} }

View File

@ -194,3 +194,17 @@ cgroup_driver_t cgroup_driver(void)
{ {
return ops->driver; return ops->driver;
} }
#define INIT_SCOPE "/init.scope"
void prune_init_scope(char *cg)
{
char *point = cg + strlen(cg) - strlen(INIT_SCOPE);
if (point < cg)
return;
if (strcmp(point, INIT_SCOPE) == 0) {
if (point == cg)
*(point+1) = '\0';
else
*point = '\0';
}
}

View File

@ -80,4 +80,6 @@ extern bool cgroup_unfreeze(struct lxc_handler *handler);
extern void cgroup_disconnect(void); extern void cgroup_disconnect(void);
extern cgroup_driver_t cgroup_driver(void); extern cgroup_driver_t cgroup_driver(void);
extern void prune_init_scope(char *cg);
#endif #endif