From ad575e04a1d89f5a2a4e3006a58e801cad9c9805 Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Tue, 5 Apr 2016 08:10:25 -0700 Subject: [PATCH] init: watchdog restarted during shutdown fsck Bug: 27506425 Change-Id: I40967068d18ce1a8cbaf0b750e7a7af6eab3e4e8 --- init/builtins.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/init/builtins.cpp b/init/builtins.cpp index 6469ec488..b3bd41801 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -129,6 +130,16 @@ static void unmount_and_fsck(const struct mntent *entry) { ServiceManager::GetInstance().ForEachService([] (Service* s) { s->Stop(); }); TEMP_FAILURE_RETRY(kill(-1, SIGKILL)); + // Restart Watchdogd to allow us to complete umounting and fsck + Service *svc = ServiceManager::GetInstance().FindServiceByName("watchdogd"); + if (svc) { + do { + sched_yield(); // do not be so eager, let cleanup have priority + ServiceManager::GetInstance().ReapAnyOutstandingChildren(); + } while (svc->flags() & SVC_RUNNING); // Paranoid Cargo + svc->Start(); + } + int count = 0; while (count++ < UNMOUNT_CHECK_TIMES) { int fd = TEMP_FAILURE_RETRY(open(entry->mnt_fsname, O_RDONLY | O_EXCL)); @@ -149,6 +160,11 @@ static void unmount_and_fsck(const struct mntent *entry) { } } + // NB: With watchdog still running, there is no cap on the time it takes + // to complete the fsck, from the users perspective the device graphics + // and responses are locked-up and they may choose to hold the power + // button in frustration if it drags out. + int st; if (!strcmp(entry->mnt_type, "f2fs")) { const char *f2fs_argv[] = {