remount: Remove all remaining opaque exit code (RemountStatus enum)
All errors are already logged and the exit code is not used anywhere by
anyone.
Functions should instead return (true/false) or
(EXIT_SUCCESS/EXIT_FAILURE) to indicate error state, and log error
reasons to logd and stderr.
Bug: 241688845
Test: adb-remount-test
Change-Id: Iba86a814a75f81ed0f6e43659d1aca72813824bc
diff --git a/fs_mgr/fs_mgr_remount.cpp b/fs_mgr/fs_mgr_remount.cpp
index fac189c..c5567f9 100644
--- a/fs_mgr/fs_mgr_remount.cpp
+++ b/fs_mgr/fs_mgr_remount.cpp
@@ -139,19 +139,6 @@
}
}
-enum RemountStatus {
- REMOUNT_SUCCESS = 0,
- UNKNOWN_PARTITION = 5,
- INVALID_PARTITION,
- VERITY_PARTITION,
- BAD_OVERLAY,
- NO_MOUNTS,
- REMOUNT_FAILED,
- BINDER_ERROR,
- CHECKPOINTING,
- GSID_ERROR,
-};
-
static bool ReadFstab(const char* fstab_file, android::fs_mgr::Fstab* fstab) {
if (fstab_file) {
return android::fs_mgr::ReadFstabFromFile(fstab_file, fstab);
@@ -172,10 +159,10 @@
return true;
}
-static RemountStatus VerifyCheckpointing() {
+bool VerifyCheckpointing() {
if (!android::base::GetBoolProperty("ro.virtual_ab.enabled", false) &&
!android::base::GetBoolProperty("ro.virtual_ab.retrofit", false)) {
- return REMOUNT_SUCCESS;
+ return true;
}
// Virtual A/B devices can use /data as backing storage; make sure we're
@@ -184,13 +171,13 @@
bool checkpointing = false;
if (!vold->isCheckpointing(&checkpointing).isOk()) {
LOG(ERROR) << "Could not determine checkpointing status.";
- return BINDER_ERROR;
+ return false;
}
if (checkpointing) {
LOG(ERROR) << "Cannot use remount when a checkpoint is in progress.";
- return CHECKPOINTING;
+ return false;
}
- return REMOUNT_SUCCESS;
+ return true;
}
static bool IsRemountable(Fstab& candidates, const FstabEntry& entry) {
@@ -247,8 +234,7 @@
return partitions;
}
-static RemountStatus GetRemountList(const Fstab& fstab, const std::vector<std::string>& argv,
- Fstab* partitions) {
+bool GetRemountList(const Fstab& fstab, const std::vector<std::string>& argv, Fstab* partitions) {
auto candidates = fs_mgr_overlayfs_candidate_list(fstab);
for (const auto& arg : argv) {
@@ -260,7 +246,7 @@
auto it = FindPartition(fstab, partition);
if (it == fstab.end()) {
LOG(ERROR) << "Unknown partition " << arg;
- return UNKNOWN_PARTITION;
+ return false;
}
const FstabEntry* entry = &*it;
@@ -275,7 +261,7 @@
if (!fs_mgr_overlayfs_already_mounted(entry->mount_point) &&
!IsRemountable(candidates, *entry)) {
LOG(ERROR) << "Invalid partition " << arg;
- return INVALID_PARTITION;
+ return false;
}
if (GetEntryForMountPoint(partitions, entry->mount_point) != nullptr) {
continue;
@@ -283,7 +269,7 @@
partitions->emplace_back(*entry);
}
- return REMOUNT_SUCCESS;
+ return true;
}
struct RemountCheckResult {
@@ -294,8 +280,8 @@
bool remounted_anything = false;
};
-RemountStatus CheckOverlayfs(Fstab* partitions, RemountCheckResult* result) {
- RemountStatus status = REMOUNT_SUCCESS;
+bool CheckOverlayfs(Fstab* partitions, RemountCheckResult* result) {
+ bool ok = true;
for (auto it = partitions->begin(); it != partitions->end();) {
auto& entry = *it;
const auto& mount_point = entry.mount_point;
@@ -305,7 +291,7 @@
bool force = result->disabled_verity;
if (!fs_mgr_overlayfs_setup(mount_point.c_str(), &want_reboot, force)) {
LOG(ERROR) << "Overlayfs setup for " << mount_point << " failed, skipping";
- status = BAD_OVERLAY;
+ ok = false;
it = partitions->erase(it);
continue;
}
@@ -317,45 +303,48 @@
}
it++;
}
- return status;
+ return ok;
}
-static RemountStatus EnableDsuIfNeeded() {
+bool EnableDsuIfNeeded() {
auto gsid = android::gsi::GetGsiService();
if (!gsid) {
- return REMOUNT_SUCCESS;
+ return true;
}
auto dsu_running = false;
if (auto status = gsid->isGsiRunning(&dsu_running); !status.isOk()) {
LOG(ERROR) << "Failed to get DSU running state: " << status;
- return BINDER_ERROR;
+ return false;
}
auto dsu_enabled = false;
if (auto status = gsid->isGsiEnabled(&dsu_enabled); !status.isOk()) {
LOG(ERROR) << "Failed to get DSU enabled state: " << status;
- return BINDER_ERROR;
+ return false;
}
if (dsu_running && !dsu_enabled) {
std::string dsu_slot;
if (auto status = gsid->getActiveDsuSlot(&dsu_slot); !status.isOk()) {
LOG(ERROR) << "Failed to get active DSU slot: " << status;
- return BINDER_ERROR;
+ return false;
}
LOG(INFO) << "DSU is running but disabled, enable DSU so that we stay within the "
"DSU guest system after reboot";
int error = 0;
- if (auto status = gsid->enableGsi(/* oneShot = */ true, dsu_slot, &error);
- !status.isOk() || error != android::gsi::IGsiService::INSTALL_OK) {
- LOG(ERROR) << "Failed to enable DSU: " << status << ", error code: " << error;
- return !status.isOk() ? BINDER_ERROR : GSID_ERROR;
+ if (auto status = gsid->enableGsi(/* oneShot = */ true, dsu_slot, &error); !status.isOk()) {
+ LOG(ERROR) << "Failed to enable DSU: " << status;
+ return false;
+ }
+ if (error != android::gsi::IGsiService::INSTALL_OK) {
+ LOG(ERROR) << "Failed to enable DSU, error code: " << error;
+ return false;
}
LOG(INFO) << "Successfully enabled DSU (one-shot mode)";
}
- return REMOUNT_SUCCESS;
+ return true;
}
-static RemountStatus RemountPartition(Fstab& fstab, Fstab& mounts, FstabEntry& entry) {
+bool RemountPartition(Fstab& fstab, Fstab& mounts, FstabEntry& entry) {
// unlock the r/o key for the mount point device
if (entry.fs_mgr_flags.logical) {
fs_mgr_update_logical_partition(&entry);
@@ -382,7 +371,7 @@
}
if (!found) {
PLOG(INFO) << "skip unmounted partition dev:" << blk_device << " mnt:" << mount_point;
- return REMOUNT_SUCCESS;
+ return true;
}
if (blk_device == "/dev/root") {
auto from_fstab = GetEntryForMountPoint(&fstab, mount_point);
@@ -399,18 +388,18 @@
// Now remount!
if (::mount(blk_device.c_str(), mount_point.c_str(), entry.fs_type.c_str(), MS_REMOUNT,
nullptr) == 0) {
- return REMOUNT_SUCCESS;
+ return true;
}
if ((errno == EINVAL) && (mount_point != entry.mount_point)) {
mount_point = entry.mount_point;
if (::mount(blk_device.c_str(), mount_point.c_str(), entry.fs_type.c_str(), MS_REMOUNT,
nullptr) == 0) {
- return REMOUNT_SUCCESS;
+ return true;
}
}
PLOG(ERROR) << "failed to remount partition dev:" << blk_device << " mnt:" << mount_point;
- return REMOUNT_FAILED;
+ return false;
}
struct SetVerityStateResult {
@@ -478,21 +467,21 @@
return want_reboot;
}
-static int do_remount(Fstab& fstab, const std::vector<std::string>& partition_args,
- RemountCheckResult* check_result) {
+bool do_remount(Fstab& fstab, const std::vector<std::string>& partition_args,
+ RemountCheckResult* check_result) {
Fstab partitions;
if (partition_args.empty()) {
partitions = GetAllRemountablePartitions(fstab);
} else {
- if (auto rv = GetRemountList(fstab, partition_args, &partitions); rv != REMOUNT_SUCCESS) {
- return rv;
+ if (!GetRemountList(fstab, partition_args, &partitions)) {
+ return false;
}
}
// Disable verity.
auto verity_result = SetVerityState(false /* enable_verity */);
if (!verity_result.success) {
- return VERITY_PARTITION;
+ return false;
}
if (verity_result.want_reboot) {
check_result->reboot_later = true;
@@ -500,13 +489,13 @@
}
// Optionally setup overlayfs backing.
- auto retval = CheckOverlayfs(&partitions, check_result);
+ bool ok = CheckOverlayfs(&partitions, check_result);
if (partitions.empty() || check_result->disabled_verity) {
if (partitions.empty()) {
LOG(WARNING) << "No remountable partitions were found.";
}
- return retval;
+ return ok;
}
// Mount overlayfs.
@@ -519,18 +508,18 @@
android::fs_mgr::Fstab mounts;
if (!android::fs_mgr::ReadFstabFromFile("/proc/mounts", &mounts) || mounts.empty()) {
PLOG(ERROR) << "Failed to read /proc/mounts";
- return NO_MOUNTS;
+ return false;
}
// Remount selected partitions.
for (auto& entry : partitions) {
- if (auto rv = RemountPartition(fstab, mounts, entry); rv != REMOUNT_SUCCESS) {
- retval = rv;
- } else {
+ if (RemountPartition(fstab, mounts, entry)) {
check_result->remounted_anything = true;
+ } else {
+ ok = false;
}
}
- return retval;
+ return ok;
}
} // namespace
@@ -540,7 +529,7 @@
// are discarded.
if (argc > 0 && android::base::Basename(argv[0]) == "clean_scratch_files"s) {
android::fs_mgr::CleanupOldScratchFiles();
- return 0;
+ return EXIT_SUCCESS;
}
android::base::InitLogging(argv, MyLogger(false /* verbose */));
@@ -561,7 +550,7 @@
switch (opt) {
case 'h':
usage();
- return 0;
+ return EXIT_SUCCESS;
case 'R':
auto_reboot = true;
break;
@@ -569,7 +558,7 @@
if (fstab_file) {
LOG(ERROR) << "Cannot supply two fstabs: -T " << fstab_file << " -T " << optarg;
usage();
- return 1;
+ return EXIT_FAILURE;
}
fstab_file = optarg;
break;
@@ -579,7 +568,7 @@
default:
LOG(ERROR) << "Bad argument -" << char(opt);
usage();
- return 1;
+ return EXIT_FAILURE;
}
}
@@ -599,7 +588,7 @@
enable_verity = (argv[optind] == "1"s);
} else {
usage();
- return 1;
+ return EXIT_FAILURE;
}
} else {
remount = true;
@@ -611,7 +600,7 @@
// Make sure we are root.
if (::getuid() != 0) {
LOG(ERROR) << "Not running as root. Try \"adb root\" first.";
- return 1;
+ return EXIT_FAILURE;
}
// If somehow this executable is delivered on a "user" build, it can
@@ -619,12 +608,12 @@
// letting if fall through and provide a lot of confusing failure messages.
if (!ALLOW_ADBD_DISABLE_VERITY || !android::base::GetBoolProperty("ro.debuggable", false)) {
LOG(ERROR) << "Device must be userdebug build";
- return 1;
+ return EXIT_FAILURE;
}
if (android::base::GetProperty("ro.boot.verifiedbootstate", "") != "orange") {
LOG(ERROR) << "Device must be bootloader unlocked";
- return 1;
+ return EXIT_FAILURE;
}
// Start a threadpool to service waitForService() callbacks as
@@ -646,23 +635,23 @@
}
std::cout << "Reboot the device for new settings to take effect" << std::endl;
}
- return ret.success ? 0 : 1;
+ return ret.success ? EXIT_SUCCESS : EXIT_FAILURE;
}
// Make sure checkpointing is disabled if necessary.
- if (auto rv = VerifyCheckpointing(); rv != REMOUNT_SUCCESS) {
- return rv;
+ if (!VerifyCheckpointing()) {
+ return EXIT_FAILURE;
}
// Read the selected fstab.
Fstab fstab;
if (!ReadFstab(fstab_file, &fstab) || fstab.empty()) {
PLOG(ERROR) << "Failed to read fstab";
- return 1;
+ return EXIT_FAILURE;
}
RemountCheckResult check_result;
- int result = do_remount(fstab, partition_args, &check_result);
+ bool remount_success = do_remount(fstab, partition_args, &check_result);
if (check_result.disabled_verity && check_result.setup_overlayfs) {
LOG(INFO) << "Verity disabled; overlayfs enabled.";
@@ -671,7 +660,7 @@
} else if (check_result.setup_overlayfs) {
LOG(INFO) << "Overlayfs enabled.";
}
- if (result == REMOUNT_SUCCESS) {
+ if (remount_success) {
LOG(INFO) << "remount succeeded";
} else {
LOG(ERROR) << "remount failed";
@@ -682,15 +671,15 @@
// running a DSU guest and (3) DSU is disabled, then enable DSU so that the
// next reboot would not take us back to the host system but stay within
// the guest system.
- if (auto rv = EnableDsuIfNeeded(); rv != REMOUNT_SUCCESS) {
+ if (!EnableDsuIfNeeded()) {
LOG(ERROR) << "Unable to automatically enable DSU";
- return rv;
+ return EXIT_FAILURE;
}
reboot("remount");
} else {
LOG(INFO) << "Now reboot your device for settings to take effect";
}
- return REMOUNT_SUCCESS;
+ return EXIT_SUCCESS;
}
- return result;
+ return remount_success ? EXIT_SUCCESS : EXIT_FAILURE;
}