X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcgroup.c;h=4bbb54fd7e41a17f96ea8f3b651cc43aa8e5f089;hp=0c6f20d4b75311bfa2b8b6e5944c26cb534db8b1;hb=bf96736674b8d898e2262a9f429e93b3bb153fa2;hpb=38c52d4606c77ff2b2b60a08f663a1983d8254b0 diff --git a/src/cgroup.c b/src/cgroup.c index 0c6f20d4b..4bbb54fd7 100644 --- a/src/cgroup.c +++ b/src/cgroup.c @@ -38,17 +38,14 @@ int cgroup_bonding_realize(CGroupBonding *b) { assert(b->path); assert(b->controller); - if (b->realized) - return 0; - - if ((r = cg_create(b->controller, b->path)) < 0) + r = cg_create(b->controller, b->path); + if (r < 0) { + log_warning("Failed to create cgroup %s:%s: %s", b->controller, b->path, strerror(-r)); return r; + } b->realized = true; - if (b->ours) - cg_trim(b->controller, b->path, false); - return 0; } @@ -140,12 +137,56 @@ int cgroup_bonding_install_list(CGroupBonding *first, pid_t pid) { return 0; } +int cgroup_bonding_set_group_access(CGroupBonding *b, mode_t mode, uid_t uid, gid_t gid) { + assert(b); + + if (!b->realized) + return -EINVAL; + + return cg_set_group_access(b->controller, b->path, mode, uid, gid); +} + +int cgroup_bonding_set_group_access_list(CGroupBonding *first, mode_t mode, uid_t uid, gid_t gid) { + CGroupBonding *b; + int r; + + LIST_FOREACH(by_unit, b, first) { + r = cgroup_bonding_set_group_access(b, mode, uid, gid); + if (r < 0) + return r; + } + + return 0; +} + +int cgroup_bonding_set_task_access(CGroupBonding *b, mode_t mode, uid_t uid, gid_t gid) { + assert(b); + + if (!b->realized) + return -EINVAL; + + return cg_set_task_access(b->controller, b->path, mode, uid, gid); +} + +int cgroup_bonding_set_task_access_list(CGroupBonding *first, mode_t mode, uid_t uid, gid_t gid) { + CGroupBonding *b; + int r; + + LIST_FOREACH(by_unit, b, first) { + r = cgroup_bonding_set_task_access(b, mode, uid, gid); + if (r < 0) + return r; + } + + return 0; +} + int cgroup_bonding_kill(CGroupBonding *b, int sig, bool sigcont, Set *s) { assert(b); assert(sig >= 0); /* Don't kill cgroups that aren't ours */ - if (!b->realized || !b->ours) + if (!b->ours) return 0; return cg_kill_recursive(b->controller, b->path, sig, sigcont, true, false, s); @@ -226,7 +267,7 @@ int manager_setup_cgroup(Manager *m) { assert(m); /* 0. Be nice to Ingo Molnar #628004 */ - if (path_is_mount_point("/sys/fs/cgroup/systemd") <= 0) { + if (path_is_mount_point("/sys/fs/cgroup/systemd", false) <= 0) { log_warning("No control group support available, not creating root group."); return 0; } @@ -322,7 +363,8 @@ int cgroup_notify_empty(Manager *m, const char *group) { assert(m); assert(group); - if (!(l = hashmap_get(m->cgroup_bondings, group))) + l = hashmap_get(m->cgroup_bondings, group); + if (!l) return 0; LIST_FOREACH(by_path, b, l) { @@ -331,7 +373,8 @@ int cgroup_notify_empty(Manager *m, const char *group) { if (!b->unit) continue; - if ((t = cgroup_bonding_is_empty_list(b)) < 0) { + t = cgroup_bonding_is_empty_list(b); + if (t < 0) { /* If we don't know, we don't know */ if (t != -EAGAIN) @@ -340,9 +383,13 @@ int cgroup_notify_empty(Manager *m, const char *group) { continue; } - if (t > 0) + if (t > 0) { + /* If it is empty, let's delete it */ + cgroup_bonding_trim_list(b->unit->meta.cgroup_bondings, true); + if (UNIT_VTABLE(b->unit)->cgroup_notify_empty) UNIT_VTABLE(b->unit)->cgroup_notify_empty(b->unit); + } } return 0;