diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-11-05 22:17:03 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-11-06 02:31:22 +0100 |
commit | 41f85451d36f14bfc2f78e687167eba9a2d4d67c (patch) | |
tree | 55bb6d4fc97663fe2b27af5e34dfcbbad26e8983 /src | |
parent | 15c60e99a974782351ca8a5ed438dc3729eb5fe7 (diff) |
shutdown: trim the cgroup tree on loop iteration
This way we leave the cgroup empty before exiting in a container which
makes sure the container manager will get cgroup notification event
https://bugs.freedesktop.org/show_bug.cgi?id=68370
https://bugzilla.redhat.com/show_bug.cgi?id=988883
Diffstat (limited to 'src')
-rw-r--r-- | src/core/shutdown.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/core/shutdown.c b/src/core/shutdown.c index 4709746de4..ea02b60456 100644 --- a/src/core/shutdown.c +++ b/src/core/shutdown.c @@ -46,6 +46,7 @@ #include "virt.h" #include "watchdog.h" #include "killall.h" +#include "cgroup-util.h" #define FINALIZE_ATTEMPTS 50 @@ -131,12 +132,12 @@ static int pivot_to_new_root(void) { } int main(int argc, char *argv[]) { - _cleanup_free_ char *line = NULL; - int cmd, r; - unsigned retries; bool need_umount = true, need_swapoff = true, need_loop_detach = true, need_dm_detach = true; bool in_container, use_watchdog = false; + _cleanup_free_ char *line = NULL, *cgroup = NULL; char *arguments[3]; + unsigned retries; + int cmd, r; /* suppress shutdown status output if 'quiet' is used */ r = read_one_line_file("/proc/cmdline", &line); @@ -186,6 +187,8 @@ int main(int argc, char *argv[]) { goto error; } + cg_get_root_path(&cgroup); + use_watchdog = !!getenv("WATCHDOG_USEC"); /* lock us into memory */ @@ -210,6 +213,13 @@ int main(int argc, char *argv[]) { if (use_watchdog) watchdog_ping(); + /* Let's trim the cgroup tree on each iteration so + that we leave an empty cgroup tree around, so that + container managers get a nice notify event when we + are down */ + if (cgroup) + cg_trim(SYSTEMD_CGROUP_CONTROLLER, cgroup, false); + if (need_umount) { log_info("Unmounting file systems."); r = umount_all(&changed); |