if (u == other)
return 0;
- if (UNIT_VTABLE(u)->no_requires &&
- (d == UNIT_REQUIRES ||
- d == UNIT_REQUIRES_OVERRIDABLE ||
- d == UNIT_REQUISITE ||
- d == UNIT_REQUISITE_OVERRIDABLE ||
- d == UNIT_BIND_TO)) {
- return -EINVAL;
- }
-
if ((r = set_ensure_allocated(&u->meta.dependencies[d], trivial_hash_func, trivial_compare_func)) < 0)
return r;
}
int unit_add_cgroup(Unit *u, CGroupBonding *b) {
- CGroupBonding *l;
int r;
assert(u);
/* Ensure this hasn't been added yet */
assert(!b->unit);
- l = hashmap_get(u->meta.manager->cgroup_bondings, b->path);
- LIST_PREPEND(CGroupBonding, by_path, l, b);
+ if (streq(b->controller, SYSTEMD_CGROUP_CONTROLLER)) {
+ CGroupBonding *l;
- if ((r = hashmap_replace(u->meta.manager->cgroup_bondings, b->path, l)) < 0) {
- LIST_REMOVE(CGroupBonding, by_path, l, b);
- return r;
+ l = hashmap_get(u->meta.manager->cgroup_bondings, b->path);
+ LIST_PREPEND(CGroupBonding, by_path, l, b);
+
+ if ((r = hashmap_replace(u->meta.manager->cgroup_bondings, b->path, l)) < 0) {
+ LIST_REMOVE(CGroupBonding, by_path, l, b);
+ return r;
+ }
}
LIST_PREPEND(CGroupBonding, by_unit, u->meta.cgroup_bondings, b);
b->controller = controller;
b->path = path;
- b->only_us = false;
- b->clean_up = false;
+ b->ours = false;
if ((r = unit_add_cgroup(u, b)) < 0)
goto fail;
return r;
}
-int unit_add_default_cgroup(Unit *u) {
- CGroupBonding *b;
+static int unit_add_one_default_cgroup(Unit *u, const char *controller) {
+ CGroupBonding *b = NULL;
int r = -ENOMEM;
assert(u);
- /* Adds in the default cgroup data, if it wasn't specified yet */
+ if (!controller)
+ controller = SYSTEMD_CGROUP_CONTROLLER;
- if (unit_get_default_cgroup(u))
+ if (cgroup_bonding_find_list(u->meta.cgroup_bondings, controller))
return 0;
if (!(b = new0(CGroupBonding, 1)))
return -ENOMEM;
+ if (!(b->controller = strdup(controller)))
+ goto fail;
+
if (!(b->path = default_cgroup_path(u)))
goto fail;
- b->clean_up = true;
- b->only_us = true;
+ b->ours = true;
+ b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER);
if ((r = unit_add_cgroup(u, b)) < 0)
goto fail;
return r;
}
+int unit_add_default_cgroups(Unit *u) {
+ char **c;
+ int r;
+ assert(u);
+
+ /* Adds in the default cgroups, if they weren't specified
+ * otherwise. */
+
+ if ((r = unit_add_one_default_cgroup(u, NULL)) < 0)
+ return r;
+
+ STRV_FOREACH(c, u->meta.manager->default_controllers)
+ if ((r = unit_add_one_default_cgroup(u, *c)) < 0)
+ return r;
+
+ return 0;
+}
+
CGroupBonding* unit_get_default_cgroup(Unit *u) {
assert(u);