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

Commit 900c6010 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Detect the absence of the default fstab" am: d9b7c9b4

Original change: https://android-review.googlesource.com/c/platform/system/core/+/1607906

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I1f5b467eab74cc86c525a09210811e51459dab97
parents 7a2c31ef d9b7c9b4
Loading
Loading
Loading
Loading
+28 −18
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@

#include "block_dev_initializer.h"
#include "devices.h"
#include "result.h"
#include "snapuserd_transition.h"
#include "switch_root.h"
#include "uevent.h"
@@ -51,6 +52,7 @@
#include "util.h"

using android::base::ReadFileToString;
using android::base::Result;
using android::base::Split;
using android::base::StringPrintf;
using android::base::Timer;
@@ -81,7 +83,7 @@ class FirstStageMount {

    // The factory method to create either FirstStageMountVBootV1 or FirstStageMountVBootV2
    // based on device tree configurations.
    static std::unique_ptr<FirstStageMount> Create();
    static Result<std::unique_ptr<FirstStageMount>> Create();
    bool DoCreateDevices();    // Creates devices and logical partitions from storage devices
    bool DoFirstStageMount();  // Mounts fstab entries read from device tree.
    bool InitDevices();
@@ -160,7 +162,7 @@ static inline bool IsDtVbmetaCompatible(const Fstab& fstab) {
    return is_android_dt_value_expected("vbmeta/compatible", "android,vbmeta");
}

static Fstab ReadFirstStageFstab() {
static Result<Fstab> ReadFirstStageFstab() {
    Fstab fstab;
    if (!ReadFstabFromDt(&fstab)) {
        if (ReadDefaultFstab(&fstab)) {
@@ -170,7 +172,7 @@ static Fstab ReadFirstStageFstab() {
                                       }),
                        fstab.end());
        } else {
            LOG(INFO) << "Failed to fstab for first stage mount";
            return Error() << "failed to read default fstab for first stage mount";
        }
    }
    return fstab;
@@ -236,12 +238,16 @@ FirstStageMount::FirstStageMount(Fstab fstab) : need_dm_verity_(false), fstab_(s
    super_partition_name_ = fs_mgr_get_super_partition_name();
}

std::unique_ptr<FirstStageMount> FirstStageMount::Create() {
Result<std::unique_ptr<FirstStageMount>> FirstStageMount::Create() {
    auto fstab = ReadFirstStageFstab();
    if (IsDtVbmetaCompatible(fstab)) {
        return std::make_unique<FirstStageMountVBootV2>(std::move(fstab));
    if (!fstab.ok()) {
        return fstab.error();
    }

    if (IsDtVbmetaCompatible(*fstab)) {
        return std::make_unique<FirstStageMountVBootV2>(std::move(*fstab));
    } else {
        return std::make_unique<FirstStageMountVBootV1>(std::move(fstab));
        return std::make_unique<FirstStageMountVBootV1>(std::move(*fstab));
    }
}

@@ -836,12 +842,12 @@ bool FirstStageMountVBootV2::InitAvbHandle() {
// ----------------
// Creates devices and logical partitions from storage devices
bool DoCreateDevices() {
    std::unique_ptr<FirstStageMount> handle = FirstStageMount::Create();
    if (!handle) {
        LOG(ERROR) << "Failed to create FirstStageMount";
    auto fsm = FirstStageMount::Create();
    if (!fsm.ok()) {
        LOG(ERROR) << "Failed to create FirstStageMount: " << fsm.error();
        return false;
    }
    return handle->DoCreateDevices();
    return (*fsm)->DoCreateDevices();
}

// Mounts partitions specified by fstab in device tree.
@@ -852,17 +858,17 @@ bool DoFirstStageMount(bool create_devices) {
        return true;
    }

    std::unique_ptr<FirstStageMount> handle = FirstStageMount::Create();
    if (!handle) {
        LOG(ERROR) << "Failed to create FirstStageMount";
    auto fsm = FirstStageMount::Create();
    if (!fsm.ok()) {
        LOG(ERROR) << "Failed to create FirstStageMount " << fsm.error();
        return false;
    }

    if (create_devices) {
        if (!handle->DoCreateDevices()) return false;
        if (!(*fsm)->DoCreateDevices()) return false;
    }

    return handle->DoFirstStageMount();
    return (*fsm)->DoFirstStageMount();
}

void SetInitAvbVersionInRecovery() {
@@ -872,8 +878,12 @@ void SetInitAvbVersionInRecovery() {
    }

    auto fstab = ReadFirstStageFstab();
    if (!fstab.ok()) {
        LOG(ERROR) << fstab.error();
        return;
    }

    if (!IsDtVbmetaCompatible(fstab)) {
    if (!IsDtVbmetaCompatible(*fstab)) {
        LOG(INFO) << "Skipped setting INIT_AVB_VERSION (not vbmeta compatible)";
        return;
    }
@@ -883,7 +893,7 @@ void SetInitAvbVersionInRecovery() {
    // We only set INIT_AVB_VERSION when the AVB verification succeeds, i.e., the
    // Open() function returns a valid handle.
    // We don't need to mount partitions here in recovery mode.
    FirstStageMountVBootV2 avb_first_mount(std::move(fstab));
    FirstStageMountVBootV2 avb_first_mount(std::move(*fstab));
    if (!avb_first_mount.InitDevices()) {
        LOG(ERROR) << "Failed to init devices for INIT_AVB_VERSION";
        return;