From 8742fc797d827ff92831af7d8af353e6bb073ddc Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 5 Nov 2013 22:17:03 +0100 Subject: [PATCH] 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 --- src/core/shutdown.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/core/shutdown.c b/src/core/shutdown.c index 4709746..ea02b60 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);