remount: Do not allow remounting during checkpoints.

Bug: 157540389
Test: manual test
Change-Id: I5931a583e48ddac05f319629ae2f7f5f0f6cf032
This commit is contained in:
David Anderson 2020-06-10 23:50:02 -07:00
parent 1e03ef5ac9
commit 8696a5d11b
2 changed files with 40 additions and 1 deletions

View file

@ -162,10 +162,13 @@ cc_binary {
defaults: ["fs_mgr_defaults"],
static_libs: [
"libavb_user",
"libutils",
"libvold_binder",
],
shared_libs: [
"libbootloader_message",
"libbase",
"libbinder",
"libcutils",
"libcrypto",
"libext4_utils",

View file

@ -24,6 +24,7 @@
#include <unistd.h>
#include <string>
#include <thread>
#include <utility>
#include <vector>
@ -31,6 +32,8 @@
#include <android-base/logging.h>
#include <android-base/properties.h>
#include <android-base/strings.h>
#include <android/os/IVold.h>
#include <binder/IServiceManager.h>
#include <bootloader_message/bootloader_message.h>
#include <cutils/android_reboot.h>
#include <fec/io.h>
@ -103,8 +106,23 @@ void MyLogger(android::base::LogId id, android::base::LogSeverity severity, cons
::exit(0); // SUCCESS
}
static android::sp<android::os::IVold> GetVold() {
while (true) {
if (auto sm = android::defaultServiceManager()) {
if (auto binder = sm->getService(android::String16("vold"))) {
if (auto vold = android::interface_cast<android::os::IVold>(binder)) {
return vold;
}
}
}
std::this_thread::sleep_for(2s);
}
}
} // namespace
using namespace std::chrono_literals;
enum RemountStatus {
REMOUNT_SUCCESS = 0,
NOT_USERDEBUG,
@ -117,7 +135,9 @@ enum RemountStatus {
BAD_OVERLAY,
NO_MOUNTS,
REMOUNT_FAILED,
MUST_REBOOT
MUST_REBOOT,
BINDER_ERROR,
CHECKPOINTING
};
static int do_remount(int argc, char* argv[]) {
@ -194,6 +214,22 @@ static int do_remount(int argc, char* argv[]) {
return NO_FSTAB;
}
if (android::base::GetBoolProperty("ro.virtual_ab.enabled", false) &&
!android::base::GetBoolProperty("ro.virtual_ab.retrofit", false)) {
// Virtual A/B devices can use /data as backing storage; make sure we're
// not checkpointing.
auto vold = GetVold();
bool checkpointing = false;
if (!vold->isCheckpointing(&checkpointing).isOk()) {
LOG(ERROR) << "Could not determine checkpointing status.";
return BINDER_ERROR;
}
if (checkpointing) {
LOG(ERROR) << "Cannot use remount when a checkpoint is in progress.";
return CHECKPOINTING;
}
}
// Generate the list of supported overlayfs mount points.
auto overlayfs_candidates = fs_mgr_overlayfs_candidate_list(fstab);