From 340e78d0f63af7b8efa7d87f14816e1bd0184c69 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Mon, 9 Aug 2021 12:33:46 -0700 Subject: [PATCH] fastbootd: Delete all VAB partitions during "flashall". With VAB we encourage a smaller super partition, so make sure we delete "other" slot partitions during flashing. Otherwise, we may not have enough space in super. Bug: 195930130 Test: set_active, flashall, ensure other slot is deleted Change-Id: Ic6a4f60e8f4c7abb8af7b38228753ad8ed85eedf Merged-In: Ic6a4f60e8f4c7abb8af7b38228753ad8ed85eedf --- fastboot/device/flashing.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/fastboot/device/flashing.cpp b/fastboot/device/flashing.cpp index ee0aa582b..9b5d2cd25 100644 --- a/fastboot/device/flashing.cpp +++ b/fastboot/device/flashing.cpp @@ -187,11 +187,17 @@ bool UpdateSuper(FastbootDevice* device, const std::string& super_name, bool wip ", build may be missing broken or missing boot_devices"); } + std::string slot_suffix = device->GetCurrentSlot(); + uint32_t slot_number = SlotNumberForSlotSuffix(slot_suffix); + + std::string other_slot_suffix; + if (!slot_suffix.empty()) { + other_slot_suffix = (slot_suffix == "_a") ? "_b" : "_a"; + } + // If we are unable to read the existing metadata, then the super partition // is corrupt. In this case we reflash the whole thing using the provided // image. - std::string slot_suffix = device->GetCurrentSlot(); - uint32_t slot_number = SlotNumberForSlotSuffix(slot_suffix); std::unique_ptr old_metadata = ReadMetadata(super_name, slot_number); if (wipe || !old_metadata) { if (!FlashPartitionTable(super_name, *new_metadata.get())) { @@ -203,11 +209,15 @@ bool UpdateSuper(FastbootDevice* device, const std::string& super_name, bool wip } std::set partitions_to_keep; + bool virtual_ab = android::base::GetBoolProperty("ro.virtual_ab.enabled", false); for (const auto& partition : old_metadata->partitions) { // Preserve partitions in the other slot, but not the current slot. std::string partition_name = GetPartitionName(partition); - if (!slot_suffix.empty() && GetPartitionSlotSuffix(partition_name) == slot_suffix) { - continue; + if (!slot_suffix.empty()) { + auto part_suffix = GetPartitionSlotSuffix(partition_name); + if (part_suffix == slot_suffix || (part_suffix == other_slot_suffix && virtual_ab)) { + continue; + } } std::string group_name = GetPartitionGroupName(old_metadata->groups[partition.group_index]); // Skip partitions in the COW group