diff options
author | David Anderson <dvander@google.com> | 2020-06-19 20:04:54 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-06-19 20:04:54 +0000 |
commit | 20d78e332348feccbb2e59d482b0049f3fca313c (patch) | |
tree | d2f835faf0028008deea071b4f338a0532035430 | |
parent | 5062ea0564ff1425d876a0aac5ea74520c82a2be (diff) | |
parent | 9aeae82f69ebb93ff0f6bd0e58f37d1d6b1dbac2 (diff) | |
download | core-20d78e332348feccbb2e59d482b0049f3fca313c.tar.gz |
Merge "remount: Do not allow remounting during checkpoints." into rvc-dev
-rw-r--r-- | fs_mgr/Android.bp | 3 | ||||
-rw-r--r-- | fs_mgr/fs_mgr_remount.cpp | 37 |
2 files changed, 40 insertions, 0 deletions
diff --git a/fs_mgr/Android.bp b/fs_mgr/Android.bp index f5daf9174..cd6459989 100644 --- a/fs_mgr/Android.bp +++ b/fs_mgr/Android.bp @@ -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", diff --git a/fs_mgr/fs_mgr_remount.cpp b/fs_mgr/fs_mgr_remount.cpp index 24cbad7c9..def1c2178 100644 --- a/fs_mgr/fs_mgr_remount.cpp +++ b/fs_mgr/fs_mgr_remount.cpp @@ -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; + static int do_remount(int argc, char* argv[]) { enum { SUCCESS = 0, @@ -118,6 +136,9 @@ static int do_remount(int argc, char* argv[]) { BAD_OVERLAY, NO_MOUNTS, REMOUNT_FAILED, + MUST_REBOOT, + BINDER_ERROR, + CHECKPOINTING } retval = SUCCESS; // If somehow this executable is delivered on a "user" build, it can @@ -191,6 +212,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); |