From 5cbd2e43ee2a085cdb71738fcd0984278ffc9dd4 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 27 Sep 2018 10:53:04 -0700 Subject: [PATCH] Don't hardcode the super partition name. If a device has logical partitions but does not use a partition called "super", we will need this to be configurable. Note that the "slot" argument is currently unused, but will be necessary for update_engine if there are A and B super partitions. Bug: 116608795 Test: super partition works Change-Id: Ieb548a158faeb423f3561230f26d582325efbc6b --- fastboot/device/commands.cpp | 3 ++- fastboot/device/utility.cpp | 7 ++++--- fs_mgr/fs_mgr.cpp | 5 +++++ fs_mgr/include/fs_mgr.h | 6 ++++++ fs_mgr/liblp/include/liblp/metadata_format.h | 2 +- init/first_stage_mount.cpp | 9 ++++++--- 6 files changed, 24 insertions(+), 8 deletions(-) diff --git a/fastboot/device/commands.cpp b/fastboot/device/commands.cpp index b7cafac4a..d952a254e 100644 --- a/fastboot/device/commands.cpp +++ b/fastboot/device/commands.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -307,7 +308,7 @@ class PartitionBuilder { }; PartitionBuilder::PartitionBuilder(FastbootDevice* device) { - auto super_device = FindPhysicalPartition(LP_METADATA_PARTITION_NAME); + auto super_device = FindPhysicalPartition(fs_mgr_get_super_partition_name()); if (!super_device) { return; } diff --git a/fastboot/device/utility.cpp b/fastboot/device/utility.cpp index 02f6f2ca8..528abec49 100644 --- a/fastboot/device/utility.cpp +++ b/fastboot/device/utility.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -44,7 +45,7 @@ static bool OpenPhysicalPartition(const std::string& name, PartitionHandle* hand static bool OpenLogicalPartition(const std::string& name, const std::string& slot, PartitionHandle* handle) { - std::optional path = FindPhysicalPartition(LP_METADATA_PARTITION_NAME); + std::optional path = FindPhysicalPartition(fs_mgr_get_super_partition_name()); if (!path) { return false; } @@ -100,7 +101,7 @@ static const LpMetadataPartition* FindLogicalPartition(const LpMetadata& metadat bool LogicalPartitionExists(const std::string& name, const std::string& slot_suffix, bool* is_zero_length) { - auto path = FindPhysicalPartition(LP_METADATA_PARTITION_NAME); + auto path = FindPhysicalPartition(fs_mgr_get_super_partition_name()); if (!path) { return false; } @@ -149,7 +150,7 @@ std::vector ListPartitions(FastbootDevice* device) { } // Next get logical partitions. - if (auto path = FindPhysicalPartition(LP_METADATA_PARTITION_NAME)) { + if (auto path = FindPhysicalPartition(fs_mgr_get_super_partition_name())) { uint32_t slot_number = SlotNumberForSlotSuffix(device->GetCurrentSlot()); if (auto metadata = ReadMetadata(path->c_str(), slot_number)) { for (const auto& partition : metadata->partitions) { diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index d29ccf438..9e52dae64 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -1501,3 +1502,7 @@ bool fs_mgr_update_verity_state(std::function call return true; } + +std::string fs_mgr_get_super_partition_name(int /* slot */) { + return LP_METADATA_DEFAULT_PARTITION_NAME; +} diff --git a/fs_mgr/include/fs_mgr.h b/fs_mgr/include/fs_mgr.h index cee069b3b..a4544b20c 100644 --- a/fs_mgr/include/fs_mgr.h +++ b/fs_mgr/include/fs_mgr.h @@ -23,6 +23,7 @@ #include #include +#include #include @@ -89,4 +90,9 @@ int fs_mgr_do_format(struct fstab_rec *fstab, bool reserve_footer); #define FS_MGR_SETUP_VERITY_SUCCESS 0 int fs_mgr_setup_verity(struct fstab_rec *fstab, bool wait_for_verity_dev); +// Return the name of the super partition if it exists. If a slot number is +// specified, the super partition for the corresponding metadata slot will be +// returned. Otherwise, it will use the current slot. +std::string fs_mgr_get_super_partition_name(int slot = -1); + #endif /* __CORE_FS_MGR_H */ diff --git a/fs_mgr/liblp/include/liblp/metadata_format.h b/fs_mgr/liblp/include/liblp/metadata_format.h index 52c80f7f4..84329f11f 100644 --- a/fs_mgr/liblp/include/liblp/metadata_format.h +++ b/fs_mgr/liblp/include/liblp/metadata_format.h @@ -67,7 +67,7 @@ extern "C" { * | Geometry Backup | * +--------------------+ */ -#define LP_METADATA_PARTITION_NAME "super" +#define LP_METADATA_DEFAULT_PARTITION_NAME "super" /* Size of a sector is always 512 bytes for compatibility with the Linux kernel. */ #define LP_SECTOR_SIZE 512 diff --git a/init/first_stage_mount.cpp b/init/first_stage_mount.cpp index 71a8e0de6..27ec7a1b9 100644 --- a/init/first_stage_mount.cpp +++ b/init/first_stage_mount.cpp @@ -82,6 +82,7 @@ class FirstStageMount { std::string lp_metadata_partition_; std::vector mount_fstab_recs_; std::set required_devices_partition_names_; + std::string super_partition_name_; std::unique_ptr device_handler_; UeventListener uevent_listener_; }; @@ -168,6 +169,8 @@ FirstStageMount::FirstStageMount() device_handler_ = std::make_unique( std::vector{}, std::vector{}, std::vector{}, std::move(boot_devices), false); + + super_partition_name_ = fs_mgr_get_super_partition_name(); } std::unique_ptr FirstStageMount::Create() { @@ -204,7 +207,7 @@ bool FirstStageMount::GetBackingDmLinearDevices() { return true; } - required_devices_partition_names_.emplace(LP_METADATA_PARTITION_NAME); + required_devices_partition_names_.emplace(super_partition_name_); return true; } @@ -270,7 +273,7 @@ bool FirstStageMount::CreateLogicalPartitions() { if (lp_metadata_partition_.empty()) { LOG(ERROR) << "Could not locate logical partition tables in partition " - << LP_METADATA_PARTITION_NAME; + << super_partition_name_; return false; } return android::fs_mgr::CreateLogicalPartitions(lp_metadata_partition_); @@ -283,7 +286,7 @@ ListenerAction FirstStageMount::HandleBlockDevice(const std::string& name, const auto iter = required_devices_partition_names_.find(name); if (iter != required_devices_partition_names_.end()) { LOG(VERBOSE) << __PRETTY_FUNCTION__ << ": found partition: " << *iter; - if (IsDmLinearEnabled() && name == LP_METADATA_PARTITION_NAME) { + if (IsDmLinearEnabled() && name == super_partition_name_) { std::vector links = device_handler_->GetBlockDeviceSymlinks(uevent); lp_metadata_partition_ = links[0]; }