#include "cgroup-util.h"
#include "log.h"
#include "strv.h"
+#include "path-util.h"
int cgroup_bonding_realize(CGroupBonding *b) {
int r;
cgroup_bonding_trim(b, delete_root);
}
-
int cgroup_bonding_install(CGroupBonding *b, pid_t pid, const char *cgroup_suffix) {
char *p = NULL;
const char *path;
assert(pid >= 0);
if (cgroup_suffix) {
- p = join(b->path, "/", cgroup_suffix, NULL);
+ p = strjoin(b->path, "/", cgroup_suffix, NULL);
if (!p)
return -ENOMEM;
return 0;
}
+int cgroup_bonding_migrate(CGroupBonding *b, CGroupBonding *list) {
+ CGroupBonding *q;
+ int ret = 0;
+
+ LIST_FOREACH(by_unit, q, list) {
+ int r;
+
+ if (q == b)
+ continue;
+
+ if (!q->ours)
+ continue;
+
+ r = cg_migrate_recursive(q->controller, q->path, b->controller, b->path, true, false);
+ if (r < 0 && ret == 0)
+ ret = r;
+ }
+
+ return ret;
+}
+
+int cgroup_bonding_migrate_to(CGroupBonding *b, const char *target, bool rem) {
+ assert(b);
+ assert(target);
+
+ return cg_migrate_recursive(b->controller, b->path, b->controller, target, true, rem);
+}
+
int cgroup_bonding_set_group_access(CGroupBonding *b, mode_t mode, uid_t uid, gid_t gid) {
assert(b);
return 0;
}
-int cgroup_bonding_kill(CGroupBonding *b, int sig, bool sigcont, Set *s, const char *cgroup_suffix) {
+int cgroup_bonding_kill(CGroupBonding *b, int sig, bool sigcont, bool rem, Set *s, const char *cgroup_suffix) {
char *p = NULL;
const char *path;
int r;
return 0;
if (cgroup_suffix) {
- p = join(b->path, "/", cgroup_suffix, NULL);
+ p = strjoin(b->path, "/", cgroup_suffix, NULL);
if (!p)
return -ENOMEM;
} else
path = b->path;
- r = cg_kill_recursive(b->controller, path, sig, sigcont, true, false, s);
+ r = cg_kill_recursive(b->controller, path, sig, sigcont, true, rem, s);
free(p);
return r;
}
-int cgroup_bonding_kill_list(CGroupBonding *first, int sig, bool sigcont, Set *s, const char *cgroup_suffix) {
+int cgroup_bonding_kill_list(CGroupBonding *first, int sig, bool sigcont, bool rem, Set *s, const char *cgroup_suffix) {
CGroupBonding *b;
Set *allocated_set = NULL;
int ret = -EAGAIN, r;
return -ENOMEM;
LIST_FOREACH(by_unit, b, first) {
- r = cgroup_bonding_kill(b, sig, sigcont, s, cgroup_suffix);
+ r = cgroup_bonding_kill(b, sig, sigcont, rem, s, cgroup_suffix);
if (r < 0) {
if (r == -EAGAIN || r == -ESRCH)
continue;
goto finish;
}
- if (m->running_as == MANAGER_SYSTEM)
+ if (m->running_as == SYSTEMD_SYSTEM)
strcpy(suffix, "/system");
else {
snprintf(suffix, sizeof(suffix), "/systemd-%lu", (unsigned long) getpid());
/* We need a new root cgroup */
m->cgroup_hierarchy = NULL;
if (asprintf(&m->cgroup_hierarchy, "%s%s", streq(current, "/") ? "" : current, suffix) < 0) {
- log_error("Out of memory");
- r = -ENOMEM;
+ r = log_oom();
goto finish;
}
}
log_debug("Created root group.");
- manager_shorten_default_controllers(m);
+ cg_shorten_controllers(m->default_controllers);
finish:
free(current);
m->cgroup_hierarchy = NULL;
}
-void manager_shorten_default_controllers(Manager *m) {
- char **f, **t;
-
- strv_uniq(m->default_controllers);
-
- if (!m->default_controllers)
- return;
-
- for (f = m->default_controllers, t = m->default_controllers; *f; f++) {
-
- if (!streq(*f, "systemd") && !streq(*f, "name=systemd")) {
- char *cc;
-
- cc = alloca(sizeof("/sys/fs/cgroup/") + strlen(*f));
- strcpy(stpcpy(cc, "/sys/fs/cgroup/"), *f);
-
- if (access(cc, F_OK) >= 0) {
- *(t++) = *f;
- continue;
- }
- }
-
- log_debug("Controller %s not available or redundant, removing from default controllers list.", *f);
- free(*f);
- }
-
- *t = NULL;
-}
-
int cgroup_bonding_get(Manager *m, const char *cgroup, CGroupBonding **bonding) {
CGroupBonding *b;
char *p;
return 1;
}
- p = strdup(cgroup);
+ p = strdupa(cgroup);
if (!p)
return -ENOMEM;
char *e;
e = strrchr(p, '/');
- if (!e || e == p) {
- free(p);
+ if (e == p || !e) {
*bonding = NULL;
return 0;
}
b = hashmap_get(m->cgroup_bondings, p);
if (b) {
- free(p);
*bonding = b;
return 1;
}
CGroupBonding *cgroup_bonding_find_list(CGroupBonding *first, const char *controller) {
CGroupBonding *b;
- assert(controller);
+ if (!controller)
+ controller = SYSTEMD_CGROUP_CONTROLLER;
LIST_FOREACH(by_unit, b, first)
if (streq(b->controller, controller))