liblp: Add helpers for finding partitions and partition sizes.

These tend to get manually, so let's promote to actual helpers.

Bug: 134536978
Test: liblp_test gtest
Change-Id: Ifb79c8d6f247cc3f9635bf6adfd1c99907340002
This commit is contained in:
David Anderson 2019-06-07 10:44:19 -07:00
parent 1e05e55820
commit 196d2ba7b9
4 changed files with 30 additions and 1 deletions

View File

@ -94,7 +94,7 @@ bool GetVarHandler(FastbootDevice* device, const std::vector<std::string>& args)
{FB_VAR_HAS_SLOT, {GetHasSlot, GetAllPartitionArgsNoSlot}},
{FB_VAR_SLOT_SUCCESSFUL, {GetSlotSuccessful, nullptr}},
{FB_VAR_SLOT_UNBOOTABLE, {GetSlotUnbootable, nullptr}},
{FB_VAR_PARTITION_SIZE, {GetPartitionSize, GetAllPartitionArgsWithSlot}},
{FB_VAR_PARTITION_SIZE, {::GetPartitionSize, GetAllPartitionArgsWithSlot}},
{FB_VAR_PARTITION_TYPE, {GetPartitionType, GetAllPartitionArgsWithSlot}},
{FB_VAR_IS_LOGICAL, {GetPartitionIsLogical, GetAllPartitionArgsWithSlot}},
{FB_VAR_IS_USERSPACE, {GetIsUserspace, nullptr}},

View File

@ -106,6 +106,13 @@ TEST_F(BuilderTest, ResizePartition) {
EXPECT_EQ(extent->num_sectors(), 32768 / LP_SECTOR_SIZE);
EXPECT_EQ(extent->physical_sector(), 32);
auto exported = builder->Export();
ASSERT_NE(exported, nullptr);
ASSERT_EQ(FindPartition(*exported.get(), "not found"), nullptr);
auto entry = FindPartition(*exported.get(), "system");
ASSERT_NE(entry, nullptr);
ASSERT_EQ(GetPartitionSize(*exported.get(), *entry), 32768);
// Test shrinking to 0.
builder->ResizePartition(system, 0);
EXPECT_EQ(system->size(), 0);

View File

@ -107,6 +107,10 @@ uint32_t SlotNumberForSlotSuffix(const std::string& suffix);
std::string SlotSuffixForSlotNumber(uint32_t slot_number);
std::string GetPartitionSlotSuffix(const std::string& partition_name);
// Helpers for common functions.
const LpMetadataPartition* FindPartition(const LpMetadata& metadata, const std::string& name);
uint64_t GetPartitionSize(const LpMetadata& metadata, const LpMetadataPartition& partition);
} // namespace fs_mgr
} // namespace android

View File

@ -135,6 +135,24 @@ std::vector<std::string> GetBlockDevicePartitionNames(const LpMetadata& metadata
return list;
}
const LpMetadataPartition* FindPartition(const LpMetadata& metadata, const std::string& name) {
for (const auto& partition : metadata.partitions) {
if (GetPartitionName(partition) == name) {
return &partition;
}
}
return nullptr;
}
uint64_t GetPartitionSize(const LpMetadata& metadata, const LpMetadataPartition& partition) {
uint64_t total_size = 0;
for (uint32_t i = 0; i < partition.num_extents; i++) {
const auto& extent = metadata.extents[partition.first_extent_index + i];
total_size += extent.num_sectors * LP_SECTOR_SIZE;
}
return total_size;
}
std::string GetPartitionSlotSuffix(const std::string& partition_name) {
if (partition_name.size() <= 2) {
return "";