diff --git a/fastboot/fastboot.cpp b/fastboot/fastboot.cpp index b977e31b1dfda458bc31522b2c418990b4435363..42269fe94ad8556ec8aa6ac6a434a34079574acd 100644 --- a/fastboot/fastboot.cpp +++ b/fastboot/fastboot.cpp @@ -1560,10 +1560,10 @@ static void CancelSnapshotIfNeeded() { } } -std::string GetPartitionName(const ImageEntry& entry) { +std::string GetPartitionName(const ImageEntry& entry, std::string& current_slot) { auto slot = entry.second; if (slot.empty()) { - slot = get_current_slot(); + slot = current_slot; } if (slot.empty()) { return entry.first->part_name; @@ -1582,7 +1582,7 @@ class FlashAllTool { private: void CheckRequirements(); - void DetermineSecondarySlot(); + void DetermineSlot(); void CollectImages(); void FlashImages(const std::vector>& images); void FlashImage(const Image& image, const std::string& slot, fastboot_buffer* buf); @@ -1600,13 +1600,15 @@ void FlashAllTool::Flash() { // Change the slot first, so we boot into the correct recovery image when // using fastbootd. - if (fp_->slot_override == "all") { + if (fp_->slot == "all") { set_active("a"); } else { - set_active(fp_->slot_override); + set_active(fp_->slot); } - DetermineSecondarySlot(); + DetermineSlot(); + CollectImages(); + CancelSnapshotIfNeeded(); // First flash boot partitions. We allow this to happen either in userspace @@ -1651,12 +1653,18 @@ void FlashAllTool::CheckRequirements() { ::CheckRequirements({contents.data(), contents.size()}, fp_->force_flash); } -void FlashAllTool::DetermineSecondarySlot() { +void FlashAllTool::DetermineSlot() { + if (fp_->slot.empty()) { + fp_->current_slot = get_current_slot(); + } else { + fp_->current_slot = fp_->slot; + } + if (fp_->skip_secondary) { return; } - if (fp_->slot_override != "" && fp_->slot_override != "all") { - fp_->secondary_slot = get_other_slot(fp_->slot_override); + if (fp_->slot != "" && fp_->slot != "all") { + fp_->secondary_slot = get_other_slot(fp_->slot); } else { fp_->secondary_slot = get_other_slot(); } @@ -1670,7 +1678,7 @@ void FlashAllTool::DetermineSecondarySlot() { void FlashAllTool::CollectImages() { for (size_t i = 0; i < images.size(); ++i) { - std::string slot = fp_->slot_override; + std::string slot = fp_->slot; if (images[i].IsSecondary()) { if (fp_->skip_secondary) { continue; diff --git a/fastboot/fastboot.h b/fastboot/fastboot.h index 029b58314bfce95faf85020e0cfdb96787f27efe..c9544875b61a61863ca569cf7763f7082b88d3a9 100644 --- a/fastboot/fastboot.h +++ b/fastboot/fastboot.h @@ -80,7 +80,8 @@ struct FlashingPlan { bool skip_secondary = false; bool force_flash = false; - std::string slot_override; + std::string slot; + std::string current_slot; std::string secondary_slot; fastboot::FastBootDriver* fb; }; @@ -102,7 +103,7 @@ struct NetworkSerial { Result ParseNetworkSerial(const std::string& serial); bool supports_AB(); -std::string GetPartitionName(const ImageEntry& entry); +std::string GetPartitionName(const ImageEntry& entry, std::string& current_slot_); void flash_partition_files(const std::string& partition, const std::vector& files); int64_t get_sparse_limit(int64_t size); std::vector resparse_file(sparse_file* s, int64_t max_size); diff --git a/fastboot/task.cpp b/fastboot/task.cpp index 3d2c975a1e282e064ca72607f87a98839ee30d14..9d4cb75b2e485673aca0444102fc0d86a6b35f98 100644 --- a/fastboot/task.cpp +++ b/fastboot/task.cpp @@ -95,7 +95,7 @@ std::unique_ptr FlashSuperLayoutTask::Initialize( LOG(VERBOSE) << "Cannot optimize flashing super on non-AB device"; return nullptr; } - if (fp->slot_override == "all") { + if (fp->slot == "all") { LOG(VERBOSE) << "Cannot optimize flashing super for all slots"; return nullptr; } @@ -132,7 +132,7 @@ std::unique_ptr FlashSuperLayoutTask::Initialize( } for (const auto& entry : os_images) { - auto partition = GetPartitionName(entry); + auto partition = GetPartitionName(entry, fp->current_slot); auto image = entry.first; if (!helper->AddPartition(partition, image->img_name, image->optional_if_no_image)) { @@ -145,7 +145,7 @@ std::unique_ptr FlashSuperLayoutTask::Initialize( // Remove images that we already flashed, just in case we have non-dynamic OS images. auto remove_if_callback = [&](const ImageEntry& entry) -> bool { - return helper->WillFlash(GetPartitionName(entry)); + return helper->WillFlash(GetPartitionName(entry, fp->current_slot)); }; os_images.erase(std::remove_if(os_images.begin(), os_images.end(), remove_if_callback), os_images.end());