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

Commit 72ffff70 authored by bowgotsai's avatar bowgotsai
Browse files

fs_mgr: removing the dependency of requiring /vbmeta in fstab for AVB

Remove polling_vbmeta_blk_device() as it tries to get /vbmeta entry
from fstab. Also move the polling of a partition inside read_from_partition()
in fs_mgr_avb_ops.cpp as it's where the reads happen.

Bug: 31264231
Test: Device can boot with AVB

Change-Id: Id717e160b085eca42eb9bc5eb2fa7e658bea3ad6
parent 183ca56c
Loading
Loading
Loading
Loading
+2 −23
Original line number Original line Diff line number Diff line
@@ -215,8 +215,8 @@ static bool load_vbmeta_prop(androidboot_vbmeta *vbmeta_prop)


    // Reads digest.
    // Reads digest.
    if (digest.size() != expected_digest_size) {
    if (digest.size() != expected_digest_size) {
        LERROR << "Unexpected digest size: " << digest.size() << " (expected: "
        LERROR << "Unexpected digest size: " << digest.size()
               << expected_digest_size << ")";
               << " (expected: " << expected_digest_size << ")";
        return false;
        return false;
    }
    }


@@ -482,22 +482,6 @@ static bool get_hashtree_descriptor(const std::string &partition_name,
    return true;
    return true;
}
}


static inline bool polling_vbmeta_blk_device(struct fstab *fstab)
{
    // It needs the block device symlink: fstab_rec->blk_device to read
    // /vbmeta partition. However, the symlink created by ueventd might
    // not be ready at this point. Use test_access() to poll it before
    // trying to read the partition.
    struct fstab_rec *fstab_entry =
        fs_mgr_get_entry_for_mount_point(fstab, "/vbmeta");

    // Makes sure /vbmeta block device is ready to access.
    if (fs_mgr_test_access(fstab_entry->blk_device) < 0) {
        return false;
    }
    return true;
}

static bool init_is_avb_used()
static bool init_is_avb_used()
{
{
    // When AVB is used, boot loader should set androidboot.vbmeta.{hash_alg,
    // When AVB is used, boot loader should set androidboot.vbmeta.{hash_alg,
@@ -529,11 +513,6 @@ int fs_mgr_load_vbmeta_images(struct fstab *fstab)
{
{
    FS_MGR_CHECK(fstab != nullptr);
    FS_MGR_CHECK(fstab != nullptr);


    if (!polling_vbmeta_blk_device(fstab)) {
        LERROR << "Failed to find block device of /vbmeta";
        return FS_MGR_SETUP_AVB_FAIL;
    }

    // Gets the expected hash value of vbmeta images from
    // Gets the expected hash value of vbmeta images from
    // kernel cmdline.
    // kernel cmdline.
    if (!load_vbmeta_prop(&fs_mgr_vbmeta_prop)) {
    if (!load_vbmeta_prop(&fs_mgr_vbmeta_prop)) {
+8 −1
Original line number Original line Diff line number Diff line
@@ -66,7 +66,7 @@ static AvbIOResult read_from_partition(AvbOps *ops ATTRIBUTE_UNUSED,
        fs_mgr_get_entry_for_mount_point(fs_mgr_fstab, "/misc");
        fs_mgr_get_entry_for_mount_point(fs_mgr_fstab, "/misc");


    if (fstab_entry == nullptr) {
    if (fstab_entry == nullptr) {
        LERROR << "Partition (" << partition << ") not found in fstab";
        LERROR << "/misc mount point not found in fstab";
        return AVB_IO_RESULT_ERROR_IO;
        return AVB_IO_RESULT_ERROR_IO;
    }
    }


@@ -79,6 +79,13 @@ static AvbIOResult read_from_partition(AvbOps *ops ATTRIBUTE_UNUSED,
        path = by_name_prefix + partition_name;
        path = by_name_prefix + partition_name;
    }
    }


    // Ensures the device path (a symlink created by init) is ready to
    // access. fs_mgr_test_access() will test a few iterations if the
    // path doesn't exist yet.
    if (fs_mgr_test_access(path.c_str()) < 0) {
        return AVB_IO_RESULT_ERROR_IO;
    }

    android::base::unique_fd fd(
    android::base::unique_fd fd(
        TEMP_FAILURE_RETRY(open(path.c_str(), O_RDONLY | O_CLOEXEC)));
        TEMP_FAILURE_RETRY(open(path.c_str(), O_RDONLY | O_CLOEXEC)));