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

Commit 8696a5d1 authored by David Anderson's avatar David Anderson
Browse files

remount: Do not allow remounting during checkpoints.

Bug: 157540389
Test: manual test
Change-Id: I5931a583e48ddac05f319629ae2f7f5f0f6cf032
parent 1e03ef5a
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -162,10 +162,13 @@ cc_binary {
    defaults: ["fs_mgr_defaults"],
    static_libs: [
        "libavb_user",
        "libutils",
        "libvold_binder",
    ],
    shared_libs: [
        "libbootloader_message",
        "libbase",
        "libbinder",
        "libcutils",
        "libcrypto",
        "libext4_utils",
+37 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include <unistd.h>

#include <string>
#include <thread>
#include <utility>
#include <vector>

@@ -31,6 +32,8 @@
#include <android-base/logging.h>
#include <android-base/properties.h>
#include <android-base/strings.h>
#include <android/os/IVold.h>
#include <binder/IServiceManager.h>
#include <bootloader_message/bootloader_message.h>
#include <cutils/android_reboot.h>
#include <fec/io.h>
@@ -103,8 +106,23 @@ void MyLogger(android::base::LogId id, android::base::LogSeverity severity, cons
    ::exit(0);  // SUCCESS
}

static android::sp<android::os::IVold> GetVold() {
    while (true) {
        if (auto sm = android::defaultServiceManager()) {
            if (auto binder = sm->getService(android::String16("vold"))) {
                if (auto vold = android::interface_cast<android::os::IVold>(binder)) {
                    return vold;
                }
            }
        }
        std::this_thread::sleep_for(2s);
    }
}

}  // namespace

using namespace std::chrono_literals;

enum RemountStatus {
    REMOUNT_SUCCESS = 0,
    NOT_USERDEBUG,
@@ -117,7 +135,9 @@ enum RemountStatus {
    BAD_OVERLAY,
    NO_MOUNTS,
    REMOUNT_FAILED,
    MUST_REBOOT
    MUST_REBOOT,
    BINDER_ERROR,
    CHECKPOINTING
};

static int do_remount(int argc, char* argv[]) {
@@ -194,6 +214,22 @@ static int do_remount(int argc, char* argv[]) {
        return NO_FSTAB;
    }

    if (android::base::GetBoolProperty("ro.virtual_ab.enabled", false) &&
        !android::base::GetBoolProperty("ro.virtual_ab.retrofit", false)) {
        // Virtual A/B devices can use /data as backing storage; make sure we're
        // not checkpointing.
        auto vold = GetVold();
        bool checkpointing = false;
        if (!vold->isCheckpointing(&checkpointing).isOk()) {
            LOG(ERROR) << "Could not determine checkpointing status.";
            return BINDER_ERROR;
        }
        if (checkpointing) {
            LOG(ERROR) << "Cannot use remount when a checkpoint is in progress.";
            return CHECKPOINTING;
        }
    }

    // Generate the list of supported overlayfs mount points.
    auto overlayfs_candidates = fs_mgr_overlayfs_candidate_list(fstab);