Mount /metadata in sideload.

In recovery, /metadata needs to be mounted before doing
any updates (even regular ones) on VAB device.

Test: sideload
Bug: 140749209

Change-Id: Iad8ef63c572b7b6d3ad8be5ee7ec11001b337435
diff --git a/dynamic_partition_control_android.cc b/dynamic_partition_control_android.cc
index e194670..f017c9f 100644
--- a/dynamic_partition_control_android.cc
+++ b/dynamic_partition_control_android.cc
@@ -213,6 +213,7 @@
 }
 
 void DynamicPartitionControlAndroid::CleanupInternal(bool wait) {
+  metadata_device_.reset();
   if (mapped_devices_.empty()) {
     return;
   }
@@ -356,6 +357,11 @@
   target_supports_snapshot_ =
       manifest.dynamic_partition_metadata().snapshot_enabled();
 
+  if (GetVirtualAbFeatureFlag().IsEnabled()) {
+    metadata_device_ = snapshot_->EnsureMetadataMounted();
+    TEST_AND_RETURN_FALSE(metadata_device_ != nullptr);
+  }
+
   if (!update)
     return true;
 
diff --git a/dynamic_partition_control_android.h b/dynamic_partition_control_android.h
index d70a2aa..8f45682 100644
--- a/dynamic_partition_control_android.h
+++ b/dynamic_partition_control_android.h
@@ -23,6 +23,7 @@
 #include <set>
 #include <string>
 
+#include <libsnapshot/auto_device.h>
 #include <libsnapshot/snapshot.h>
 
 namespace chromeos_update_engine {
@@ -115,6 +116,7 @@
   const FeatureFlag dynamic_partitions_;
   const FeatureFlag virtual_ab_;
   std::unique_ptr<android::snapshot::SnapshotManager> snapshot_;
+  std::unique_ptr<android::snapshot::AutoDevice> metadata_device_;
   bool target_supports_snapshot_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(DynamicPartitionControlAndroid);