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

Commit 15f22bdd authored by Daniel Rosenberg's avatar Daniel Rosenberg
Browse files

Defer marking boot successful when checkpointing

This moves actually marking the slot as successful to a later point
so that on devices with checkpointing enabled we can still roll back to
the previous version if we fail to boot to the point that the checkpoint
is marked as successful.

Test: When taking an update on a checkpoint enabled device, it
      defers marking the slot as successful instead of directly
      marking it. Visible in logs.
Bug: 123260515

Change-Id: I7ed3595c1b0904ddbfe20d1cad4f69ecbf1ea351
parent 990807a9
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -42,12 +42,15 @@ cc_library_static {

    static_libs: [
        "libotautil",
        "libvold_binder",
    ],

    shared_libs: [
        "android.hardware.boot@1.0",
        "libbase",
        "libcutils",
        "libbinder",
        "libutils",
    ],

    proto: {
@@ -70,6 +73,7 @@ cc_binary {
    static_libs: [
        "libupdate_verifier",
        "libotautil",
        "libvold_binder",
    ],

    shared_libs: [
@@ -80,6 +84,7 @@ cc_binary {
        "libhidlbase",
        "liblog",
        "libprotobuf-cpp-lite",
        "libbinder",
        "libutils",
    ],

+26 −6
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@
 */

#include "update_verifier/update_verifier.h"
#include <android/os/IVold.h>

#include <dirent.h>
#include <errno.h>
@@ -56,6 +57,8 @@
#include <android-base/strings.h>
#include <android-base/unique_fd.h>
#include <android/hardware/boot/1.0/IBootControl.h>
#include <binder/BinderService.h>
#include <binder/Status.h>
#include <cutils/android_reboot.h>

#include "care_map.pb.h"
@@ -376,6 +379,20 @@ int update_verifier(int argc, char** argv) {
      }
    }

    bool supports_checkpoint = false;
    auto sm = android::defaultServiceManager();
    android::sp<android::IBinder> binder = sm->getService(android::String16("vold"));
    if (binder) {
      auto vold = android::interface_cast<android::os::IVold>(binder);
      android::binder::Status status = vold->supportsCheckpoint(&supports_checkpoint);
      if (!status.isOk()) {
        LOG(ERROR) << "Failed to check if checkpoints supported. Continuing";
      }
    } else {
      LOG(ERROR) << "Failed to obtain vold Binder. Continuing";
    }

    if (!supports_checkpoint) {
      CommandResult cr;
      module->markBootSuccessful([&cr](CommandResult result) { cr = result; });
      if (!cr.success) {
@@ -383,6 +400,9 @@ int update_verifier(int argc, char** argv) {
        return reboot_device();
      }
      LOG(INFO) << "Marked slot " << current_slot << " as booted successfully.";
    } else {
      LOG(INFO) << "Deferred marking slot " << current_slot << " as booted successfully.";
    }
  }

  LOG(INFO) << "Leaving update_verifier.";