DynamicPartitionControl: only create snapshot when snapshot_enabled
Do not create snapshot when applying downgrade
to non-Virtual-A/B packages and secondary OTAs.
Test: apply downgrade OTA on Virtual A/B devices
Bug: 138733621 (secondary OTA)
Fixes: 138258570 (downgrades)
Change-Id: I13318f57613d6bd60a5b7e81ebb3e35b3c225a0c
diff --git a/dynamic_partition_control_android.cc b/dynamic_partition_control_android.cc
index 8dcf343..88a787a 100644
--- a/dynamic_partition_control_android.cc
+++ b/dynamic_partition_control_android.cc
@@ -112,7 +112,8 @@
.force_writable = force_writable,
};
bool success = false;
- if (GetVirtualAbFeatureFlag().IsEnabled() && force_writable) {
+ if (GetVirtualAbFeatureFlag().IsEnabled() && target_supports_snapshot_ &&
+ force_writable) {
// Only target partitions are mapped with force_writable. On Virtual
// A/B devices, target partitions may overlap with source partitions, so
// they must be mapped with snapshot.
@@ -343,11 +344,15 @@
bool DynamicPartitionControlAndroid::PreparePartitionsForUpdate(
uint32_t source_slot,
uint32_t target_slot,
- const DeltaArchiveManifest& manifest) {
- // TODO(elsk): Also call PrepareDynamicPartitionsForUpdate when applying
- // downgrade packages on retrofit Virtual A/B devices and when applying
- // secondary OTA. b/138258570
- if (GetVirtualAbFeatureFlag().IsEnabled()) {
+ const DeltaArchiveManifest& manifest,
+ bool update) {
+ target_supports_snapshot_ =
+ manifest.dynamic_partition_metadata().snapshot_enabled();
+
+ if (!update)
+ return true;
+
+ if (GetVirtualAbFeatureFlag().IsEnabled() && target_supports_snapshot_) {
return PrepareSnapshotPartitionsForUpdate(
source_slot, target_slot, manifest);
}
@@ -491,10 +496,11 @@
}
bool DynamicPartitionControlAndroid::FinishUpdate() {
- if (!GetVirtualAbFeatureFlag().IsEnabled())
- return true;
- LOG(INFO) << "Snapshot writes are done.";
- return snapshot_->FinishedSnapshotWrites();
+ if (GetVirtualAbFeatureFlag().IsEnabled() && target_supports_snapshot_) {
+ LOG(INFO) << "Snapshot writes are done.";
+ return snapshot_->FinishedSnapshotWrites();
+ }
+ return true;
}
} // namespace chromeos_update_engine