summaryrefslogtreecommitdiff
path: root/Checkpoint.cpp
diff options
context:
space:
mode:
authorDaniel Rosenberg <drosen@google.com>2018-10-05 01:31:18 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2018-10-05 01:31:18 +0000
commitba1752008dd3f5f83e6b79c3bf9a6df325fd807c (patch)
tree4fbd0a40ae232e92076fc8df4025b57180a0ab1a /Checkpoint.cpp
parent1e1893812ccc6a5b2f5e73cbd91e76c054c358cf (diff)
parentd3992498556fb1dce783d9d5e59f38cad492a6c3 (diff)
Merge "Add checkpointing support for A/B updates"
Diffstat (limited to 'Checkpoint.cpp')
-rw-r--r--Checkpoint.cpp37
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);