Merge "init: watchdog restarted during shutdown fsck" am: 3443caa
am: 34dcdd8
* commit '34dcdd8075a0c12de552219d4f326bccd1c8fe62':
init: watchdog restarted during shutdown fsck
Change-Id: I28e3a730f2d854c51f1d760a5400faecd3f1fafc
diff --git a/init/builtins.cpp b/init/builtins.cpp
index 3272a0c..43fff6d 100644
--- a/init/builtins.cpp
+++ b/init/builtins.cpp
@@ -21,6 +21,7 @@
#include <mntent.h>
#include <net/if.h>
#include <signal.h>
+#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -129,6 +130,16 @@
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 @@
}
}
+ // 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[] = {