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

Commit ece1e52a authored by David Anderson's avatar David Anderson Committed by android-build-merger
Browse files

Merge "init: Add support for GSI installations in first-stage mount."

am: b43440ba

Change-Id: Ia7645c06af6f04da3c357fd5562cc6925d56da1b
parents 788fbbb8 b43440ba
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ cc_library {
        "libfs_avb",
        "libfstab",
        "libdm",
        "libgsi",
    ],
    export_static_lib_headers: [
        "libfs_avb",
@@ -105,5 +106,8 @@ cc_library_static {
        },
    },
    export_include_dirs: ["include_fstab"],
    header_libs: ["libbase_headers"],
    header_libs: [
        "libbase_headers",
        "libgsi_headers",
    ],
}
+50 −1
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@
#include <android-base/file.h>
#include <android-base/stringprintf.h>
#include <android-base/strings.h>
#include <libgsi/libgsi.h>

#include "fs_mgr_priv.h"

@@ -638,6 +639,35 @@ static std::set<std::string> extract_boot_devices(const Fstab& fstab) {
    return boot_devices;
}

static void EraseFstabEntry(Fstab* fstab, const std::string& mount_point) {
    auto iter = std::remove_if(fstab->begin(), fstab->end(),
                               [&](const auto& entry) { return entry.mount_point == mount_point; });
    fstab->erase(iter, fstab->end());
}

static void TransformFstabForGsi(Fstab* fstab) {
    EraseFstabEntry(fstab, "/system");
    EraseFstabEntry(fstab, "/data");

    fstab->emplace_back(BuildGsiSystemFstabEntry());

    constexpr uint32_t kFlags = MS_NOATIME | MS_NOSUID | MS_NODEV;

    FstabEntry userdata = {
            .blk_device = "userdata_gsi",
            .mount_point = "/data",
            .fs_type = "ext4",
            .flags = kFlags,
            .reserved_size = 128 * 1024 * 1024,
    };
    userdata.fs_mgr_flags.wait = true;
    userdata.fs_mgr_flags.check = true;
    userdata.fs_mgr_flags.logical = true;
    userdata.fs_mgr_flags.quota = true;
    userdata.fs_mgr_flags.late_mount = true;
    fstab->emplace_back(userdata);
}

bool ReadFstabFromFile(const std::string& path, Fstab* fstab) {
    auto fstab_file = std::unique_ptr<FILE, decltype(&fclose)>{fopen(path.c_str(), "re"), fclose};
    if (!fstab_file) {
@@ -645,10 +675,15 @@ bool ReadFstabFromFile(const std::string& path, Fstab* fstab) {
        return false;
    }

    if (!fs_mgr_read_fstab_file(fstab_file.get(), path == "/proc/mounts", fstab)) {
    bool is_proc_mounts = path == "/proc/mounts";

    if (!fs_mgr_read_fstab_file(fstab_file.get(), is_proc_mounts, fstab)) {
        LERROR << __FUNCTION__ << "(): failed to load fstab from : '" << path << "'";
        return false;
    }
    if (!is_proc_mounts && !access(android::gsi::kGsiBootedIndicatorFile, F_OK)) {
        TransformFstabForGsi(fstab);
    }

    return true;
}
@@ -1023,3 +1058,17 @@ int fs_mgr_is_checkpoint_fs(const struct fstab_rec* fstab) {
int fs_mgr_is_checkpoint_blk(const struct fstab_rec* fstab) {
    return fstab->fs_mgr_flags & MF_CHECKPOINT_BLK;
}

FstabEntry BuildGsiSystemFstabEntry() {
    FstabEntry system = {
            .blk_device = "system_gsi",
            .mount_point = "/system",
            .fs_type = "ext4",
            .flags = MS_RDONLY,
            .fs_options = "barrier=1",
    };
    system.fs_mgr_flags.wait = true;
    system.fs_mgr_flags.logical = true;
    system.fs_mgr_flags.first_stage_mount = true;
    return system;
}
+3 −1
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@
#include <fs_mgr_overlayfs.h>
#include <fstab/fstab.h>
#include <libdm/dm.h>
#include <libgsi/libgsi.h>
#include <liblp/builder.h>
#include <liblp/liblp.h>

@@ -802,8 +803,9 @@ bool fs_mgr_overlayfs_scratch_can_be_mounted(const std::string& scratch_device)
bool fs_mgr_overlayfs_invalid() {
    if (fs_mgr_overlayfs_valid() == OverlayfsValidResult::kNotSupported) return true;

    // in recovery or fastbootd mode, not allowed!
    // in recovery, fastbootd, or gsi mode, not allowed!
    if (fs_mgr_access("/system/bin/recovery")) return true;
    if (android::gsi::IsGsiRunning()) return true;

    return false;
}
+3 −0
Original line number Diff line number Diff line
@@ -187,3 +187,6 @@ bool ReadDefaultFstab(Fstab* fstab);
FstabEntry FstabRecToFstabEntry(const fstab_rec* fstab_rec);
Fstab LegacyFstabToFstab(const struct fstab* legacy_fstab);
fstab* FstabToLegacyFstab(const Fstab& fstab);

// Helper method to build a GSI fstab entry for mounting /system.
FstabEntry BuildGsiSystemFstabEntry();
+1 −0
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ cc_defaults {
        "libext4_utils",
        "libfs_mgr",
        "libfscrypt",
        "libgsi",
        "libhidl-gen-utils",
        "libkeyutils",
        "liblog",
Loading