diff options
author | Bowgo Tsai <bowgotsai@google.com> | 2017-03-30 21:45:51 +0800 |
---|---|---|
committer | Bowgo Tsai <bowgotsai@google.com> | 2017-03-31 10:25:04 +0800 |
commit | f5bbfd64a9d9f7dce24ce1505b8bf587dd949b92 (patch) | |
tree | ee876a2e2785d1745b30d0719d804ed19a8a1f80 /fs_mgr | |
parent | 37a0b318ef2b4dcd0e7ae5b56dc028faa69859c7 (diff) | |
download | core-f5bbfd64a9d9f7dce24ce1505b8bf587dd949b92.tar.gz core-f5bbfd64a9d9f7dce24ce1505b8bf587dd949b92.tar.bz2 core-f5bbfd64a9d9f7dce24ce1505b8bf587dd949b92.zip |
fs_mgr_avb_ops: stores the by-name prefix of /misc instead of fstab struct
fs_mgr_avb_ops->read_from_partition() relies on the by-name prefix to
get the device file when reading a partition. Previously we store the
fstab struct and use fs_mgr_get_entry_for_mount_point() for every read.
It's better to do that once and store the by-name prefix for later use.
Bug: 33254008
Test: test AVB on bullhead
Change-Id: Ie999851b529f984e29ccbf39fb52a8220056fe0c
Diffstat (limited to 'fs_mgr')
-rw-r--r-- | fs_mgr/fs_mgr_avb_ops.cpp | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/fs_mgr/fs_mgr_avb_ops.cpp b/fs_mgr/fs_mgr_avb_ops.cpp index 2c14c9bdf..8e4966316 100644 --- a/fs_mgr/fs_mgr_avb_ops.cpp +++ b/fs_mgr/fs_mgr_avb_ops.cpp @@ -39,7 +39,28 @@ #include "fs_mgr_avb_ops.h" #include "fs_mgr_priv.h" -static struct fstab* fs_mgr_fstab = nullptr; +static std::string fstab_by_name_prefix; + +static std::string extract_by_name_prefix(struct fstab* fstab) { + // In AVB, we can assume that there's an entry for the /misc mount + // point in the fstab file and use that to get the device file for + // the misc partition. The device needs not to have an actual /misc + // partition. Then returns the prefix by removing the trailing "misc": + // + // - /dev/block/platform/soc.0/7824900.sdhci/by-name/misc -> + // - /dev/block/platform/soc.0/7824900.sdhci/by-name/ + + struct fstab_rec* fstab_entry = fs_mgr_get_entry_for_mount_point(fstab, "/misc"); + if (fstab_entry == nullptr) { + LERROR << "/misc mount point not found in fstab"; + return ""; + } + + std::string full_path(fstab_entry->blk_device); + size_t end_slash = full_path.find_last_of("/"); + + return full_path.substr(0, end_slash + 1); +} static AvbIOResult read_from_partition(AvbOps* ops ATTRIBUTE_UNUSED, const char* partition, int64_t offset, size_t num_bytes, void* buffer, @@ -49,30 +70,14 @@ static AvbIOResult read_from_partition(AvbOps* ops ATTRIBUTE_UNUSED, const char* // for partitions having 'slotselect' optin in fstab file, but it // won't be appended to the mount point. // - // In AVB, we can assume that there's an entry for the /misc mount - // point and use that to get the device file for the misc partition. - // From there we'll assume that a by-name scheme is used - // so we can just replace the trailing "misc" by the given - // |partition|, e.g. + // Appends |partition| to the fstab_by_name_prefix, which is obtained + // by removing the trailing "misc" from the device file of /misc mount + // point. e.g., // - // - /dev/block/platform/soc.0/7824900.sdhci/by-name/misc -> + // - /dev/block/platform/soc.0/7824900.sdhci/by-name/ -> // - /dev/block/platform/soc.0/7824900.sdhci/by-name/system_a - struct fstab_rec* fstab_entry = fs_mgr_get_entry_for_mount_point(fs_mgr_fstab, "/misc"); - - if (fstab_entry == nullptr) { - LERROR << "/misc mount point not found in fstab"; - return AVB_IO_RESULT_ERROR_IO; - } - - std::string partition_name(partition); - std::string path(fstab_entry->blk_device); - // Replaces the last field of device file if it's not misc. - if (!android::base::StartsWith(partition_name, "misc")) { - size_t end_slash = path.find_last_of("/"); - std::string by_name_prefix(path.substr(0, end_slash + 1)); - path = by_name_prefix + partition_name; - } + std::string path = fstab_by_name_prefix + partition; // Ensures the device path (a symlink created by init) is ready to // access. fs_mgr_test_access() will test a few iterations if the @@ -168,8 +173,8 @@ static AvbIOResult dummy_get_unique_guid_for_partition(AvbOps* ops ATTRIBUTE_UNU AvbOps* fs_mgr_dummy_avb_ops_new(struct fstab* fstab) { AvbOps* ops; - // Assigns the fstab to the static variable for later use. - fs_mgr_fstab = fstab; + fstab_by_name_prefix = extract_by_name_prefix(fstab); + if (fstab_by_name_prefix.empty()) return nullptr; ops = (AvbOps*)calloc(1, sizeof(AvbOps)); if (ops == nullptr) { |