Loading init/reboot.cpp +15 −12 Original line number Diff line number Diff line Loading @@ -96,8 +96,10 @@ static std::vector<Service*> GetDebuggingServices(bool only_post_data) REQUIRES( return ret; } static void PersistRebootReason(const char* reason) { static void PersistRebootReason(const char* reason, bool write_to_property) { if (write_to_property) { SetProperty(LAST_REBOOT_REASON_PROPERTY, reason); } WriteStringToFile(reason, LAST_REBOOT_REASON_FILE); } Loading Loading @@ -535,14 +537,6 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str Timer t; LOG(INFO) << "Reboot start, reason: " << reason << ", reboot_target: " << reboot_target; // If /data isn't mounted then we can skip the extra reboot steps below, since we don't need to // worry about unmounting it. if (!IsDataMounted()) { sync(); RebootSystem(cmd, reboot_target); abort(); } // Ensure last reboot reason is reduced to canonical // alias reported in bootloader or system boot reason. size_t skip = 0; Loading @@ -552,9 +546,17 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str reasons[1] == "hard" || reasons[1] == "warm")) { skip = strlen("reboot,"); } PersistRebootReason(reason.c_str() + skip); PersistRebootReason(reason.c_str() + skip, true); sync(); // If /data isn't mounted then we can skip the extra reboot steps below, since we don't need to // worry about unmounting it. if (!IsDataMounted()) { sync(); RebootSystem(cmd, reboot_target); abort(); } bool is_thermal_shutdown = cmd == ANDROID_RB_THERMOFF; auto shutdown_timeout = 0ms; Loading Loading @@ -836,7 +838,8 @@ static void UserspaceRebootWatchdogThread() { if (!WaitForProperty("sys.boot_completed", "1", timeout)) { LOG(ERROR) << "Failed to boot in " << timeout.count() << "ms. Switching to full reboot"; // In this case device is in a boot loop. Only way to recover is to do dirty reboot. PersistRebootReason("userspace_failed,watchdog_triggered"); // Since init might be wedged, don't try to write reboot reason into a persistent property. PersistRebootReason("userspace_failed,watchdog_triggered", false); RebootSystem(ANDROID_RB_RESTART2, "userspace_failed,watchdog_triggered"); } LOG(INFO) << "Device booted, stopping userspace reboot watchdog"; Loading Loading
init/reboot.cpp +15 −12 Original line number Diff line number Diff line Loading @@ -96,8 +96,10 @@ static std::vector<Service*> GetDebuggingServices(bool only_post_data) REQUIRES( return ret; } static void PersistRebootReason(const char* reason) { static void PersistRebootReason(const char* reason, bool write_to_property) { if (write_to_property) { SetProperty(LAST_REBOOT_REASON_PROPERTY, reason); } WriteStringToFile(reason, LAST_REBOOT_REASON_FILE); } Loading Loading @@ -535,14 +537,6 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str Timer t; LOG(INFO) << "Reboot start, reason: " << reason << ", reboot_target: " << reboot_target; // If /data isn't mounted then we can skip the extra reboot steps below, since we don't need to // worry about unmounting it. if (!IsDataMounted()) { sync(); RebootSystem(cmd, reboot_target); abort(); } // Ensure last reboot reason is reduced to canonical // alias reported in bootloader or system boot reason. size_t skip = 0; Loading @@ -552,9 +546,17 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str reasons[1] == "hard" || reasons[1] == "warm")) { skip = strlen("reboot,"); } PersistRebootReason(reason.c_str() + skip); PersistRebootReason(reason.c_str() + skip, true); sync(); // If /data isn't mounted then we can skip the extra reboot steps below, since we don't need to // worry about unmounting it. if (!IsDataMounted()) { sync(); RebootSystem(cmd, reboot_target); abort(); } bool is_thermal_shutdown = cmd == ANDROID_RB_THERMOFF; auto shutdown_timeout = 0ms; Loading Loading @@ -836,7 +838,8 @@ static void UserspaceRebootWatchdogThread() { if (!WaitForProperty("sys.boot_completed", "1", timeout)) { LOG(ERROR) << "Failed to boot in " << timeout.count() << "ms. Switching to full reboot"; // In this case device is in a boot loop. Only way to recover is to do dirty reboot. PersistRebootReason("userspace_failed,watchdog_triggered"); // Since init might be wedged, don't try to write reboot reason into a persistent property. PersistRebootReason("userspace_failed,watchdog_triggered", false); RebootSystem(ANDROID_RB_RESTART2, "userspace_failed,watchdog_triggered"); } LOG(INFO) << "Device booted, stopping userspace reboot watchdog"; Loading