diff options
| author | Daniel Rosenberg <drosen@google.com> | 2018-10-05 01:31:18 +0000 |
|---|---|---|
| committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-10-05 01:31:18 +0000 |
| commit | ba1752008dd3f5f83e6b79c3bf9a6df325fd807c (patch) | |
| tree | 4fbd0a40ae232e92076fc8df4025b57180a0ab1a /Checkpoint.cpp | |
| parent | 1e1893812ccc6a5b2f5e73cbd91e76c054c358cf (diff) | |
| parent | d3992498556fb1dce783d9d5e59f38cad492a6c3 (diff) | |
Merge "Add checkpointing support for A/B updates"
Diffstat (limited to 'Checkpoint.cpp')
| -rw-r--r-- | Checkpoint.cpp | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/Checkpoint.cpp b/Checkpoint.cpp index 995b7ba..1833733 100644 --- a/Checkpoint.cpp +++ b/Checkpoint.cpp @@ -27,6 +27,7 @@ #include <android-base/logging.h> #include <android-base/parseint.h> #include <android-base/unique_fd.h> +#include <android/hardware/boot/1.0/IBootControl.h> #include <cutils/android_reboot.h> #include <fcntl.h> #include <fs_mgr.h> @@ -35,6 +36,11 @@ #include <sys/mount.h> #include <sys/stat.h> +using android::hardware::hidl_string; +using android::hardware::boot::V1_0::BoolResult; +using android::hardware::boot::V1_0::IBootControl; +using android::hardware::boot::V1_0::Slot; + namespace android { namespace vold { @@ -61,6 +67,14 @@ bool setBowState(std::string const& block_device, std::string const& state) { bool cp_startCheckpoint(int retry) { if (retry < -1) return false; std::string content = std::to_string(retry); + if (retry == -1) { + sp<IBootControl> module = IBootControl::getService(); + if (module) { + std::string suffix; + auto cb = [&suffix](hidl_string s) { suffix = s; }; + if (module->getSuffix(module->getCurrentSlot(), cb).isOk()) content += " " + suffix; + } + } return android::base::WriteStringToFile(content, kMetadataCPFile); } @@ -100,19 +114,35 @@ void cp_abortChanges() { android_reboot(ANDROID_RB_RESTART2, 0, nullptr); } -bool cp_needRollback(const std::string& id) { +bool cp_needsRollback() { std::string content; bool ret; ret = android::base::ReadFileToString(kMetadataCPFile, &content); - if (ret) return content == "0"; + if (ret) { + if (content == "0") return true; + if (content.substr(0, 3) == "-1 ") { + std::string oldSuffix = content.substr(3); + sp<IBootControl> module = IBootControl::getService(); + std::string newSuffix; + + if (module) { + auto cb = [&newSuffix](hidl_string s) { newSuffix = s; }; + module->getSuffix(module->getCurrentSlot(), cb); + if (oldSuffix == newSuffix) return true; + } + } + } return false; } bool cp_needsCheckpoint(void) { bool ret; std::string content; + sp<IBootControl> module = IBootControl::getService(); + if (module && module->isSlotMarkedSuccessful(module->getCurrentSlot()) == BoolResult::FALSE) + return true; ret = android::base::ReadFileToString(kMetadataCPFile, &content); if (ret) return content != "0"; return false; @@ -294,8 +324,9 @@ bool cp_markBootAttempt() { std::string oldContent, newContent; int retry = 0; if (!android::base::ReadFileToString(kMetadataCPFile, &oldContent)) return false; + std::string retryContent = oldContent.substr(0, oldContent.find_first_of(" ")); - if (!android::base::ParseInt(oldContent, &retry)) return false; + if (!android::base::ParseInt(retryContent, &retry)) return false; if (retry > 0) retry--; newContent = std::to_string(retry); |
