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