| Daniel Zheng | 0d30718 | 2023-01-31 21:07:53 +0000 | [diff] [blame] | 1 | // | 
|  | 2 | // Copyright (C) 2023 The Android Open Source Project | 
|  | 3 | // | 
|  | 4 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | 5 | // you may not use this file except in compliance with the License. | 
|  | 6 | // You may obtain a copy of the License at | 
|  | 7 | // | 
|  | 8 | //      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 9 | // | 
|  | 10 | // Unless required by applicable law or agreed to in writing, software | 
|  | 11 | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | 13 | // See the License for the specific language governing permissions and | 
|  | 14 | // limitations under the License. | 
|  | 15 | // | 
|  | 16 | #include "task.h" | 
| Daniel Zheng | 7627b54 | 2023-04-13 13:43:17 -0700 | [diff] [blame] | 17 |  | 
| Daniel Zheng | 1fff690 | 2023-08-24 09:47:43 -0700 | [diff] [blame] | 18 | #include "fastboot_driver.h" | 
| Daniel Zheng | 7627b54 | 2023-04-13 13:43:17 -0700 | [diff] [blame] | 19 |  | 
|  | 20 | #include <android-base/logging.h> | 
|  | 21 | #include <android-base/parseint.h> | 
|  | 22 |  | 
| Daniel Zheng | 71b3b43 | 2023-01-30 17:43:00 +0000 | [diff] [blame] | 23 | #include "fastboot.h" | 
| Daniel Zheng | 47d70a5 | 2023-02-14 17:44:40 +0000 | [diff] [blame] | 24 | #include "filesystem.h" | 
|  | 25 | #include "super_flash_helper.h" | 
| Daniel Zheng | 29a211c | 2023-03-10 07:23:49 +0000 | [diff] [blame] | 26 | #include "util.h" | 
| Daniel Zheng | 0d30718 | 2023-01-31 21:07:53 +0000 | [diff] [blame] | 27 |  | 
| Daniel Zheng | 47d70a5 | 2023-02-14 17:44:40 +0000 | [diff] [blame] | 28 | using namespace std::string_literals; | 
| Daniel Zheng | 5a9905a | 2023-05-23 10:51:01 -0700 | [diff] [blame] | 29 | FlashTask::FlashTask(const std::string& slot, const std::string& pname, const std::string& fname, | 
| Daniel Zheng | 791a83b | 2023-05-23 10:42:39 -0700 | [diff] [blame] | 30 | const bool apply_vbmeta, const FlashingPlan* fp) | 
|  | 31 | : pname_(pname), fname_(fname), slot_(slot), apply_vbmeta_(apply_vbmeta), fp_(fp) {} | 
| Daniel Zheng | 0d30718 | 2023-01-31 21:07:53 +0000 | [diff] [blame] | 32 |  | 
| David Anderson | adb91b0 | 2023-12-12 11:25:40 -0800 | [diff] [blame] | 33 | bool FlashTask::IsDynamicPartition(const ImageSource* source, const FlashTask* task) { | 
| Daniel Zheng | 1ef66b7 | 2023-08-24 15:44:56 -0700 | [diff] [blame] | 34 | std::vector<char> contents; | 
|  | 35 | if (!source->ReadFile("super_empty.img", &contents)) { | 
|  | 36 | return false; | 
|  | 37 | } | 
|  | 38 | auto metadata = android::fs_mgr::ReadFromImageBlob(contents.data(), contents.size()); | 
|  | 39 | return should_flash_in_userspace(*metadata.get(), task->GetPartitionAndSlot()); | 
|  | 40 | } | 
|  | 41 |  | 
| Daniel Zheng | 0d30718 | 2023-01-31 21:07:53 +0000 | [diff] [blame] | 42 | void FlashTask::Run() { | 
|  | 43 | auto flash = [&](const std::string& partition) { | 
| Christopher Ferris | 9dabc9e | 2023-10-02 17:02:05 -0700 | [diff] [blame] | 44 | if (should_flash_in_userspace(fp_->source.get(), partition) && !is_userspace_fastboot() && | 
| Daniel Zheng | 7a8f82a | 2023-09-21 20:37:47 -0700 | [diff] [blame] | 45 | !fp_->force_flash) { | 
| Daniel Zheng | 0d30718 | 2023-01-31 21:07:53 +0000 | [diff] [blame] | 46 | die("The partition you are trying to flash is dynamic, and " | 
|  | 47 | "should be flashed via fastbootd. Please run:\n" | 
|  | 48 | "\n" | 
|  | 49 | "    fastboot reboot fastboot\n" | 
|  | 50 | "\n" | 
|  | 51 | "And try again. If you are intentionally trying to " | 
|  | 52 | "overwrite a fixed partition, use --force."); | 
|  | 53 | } | 
| Daniel Zheng | 791a83b | 2023-05-23 10:42:39 -0700 | [diff] [blame] | 54 | do_flash(partition.c_str(), fname_.c_str(), apply_vbmeta_, fp_); | 
| Daniel Zheng | 0d30718 | 2023-01-31 21:07:53 +0000 | [diff] [blame] | 55 | }; | 
|  | 56 | do_for_partitions(pname_, slot_, flash, true); | 
|  | 57 | } | 
| Daniel Zheng | 71b3b43 | 2023-01-30 17:43:00 +0000 | [diff] [blame] | 58 |  | 
| Daniel Zheng | 1ef66b7 | 2023-08-24 15:44:56 -0700 | [diff] [blame] | 59 | std::string FlashTask::ToString() const { | 
| Daniel Zheng | 665a460 | 2023-06-05 11:24:59 -0700 | [diff] [blame] | 60 | std::string apply_vbmeta_string = ""; | 
|  | 61 | if (apply_vbmeta_) { | 
|  | 62 | apply_vbmeta_string = " --apply_vbmeta"; | 
|  | 63 | } | 
|  | 64 | return "flash" + apply_vbmeta_string + " " + pname_ + " " + fname_; | 
|  | 65 | } | 
|  | 66 |  | 
| Daniel Zheng | 1ef66b7 | 2023-08-24 15:44:56 -0700 | [diff] [blame] | 67 | std::string FlashTask::GetPartitionAndSlot() const { | 
| Daniel Zheng | 29a211c | 2023-03-10 07:23:49 +0000 | [diff] [blame] | 68 | auto slot = slot_; | 
|  | 69 | if (slot.empty()) { | 
|  | 70 | slot = get_current_slot(); | 
|  | 71 | } | 
|  | 72 | if (slot.empty()) { | 
|  | 73 | return pname_; | 
|  | 74 | } | 
|  | 75 | if (slot == "all") { | 
|  | 76 | LOG(FATAL) << "Cannot retrieve a singular name when using all slots"; | 
|  | 77 | } | 
|  | 78 | return pname_ + "_" + slot; | 
|  | 79 | } | 
|  | 80 |  | 
| Daniel Zheng | e6dbd4f | 2023-04-10 09:53:08 -0700 | [diff] [blame] | 81 | RebootTask::RebootTask(const FlashingPlan* fp) : fp_(fp){}; | 
|  | 82 | RebootTask::RebootTask(const FlashingPlan* fp, const std::string& reboot_target) | 
| Daniel Zheng | 43987c9 | 2023-03-07 18:20:53 +0000 | [diff] [blame] | 83 | : reboot_target_(reboot_target), fp_(fp){}; | 
| Daniel Zheng | 71b3b43 | 2023-01-30 17:43:00 +0000 | [diff] [blame] | 84 |  | 
|  | 85 | void RebootTask::Run() { | 
| Daniel Zheng | 77af6af | 2023-04-20 14:30:28 -0700 | [diff] [blame] | 86 | if (reboot_target_ == "fastboot") { | 
| Daniel Zheng | 71b3b43 | 2023-01-30 17:43:00 +0000 | [diff] [blame] | 87 | if (!is_userspace_fastboot()) { | 
|  | 88 | reboot_to_userspace_fastboot(); | 
| Daniel Zheng | bc01da5 | 2023-02-23 03:25:52 +0000 | [diff] [blame] | 89 | fp_->fb->WaitForDisconnect(); | 
| Daniel Zheng | 71b3b43 | 2023-01-30 17:43:00 +0000 | [diff] [blame] | 90 | } | 
|  | 91 | } else if (reboot_target_ == "recovery") { | 
| Daniel Zheng | bc01da5 | 2023-02-23 03:25:52 +0000 | [diff] [blame] | 92 | fp_->fb->RebootTo("recovery"); | 
|  | 93 | fp_->fb->WaitForDisconnect(); | 
| Daniel Zheng | 71b3b43 | 2023-01-30 17:43:00 +0000 | [diff] [blame] | 94 | } else if (reboot_target_ == "bootloader") { | 
| Daniel Zheng | bc01da5 | 2023-02-23 03:25:52 +0000 | [diff] [blame] | 95 | fp_->fb->RebootTo("bootloader"); | 
|  | 96 | fp_->fb->WaitForDisconnect(); | 
| Daniel Zheng | 71b3b43 | 2023-01-30 17:43:00 +0000 | [diff] [blame] | 97 | } else if (reboot_target_ == "") { | 
| Daniel Zheng | bc01da5 | 2023-02-23 03:25:52 +0000 | [diff] [blame] | 98 | fp_->fb->Reboot(); | 
|  | 99 | fp_->fb->WaitForDisconnect(); | 
| Daniel Zheng | 71b3b43 | 2023-01-30 17:43:00 +0000 | [diff] [blame] | 100 | } else { | 
|  | 101 | syntax_error("unknown reboot target %s", reboot_target_.c_str()); | 
|  | 102 | } | 
|  | 103 | } | 
| Daniel Zheng | 47d70a5 | 2023-02-14 17:44:40 +0000 | [diff] [blame] | 104 |  | 
| Daniel Zheng | 1ef66b7 | 2023-08-24 15:44:56 -0700 | [diff] [blame] | 105 | std::string RebootTask::ToString() const { | 
| Daniel Zheng | 665a460 | 2023-06-05 11:24:59 -0700 | [diff] [blame] | 106 | return "reboot " + reboot_target_; | 
|  | 107 | } | 
|  | 108 |  | 
| Daniel Zheng | 3e04857 | 2023-06-21 15:21:06 -0700 | [diff] [blame] | 109 | OptimizedFlashSuperTask::OptimizedFlashSuperTask(const std::string& super_name, | 
|  | 110 | std::unique_ptr<SuperFlashHelper> helper, | 
|  | 111 | SparsePtr sparse_layout, uint64_t super_size, | 
|  | 112 | const FlashingPlan* fp) | 
| Daniel Zheng | 47d70a5 | 2023-02-14 17:44:40 +0000 | [diff] [blame] | 113 | : super_name_(super_name), | 
|  | 114 | helper_(std::move(helper)), | 
| David Anderson | 74c7807 | 2023-03-16 21:21:28 -0700 | [diff] [blame] | 115 | sparse_layout_(std::move(sparse_layout)), | 
| Daniel Zheng | 5769b26 | 2023-06-21 14:41:11 -0700 | [diff] [blame] | 116 | super_size_(super_size), | 
|  | 117 | fp_(fp) {} | 
| Daniel Zheng | 47d70a5 | 2023-02-14 17:44:40 +0000 | [diff] [blame] | 118 |  | 
| Daniel Zheng | 3e04857 | 2023-06-21 15:21:06 -0700 | [diff] [blame] | 119 | void OptimizedFlashSuperTask::Run() { | 
| David Anderson | 74c7807 | 2023-03-16 21:21:28 -0700 | [diff] [blame] | 120 | // Use the reported super partition size as the upper limit, rather than | 
|  | 121 | // sparse_file_len, which (1) can fail and (2) is kind of expensive, since | 
|  | 122 | // it will map in all of the embedded fds. | 
| Daniel Zheng | 47d70a5 | 2023-02-14 17:44:40 +0000 | [diff] [blame] | 123 | std::vector<SparsePtr> files; | 
| Daniel Zheng | 5769b26 | 2023-06-21 14:41:11 -0700 | [diff] [blame] | 124 | if (int limit = get_sparse_limit(super_size_, fp_)) { | 
| Daniel Zheng | 47d70a5 | 2023-02-14 17:44:40 +0000 | [diff] [blame] | 125 | files = resparse_file(sparse_layout_.get(), limit); | 
|  | 126 | } else { | 
|  | 127 | files.emplace_back(std::move(sparse_layout_)); | 
|  | 128 | } | 
|  | 129 |  | 
|  | 130 | // Send the data to the device. | 
|  | 131 | flash_partition_files(super_name_, files); | 
|  | 132 | } | 
| Daniel Zheng | 1fff690 | 2023-08-24 09:47:43 -0700 | [diff] [blame] | 133 |  | 
| Daniel Zheng | 1ef66b7 | 2023-08-24 15:44:56 -0700 | [diff] [blame] | 134 | std::string OptimizedFlashSuperTask::ToString() const { | 
| Daniel Zheng | 665a460 | 2023-06-05 11:24:59 -0700 | [diff] [blame] | 135 | return "optimized-flash-super"; | 
|  | 136 | } | 
| Daniel Zheng | 47d70a5 | 2023-02-14 17:44:40 +0000 | [diff] [blame] | 137 |  | 
| Daniel Zheng | 1ef66b7 | 2023-08-24 15:44:56 -0700 | [diff] [blame] | 138 | // This looks for a block within tasks that has the following pattern [reboot fastboot, | 
|  | 139 | // update-super, $LIST_OF_DYNAMIC_FLASH_TASKS] and returns true if this is found.Theoretically | 
|  | 140 | // this check is just a pattern match and could break if fastboot-info has a bunch of junk commands | 
|  | 141 | // but all devices should pretty much follow this pattern | 
|  | 142 | bool OptimizedFlashSuperTask::CanOptimize(const ImageSource* source, | 
|  | 143 | const std::vector<std::unique_ptr<Task>>& tasks) { | 
|  | 144 | for (size_t i = 0; i < tasks.size(); i++) { | 
|  | 145 | auto reboot_task = tasks[i]->AsRebootTask(); | 
|  | 146 | if (!reboot_task || reboot_task->GetTarget() != "fastboot") { | 
|  | 147 | continue; | 
| Daniel Zheng | 47d70a5 | 2023-02-14 17:44:40 +0000 | [diff] [blame] | 148 | } | 
| Daniel Zheng | 1ef66b7 | 2023-08-24 15:44:56 -0700 | [diff] [blame] | 149 | // The check for i >= tasks.size() - 2 is because we are peeking two tasks ahead. We need to | 
|  | 150 | // check for an update-super && flash {dynamic_partition} | 
|  | 151 | if (i >= tasks.size() - 2 || !tasks[i + 1]->AsUpdateSuperTask()) { | 
|  | 152 | continue; | 
|  | 153 | } | 
|  | 154 | auto flash_task = tasks[i + 2]->AsFlashTask(); | 
| David Anderson | adb91b0 | 2023-12-12 11:25:40 -0800 | [diff] [blame] | 155 | if (!FlashTask::IsDynamicPartition(source, flash_task)) { | 
| Daniel Zheng | 1ef66b7 | 2023-08-24 15:44:56 -0700 | [diff] [blame] | 156 | continue; | 
|  | 157 | } | 
|  | 158 | return true; | 
| Daniel Zheng | 47d70a5 | 2023-02-14 17:44:40 +0000 | [diff] [blame] | 159 | } | 
| Daniel Zheng | 1ef66b7 | 2023-08-24 15:44:56 -0700 | [diff] [blame] | 160 | return false; | 
| Daniel Zheng | 47d70a5 | 2023-02-14 17:44:40 +0000 | [diff] [blame] | 161 | } | 
| Daniel Zheng | 6bb8baa | 2023-03-03 07:14:23 +0000 | [diff] [blame] | 162 |  | 
| Daniel Zheng | 1ef66b7 | 2023-08-24 15:44:56 -0700 | [diff] [blame] | 163 | std::unique_ptr<OptimizedFlashSuperTask> OptimizedFlashSuperTask::Initialize( | 
| Daniel Zheng | 29a211c | 2023-03-10 07:23:49 +0000 | [diff] [blame] | 164 | const FlashingPlan* fp, std::vector<std::unique_ptr<Task>>& tasks) { | 
| Daniel Zheng | d62002c | 2023-06-21 14:27:35 -0700 | [diff] [blame] | 165 | if (!fp->should_optimize_flash_super) { | 
|  | 166 | LOG(INFO) << "super optimization is disabled"; | 
|  | 167 | return nullptr; | 
|  | 168 | } | 
| Daniel Zheng | 1fff690 | 2023-08-24 09:47:43 -0700 | [diff] [blame] | 169 | if (!supports_AB(fp->fb)) { | 
| Daniel Zheng | 29a211c | 2023-03-10 07:23:49 +0000 | [diff] [blame] | 170 | LOG(VERBOSE) << "Cannot optimize flashing super on non-AB device"; | 
|  | 171 | return nullptr; | 
|  | 172 | } | 
|  | 173 | if (fp->slot_override == "all") { | 
|  | 174 | LOG(VERBOSE) << "Cannot optimize flashing super for all slots"; | 
|  | 175 | return nullptr; | 
|  | 176 | } | 
| Christopher Ferris | 9dabc9e | 2023-10-02 17:02:05 -0700 | [diff] [blame] | 177 | if (!CanOptimize(fp->source.get(), tasks)) { | 
| Daniel Zheng | 1ef66b7 | 2023-08-24 15:44:56 -0700 | [diff] [blame] | 178 | return nullptr; | 
|  | 179 | } | 
| Daniel Zheng | 29a211c | 2023-03-10 07:23:49 +0000 | [diff] [blame] | 180 |  | 
|  | 181 | // Does this device use dynamic partitions at all? | 
|  | 182 | unique_fd fd = fp->source->OpenFile("super_empty.img"); | 
|  | 183 |  | 
|  | 184 | if (fd < 0) { | 
|  | 185 | LOG(VERBOSE) << "could not open super_empty.img"; | 
|  | 186 | return nullptr; | 
|  | 187 | } | 
|  | 188 |  | 
|  | 189 | std::string super_name; | 
|  | 190 | // Try to find whether there is a super partition. | 
|  | 191 | if (fp->fb->GetVar("super-partition-name", &super_name) != fastboot::SUCCESS) { | 
|  | 192 | super_name = "super"; | 
|  | 193 | } | 
|  | 194 | uint64_t partition_size; | 
|  | 195 | std::string partition_size_str; | 
|  | 196 | if (fp->fb->GetVar("partition-size:" + super_name, &partition_size_str) != fastboot::SUCCESS) { | 
|  | 197 | LOG(VERBOSE) << "Cannot optimize super flashing: could not determine super partition"; | 
|  | 198 | return nullptr; | 
|  | 199 | } | 
|  | 200 | partition_size_str = fb_fix_numeric_var(partition_size_str); | 
|  | 201 | if (!android::base::ParseUint(partition_size_str, &partition_size)) { | 
|  | 202 | LOG(VERBOSE) << "Could not parse " << super_name << " size: " << partition_size_str; | 
|  | 203 | return nullptr; | 
|  | 204 | } | 
|  | 205 |  | 
|  | 206 | std::unique_ptr<SuperFlashHelper> helper = std::make_unique<SuperFlashHelper>(*fp->source); | 
|  | 207 | if (!helper->Open(fd)) { | 
|  | 208 | return nullptr; | 
|  | 209 | } | 
|  | 210 |  | 
|  | 211 | for (const auto& task : tasks) { | 
|  | 212 | if (auto flash_task = task->AsFlashTask()) { | 
| Daniel Zheng | 2775df6 | 2023-05-25 15:14:59 -0700 | [diff] [blame] | 213 | auto partition = flash_task->GetPartitionAndSlot(); | 
|  | 214 | if (!helper->AddPartition(partition, flash_task->GetImageName(), false)) { | 
|  | 215 | return nullptr; | 
| Daniel Zheng | 29a211c | 2023-03-10 07:23:49 +0000 | [diff] [blame] | 216 | } | 
|  | 217 | } | 
|  | 218 | } | 
|  | 219 |  | 
|  | 220 | auto s = helper->GetSparseLayout(); | 
|  | 221 | if (!s) return nullptr; | 
| Daniel Zheng | 1fff690 | 2023-08-24 09:47:43 -0700 | [diff] [blame] | 222 |  | 
|  | 223 | // Remove tasks that are concatenated into this optimized task | 
| Daniel Zheng | 29a211c | 2023-03-10 07:23:49 +0000 | [diff] [blame] | 224 | auto remove_if_callback = [&](const auto& task) -> bool { | 
|  | 225 | if (auto flash_task = task->AsFlashTask()) { | 
|  | 226 | return helper->WillFlash(flash_task->GetPartitionAndSlot()); | 
| Yi Kong | b8bbc43 | 2023-12-05 18:35:33 +0900 | [diff] [blame] | 227 | } else if (task->AsUpdateSuperTask()) { | 
| Daniel Zheng | 29a211c | 2023-03-10 07:23:49 +0000 | [diff] [blame] | 228 | return true; | 
|  | 229 | } else if (auto reboot_task = task->AsRebootTask()) { | 
| Daniel Zheng | 1fff690 | 2023-08-24 09:47:43 -0700 | [diff] [blame] | 230 | if (reboot_task->GetTarget() == "fastboot") { | 
|  | 231 | return true; | 
|  | 232 | } | 
| Daniel Zheng | 29a211c | 2023-03-10 07:23:49 +0000 | [diff] [blame] | 233 | } | 
|  | 234 | return false; | 
|  | 235 | }; | 
| Daniel Zheng | 1fff690 | 2023-08-24 09:47:43 -0700 | [diff] [blame] | 236 |  | 
| Daniel Zheng | 29a211c | 2023-03-10 07:23:49 +0000 | [diff] [blame] | 237 | tasks.erase(std::remove_if(tasks.begin(), tasks.end(), remove_if_callback), tasks.end()); | 
|  | 238 |  | 
| Daniel Zheng | 3e04857 | 2023-06-21 15:21:06 -0700 | [diff] [blame] | 239 | return std::make_unique<OptimizedFlashSuperTask>(super_name, std::move(helper), std::move(s), | 
|  | 240 | partition_size, fp); | 
| Daniel Zheng | 29a211c | 2023-03-10 07:23:49 +0000 | [diff] [blame] | 241 | } | 
|  | 242 |  | 
| Daniel Zheng | e6dbd4f | 2023-04-10 09:53:08 -0700 | [diff] [blame] | 243 | UpdateSuperTask::UpdateSuperTask(const FlashingPlan* fp) : fp_(fp) {} | 
| Daniel Zheng | 6bb8baa | 2023-03-03 07:14:23 +0000 | [diff] [blame] | 244 |  | 
|  | 245 | void UpdateSuperTask::Run() { | 
|  | 246 | unique_fd fd = fp_->source->OpenFile("super_empty.img"); | 
|  | 247 | if (fd < 0) { | 
|  | 248 | return; | 
|  | 249 | } | 
|  | 250 | if (!is_userspace_fastboot()) { | 
|  | 251 | reboot_to_userspace_fastboot(); | 
|  | 252 | } | 
|  | 253 |  | 
|  | 254 | std::string super_name; | 
|  | 255 | if (fp_->fb->GetVar("super-partition-name", &super_name) != fastboot::RetCode::SUCCESS) { | 
|  | 256 | super_name = "super"; | 
|  | 257 | } | 
|  | 258 | fp_->fb->Download(super_name, fd, get_file_size(fd)); | 
|  | 259 |  | 
|  | 260 | std::string command = "update-super:" + super_name; | 
|  | 261 | if (fp_->wants_wipe) { | 
|  | 262 | command += ":wipe"; | 
|  | 263 | } | 
|  | 264 | fp_->fb->RawCommand(command, "Updating super partition"); | 
|  | 265 | } | 
| Daniel Zheng | 1ef66b7 | 2023-08-24 15:44:56 -0700 | [diff] [blame] | 266 | std::string UpdateSuperTask::ToString() const { | 
| Daniel Zheng | 665a460 | 2023-06-05 11:24:59 -0700 | [diff] [blame] | 267 | return "update-super"; | 
|  | 268 | } | 
| Daniel Zheng | 9f7bf7e | 2023-03-03 07:16:46 +0000 | [diff] [blame] | 269 |  | 
| Daniel Zheng | e6dbd4f | 2023-04-10 09:53:08 -0700 | [diff] [blame] | 270 | ResizeTask::ResizeTask(const FlashingPlan* fp, const std::string& pname, const std::string& size, | 
| Daniel Zheng | 9f7bf7e | 2023-03-03 07:16:46 +0000 | [diff] [blame] | 271 | const std::string& slot) | 
|  | 272 | : fp_(fp), pname_(pname), size_(size), slot_(slot) {} | 
|  | 273 |  | 
|  | 274 | void ResizeTask::Run() { | 
|  | 275 | auto resize_partition = [this](const std::string& partition) -> void { | 
|  | 276 | if (is_logical(partition)) { | 
|  | 277 | fp_->fb->ResizePartition(partition, size_); | 
|  | 278 | } | 
|  | 279 | }; | 
|  | 280 | do_for_partitions(pname_, slot_, resize_partition, false); | 
|  | 281 | } | 
| Daniel Zheng | aa70f4c | 2023-03-07 18:59:51 +0000 | [diff] [blame] | 282 |  | 
| Daniel Zheng | 1ef66b7 | 2023-08-24 15:44:56 -0700 | [diff] [blame] | 283 | std::string ResizeTask::ToString() const { | 
| Daniel Zheng | 665a460 | 2023-06-05 11:24:59 -0700 | [diff] [blame] | 284 | return "resize " + pname_; | 
|  | 285 | } | 
|  | 286 |  | 
| Daniel Zheng | e6dbd4f | 2023-04-10 09:53:08 -0700 | [diff] [blame] | 287 | DeleteTask::DeleteTask(const FlashingPlan* fp, const std::string& pname) : fp_(fp), pname_(pname){}; | 
| Daniel Zheng | aa70f4c | 2023-03-07 18:59:51 +0000 | [diff] [blame] | 288 |  | 
|  | 289 | void DeleteTask::Run() { | 
|  | 290 | fp_->fb->DeletePartition(pname_); | 
| Daniel Zheng | 15e7783 | 2023-03-13 17:09:43 +0000 | [diff] [blame] | 291 | } | 
|  | 292 |  | 
| Daniel Zheng | 1ef66b7 | 2023-08-24 15:44:56 -0700 | [diff] [blame] | 293 | std::string DeleteTask::ToString() const { | 
| Daniel Zheng | 665a460 | 2023-06-05 11:24:59 -0700 | [diff] [blame] | 294 | return "delete " + pname_; | 
|  | 295 | } | 
|  | 296 |  | 
| Daniel Zheng | e6dbd4f | 2023-04-10 09:53:08 -0700 | [diff] [blame] | 297 | WipeTask::WipeTask(const FlashingPlan* fp, const std::string& pname) : fp_(fp), pname_(pname){}; | 
| Daniel Zheng | 15e7783 | 2023-03-13 17:09:43 +0000 | [diff] [blame] | 298 |  | 
|  | 299 | void WipeTask::Run() { | 
|  | 300 | std::string partition_type; | 
|  | 301 | if (fp_->fb->GetVar("partition-type:" + pname_, &partition_type) != fastboot::SUCCESS) { | 
| Daniel Zheng | 6f213b2 | 2023-03-28 22:47:04 +0000 | [diff] [blame] | 302 | LOG(ERROR) << "wipe task partition not found: " << pname_; | 
| Daniel Zheng | 15e7783 | 2023-03-13 17:09:43 +0000 | [diff] [blame] | 303 | return; | 
|  | 304 | } | 
|  | 305 | if (partition_type.empty()) return; | 
| Daniel Zheng | 6f213b2 | 2023-03-28 22:47:04 +0000 | [diff] [blame] | 306 | if (fp_->fb->Erase(pname_) != fastboot::SUCCESS) { | 
|  | 307 | LOG(ERROR) << "wipe task erase failed with partition: " << pname_; | 
|  | 308 | return; | 
|  | 309 | } | 
| Daniel Zheng | 5769b26 | 2023-06-21 14:41:11 -0700 | [diff] [blame] | 310 | fb_perform_format(pname_, 1, partition_type, "", fp_->fs_options, fp_); | 
| Daniel Zheng | 15e7783 | 2023-03-13 17:09:43 +0000 | [diff] [blame] | 311 | } | 
| Daniel Zheng | 665a460 | 2023-06-05 11:24:59 -0700 | [diff] [blame] | 312 |  | 
| Daniel Zheng | 1ef66b7 | 2023-08-24 15:44:56 -0700 | [diff] [blame] | 313 | std::string WipeTask::ToString() const { | 
| Daniel Zheng | 665a460 | 2023-06-05 11:24:59 -0700 | [diff] [blame] | 314 | return "erase " + pname_; | 
|  | 315 | } |