diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-07-10 17:34:42 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-07-10 17:34:42 +0200 |
commit | fb385181517aa97fc5b379380cde0c2567f5f444 (patch) | |
tree | 91c7ee6fd3313830806c987f0d89fa383717e3aa /src | |
parent | 582a507f1abdca75abe34945b4bbd5e97e9b45a8 (diff) |
unit: trim cgroups when going down
Diffstat (limited to 'src')
-rw-r--r-- | src/cgroup.c | 14 | ||||
-rw-r--r-- | src/cgroup.h | 3 | ||||
-rw-r--r-- | src/unit.c | 3 |
3 files changed, 20 insertions, 0 deletions
diff --git a/src/cgroup.c b/src/cgroup.c index 27130a9c39..244a602024 100644 --- a/src/cgroup.c +++ b/src/cgroup.c @@ -101,6 +101,20 @@ void cgroup_bonding_free_list(CGroupBonding *first) { cgroup_bonding_free(b); } +void cgroup_bonding_trim(CGroupBonding *b, bool delete_root) { + assert(b); + + if (b->realized && b->only_us && b->clean_up) + cg_trim(b->controller, b->path, delete_root); +} + +void cgroup_bonding_trim_list(CGroupBonding *first, bool delete_root) { + CGroupBonding *b; + + LIST_FOREACH(by_unit, b, first) + cgroup_bonding_trim(b, delete_root); +} + int cgroup_bonding_install(CGroupBonding *b, pid_t pid) { int r; diff --git a/src/cgroup.h b/src/cgroup.h index 11d2aba8cf..05c858c425 100644 --- a/src/cgroup.h +++ b/src/cgroup.h @@ -61,6 +61,9 @@ int cgroup_bonding_install_list(CGroupBonding *first, pid_t pid); int cgroup_bonding_kill(CGroupBonding *b, int sig); int cgroup_bonding_kill_list(CGroupBonding *first, int sig); +void cgroup_bonding_trim(CGroupBonding *first, bool delete_root); +void cgroup_bonding_trim_list(CGroupBonding *first, bool delete_root); + int cgroup_bonding_is_empty(CGroupBonding *b); int cgroup_bonding_is_empty_list(CGroupBonding *first); diff --git a/src/unit.c b/src/unit.c index c287310a48..18faae22e4 100644 --- a/src/unit.c +++ b/src/unit.c @@ -973,6 +973,9 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { if (ns != os && ns == UNIT_MAINTENANCE) log_notice("Unit %s entered maintenance state.", u->meta.id); + if (UNIT_IS_INACTIVE_OR_MAINTENANCE(ns)) + cgroup_bonding_trim_list(u->meta.cgroup_bondings, true); + timer_unit_notify(u, ns); path_unit_notify(u, ns); |