Add [un]mapPartitions APIs to dynamic partition control
During postinstall stage, update_engine needs all target
partitions(system_b, vendor_b) to be mounted. We add 2 APIs to dynamic
partition control, 1 for mounting all partitions, and UnmapAllPartitions for unmap all partitions.
Test: Treehugger
Bug: 168554689
Change-Id: I1047851f6cdae7f39f50bd1d50e6d3bfc0d9a7f5
diff --git a/dynamic_partition_control_android.cc b/dynamic_partition_control_android.cc
index 06e5745..7c331f0 100644
--- a/dynamic_partition_control_android.cc
+++ b/dynamic_partition_control_android.cc
@@ -273,9 +273,9 @@
return true;
}
-void DynamicPartitionControlAndroid::UnmapAllPartitions() {
+bool DynamicPartitionControlAndroid::UnmapAllPartitions() {
if (mapped_devices_.empty()) {
- return;
+ return false;
}
// UnmapPartitionOnDeviceMapper removes objects from mapped_devices_, hence
// a copy is needed for the loop.
@@ -284,6 +284,7 @@
for (const auto& partition_name : mapped) {
ignore_result(UnmapPartitionOnDeviceMapper(partition_name));
}
+ return true;
}
void DynamicPartitionControlAndroid::Cleanup() {
@@ -1240,16 +1241,12 @@
bool is_append) {
auto suffix = SlotSuffixForSlotNumber(target_slot_);
- std::string device_dir_str;
- if (!GetDeviceDir(&device_dir_str)) {
- LOG(ERROR) << "Failed to get device dir!";
+ auto super_device = GetSuperDevice();
+ if (!super_device.has_value()) {
return nullptr;
}
- base::FilePath device_dir(device_dir_str);
- auto super_device =
- device_dir.Append(GetSuperPartitionName(target_slot_)).value();
CreateLogicalPartitionParams params = {
- .block_device = super_device,
+ .block_device = super_device->value(),
.metadata_slot = target_slot_,
.partition_name = partition_name + suffix,
.force_writable = true,
@@ -1259,4 +1256,19 @@
return snapshot_->OpenSnapshotWriter(params, std::move(source_path));
}
+std::optional<base::FilePath> DynamicPartitionControlAndroid::GetSuperDevice() {
+ std::string device_dir_str;
+ if (!GetDeviceDir(&device_dir_str)) {
+ LOG(ERROR) << "Failed to get device dir!";
+ return {};
+ }
+ base::FilePath device_dir(device_dir_str);
+ auto super_device = device_dir.Append(GetSuperPartitionName(target_slot_));
+ return super_device;
+}
+
+bool DynamicPartitionControlAndroid::MapAllPartitions() {
+ return snapshot_->MapAllSnapshots();
+}
+
} // namespace chromeos_update_engine