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

Commit ad7d1d13 authored by David Anderson's avatar David Anderson Committed by Gerrit Code Review
Browse files

Merge changes I82b7d77b,I6b77690c

* changes:
  first_stage_mount: Create snapshot devices before launching first_stage_console
  first_stage_mount: Move CreateLogicalPartitions to DoFirstStageMount
parents 291a5058 9583e922
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -286,7 +286,11 @@ int FirstStageMain(int argc, char** argv) {
        }
    }


    if (want_console == FirstStageConsoleParam::CONSOLE_ON_FAILURE) {
        if (!DoCreateDevices()) {
            LOG(ERROR) << "Failed to create device nodes early";
        }
        StartConsole(cmdline);
    }

@@ -327,7 +331,7 @@ int FirstStageMain(int argc, char** argv) {
        }
    }

    if (!DoFirstStageMount()) {
    if (!DoFirstStageMount(want_console != FirstStageConsoleParam::CONSOLE_ON_FAILURE)) {
        LOG(FATAL) << "Failed to mount required partitions early ...";
    }

+39 −19
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ class FirstStageMount {
    // The factory method to create either FirstStageMountVBootV1 or FirstStageMountVBootV2
    // based on device tree configurations.
    static 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();

@@ -244,6 +245,28 @@ std::unique_ptr<FirstStageMount> FirstStageMount::Create() {
    }
}

bool FirstStageMount::DoCreateDevices() {
    if (!InitDevices()) return false;

    // Mount /metadata before creating logical partitions, since we need to
    // know whether a snapshot merge is in progress.
    auto metadata_partition = std::find_if(fstab_.begin(), fstab_.end(), [](const auto& entry) {
        return entry.mount_point == "/metadata";
    });
    if (metadata_partition != fstab_.end()) {
        if (MountPartition(metadata_partition, true /* erase_same_mounts */)) {
            // Copies DSU AVB keys from the ramdisk to /metadata.
            // Must be done before the following TrySwitchSystemAsRoot().
            // Otherwise, ramdisk will be inaccessible after switching root.
            CopyDsuAvbKeys();
        }
    }

    if (!CreateLogicalPartitions()) return false;

    return true;
}

bool FirstStageMount::DoFirstStageMount() {
    if (!IsDmLinearEnabled() && fstab_.empty()) {
        // Nothing to mount.
@@ -251,8 +274,6 @@ bool FirstStageMount::DoFirstStageMount() {
        return true;
    }

    if (!InitDevices()) return false;

    if (!MountPartitions()) return false;

    return true;
@@ -505,22 +526,6 @@ bool FirstStageMount::TrySwitchSystemAsRoot() {
}

bool FirstStageMount::MountPartitions() {
    // Mount /metadata before creating logical partitions, since we need to
    // know whether a snapshot merge is in progress.
    auto metadata_partition = std::find_if(fstab_.begin(), fstab_.end(), [](const auto& entry) {
        return entry.mount_point == "/metadata";
    });
    if (metadata_partition != fstab_.end()) {
        if (MountPartition(metadata_partition, true /* erase_same_mounts */)) {
            // Copies DSU AVB keys from the ramdisk to /metadata.
            // Must be done before the following TrySwitchSystemAsRoot().
            // Otherwise, ramdisk will be inaccessible after switching root.
            CopyDsuAvbKeys();
        }
    }

    if (!CreateLogicalPartitions()) return false;

    if (!TrySwitchSystemAsRoot()) return false;

    if (!SkipMountingPartitions(&fstab_)) return false;
@@ -829,8 +834,18 @@ bool FirstStageMountVBootV2::InitAvbHandle() {

// Public functions
// ----------------
// 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";
        return false;
    }
    return handle->DoCreateDevices();
}

// Mounts partitions specified by fstab in device tree.
bool DoFirstStageMount() {
bool DoFirstStageMount(bool create_devices) {
    // Skips first stage mount if we're in recovery mode.
    if (IsRecoveryMode()) {
        LOG(INFO) << "First stage mount skipped (recovery mode)";
@@ -842,6 +857,11 @@ bool DoFirstStageMount() {
        LOG(ERROR) << "Failed to create FirstStageMount";
        return false;
    }

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

    return handle->DoFirstStageMount();
}

+2 −1
Original line number Diff line number Diff line
@@ -19,7 +19,8 @@
namespace android {
namespace init {

bool DoFirstStageMount();
bool DoCreateDevices();
bool DoFirstStageMount(bool create_devices);
void SetInitAvbVersionInRecovery();

}  // namespace init