summaryrefslogtreecommitdiff
path: root/init/builtins.cpp
diff options
context:
space:
mode:
authorMark Salyzyn <salyzyn@google.com>2016-04-05 18:44:59 +0000
committerandroid-build-merger <android-build-merger@google.com>2016-04-05 18:44:59 +0000
commite4c8b31fed15d1e246450d6e7821ca07915b888c (patch)
tree0fbbcd8c45c1b3965e03e7cfaa3d240cc8c2d746 /init/builtins.cpp
parent8ea300663ef336811d92885e690e302caec498c8 (diff)
parent34dcdd8075a0c12de552219d4f326bccd1c8fe62 (diff)
Merge "init: watchdog restarted during shutdown fsck" am: 3443caa
am: 34dcdd8 * commit '34dcdd8075a0c12de552219d4f326bccd1c8fe62': init: watchdog restarted during shutdown fsck Change-Id: I28e3a730f2d854c51f1d760a5400faecd3f1fafc
Diffstat (limited to 'init/builtins.cpp')
-rw-r--r--init/builtins.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/init/builtins.cpp b/init/builtins.cpp
index 3272a0c8a..43fff6d65 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 @@ 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[] = {