From 23de22d54b834b41f82c38ebc990cbe4fae2f809 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 20 Jul 2018 16:28:04 -0700 Subject: [PATCH] fs_mgr: Add a method for creating one-off partition instances. fastbootd needs to temporarily map and unmap logical partitions in order to flash them. To make this easier, this change introduces fs_mgr methods to create and destroy a single logical partition by name. Bug: 79173901 Test: N/A Change-Id: Ic085f2175c26a5edf5f18544012dcfe6d8088f09 --- fs_mgr/fs_mgr_dm_linear.cpp | 56 ++++++++++++++++++++++++------- fs_mgr/include/fs_mgr_dm_linear.h | 9 +++++ 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/fs_mgr/fs_mgr_dm_linear.cpp b/fs_mgr/fs_mgr_dm_linear.cpp index 28e910ba2..05e03e152 100644 --- a/fs_mgr/fs_mgr_dm_linear.cpp +++ b/fs_mgr/fs_mgr_dm_linear.cpp @@ -79,6 +79,25 @@ static bool CreateDmTable(const std::string& block_device, const LpMetadata& met return true; } +static bool CreateLogicalPartition(const std::string& block_device, const LpMetadata& metadata, + const LpMetadataPartition& partition, std::string* path) { + DeviceMapper& dm = DeviceMapper::Instance(); + + DmTable table; + if (!CreateDmTable(block_device, metadata, partition, &table)) { + return false; + } + std::string name = GetPartitionName(partition); + if (!dm.CreateDevice(name, table)) { + return false; + } + if (!dm.GetDmDevicePathByName(name, path)) { + return false; + } + LINFO << "Created logical partition " << name << " on device " << *path; + return true; +} + bool CreateLogicalPartitions(const std::string& block_device) { uint32_t slot = SlotNumberForSlotSuffix(fs_mgr_get_slot_suffix()); auto metadata = ReadMetadata(block_device.c_str(), slot); @@ -86,23 +105,36 @@ bool CreateLogicalPartitions(const std::string& block_device) { LOG(ERROR) << "Could not read partition table."; return true; } - - DeviceMapper& dm = DeviceMapper::Instance(); for (const auto& partition : metadata->partitions) { - DmTable table; - if (!CreateDmTable(block_device, *metadata.get(), partition, &table)) { - return false; - } - std::string name = GetPartitionName(partition); - if (!dm.CreateDevice(name, table)) { - return false; - } std::string path; - dm.GetDmDevicePathByName(partition.name, &path); - LINFO << "Created logical partition " << name << " on device " << path; + if (!CreateLogicalPartition(block_device, *metadata.get(), partition, &path)) { + LERROR << "Could not create logical partition: " << GetPartitionName(partition); + return false; + } } return true; } +bool CreateLogicalPartition(const std::string& block_device, uint32_t metadata_slot, + const std::string& partition_name, std::string* path) { + auto metadata = ReadMetadata(block_device.c_str(), metadata_slot); + if (!metadata) { + LOG(ERROR) << "Could not read partition table."; + return true; + } + for (const auto& partition : metadata->partitions) { + if (GetPartitionName(partition) == partition_name) { + return CreateLogicalPartition(block_device, *metadata.get(), partition, path); + } + } + LERROR << "Could not find any partition with name: " << partition_name; + return false; +} + +bool DestroyLogicalPartition(const std::string& name) { + DeviceMapper& dm = DeviceMapper::Instance(); + return dm.DeleteDevice(name); +} + } // namespace fs_mgr } // namespace android diff --git a/fs_mgr/include/fs_mgr_dm_linear.h b/fs_mgr/include/fs_mgr_dm_linear.h index 42af9d002..cac475c25 100644 --- a/fs_mgr/include/fs_mgr_dm_linear.h +++ b/fs_mgr/include/fs_mgr_dm_linear.h @@ -39,6 +39,15 @@ namespace fs_mgr { bool CreateLogicalPartitions(const std::string& block_device); +// Create a block device for a single logical partition, given metadata and +// the partition name. On success, a path to the partition's block device is +// returned. +bool CreateLogicalPartition(const std::string& block_device, uint32_t metadata_slot, + const std::string& partition_name, std::string* path); + +// Destroy the block device for a logical partition, by name. +bool DestroyLogicalPartition(const std::string& name); + } // namespace fs_mgr } // namespace android