Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a20e8a1 authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge "If userspace reboot watchdog triggers, don't store reason in persistent...

Merge "If userspace reboot watchdog triggers, don't store reason in persistent property" am: 18a65319

Change-Id: I749cfd4707022a5573e61281dd40edf95755892b
parents 6796954b 18a65319
Loading
Loading
Loading
Loading
+15 −12
Original line number Diff line number Diff line
@@ -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);
}

@@ -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;
@@ -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;
@@ -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";