remount: Check device mapper to see if verity is already disabled
No matter verity is enabled or disabled, androidboot.veritymode is
always "enforcing" on emulator kernel cmdline.
This is a violation of the AVB contract:
https://cs.android.com/android/platform/superproject/+/master:external/avb/README.md#handling-dm-verity-errors
Before emulator can fix this, workaround this by checking the device
mapper table to see if verity is disabled or not.
If no "<partition>-verity" device is present, than assume verity is
already disabled.
Also log mountpoints that are successfully remounted.
Bug: 241688845
Bug: 259207493
Test: adb-remount-test
Test: Run adb remount on emulator
Change-Id: Id5767b05cbfb48adf2a8c372dfdad4d15b98e091
diff --git a/fs_mgr/fs_mgr_remount.cpp b/fs_mgr/fs_mgr_remount.cpp
index c5567f9..3f14d6a 100644
--- a/fs_mgr/fs_mgr_remount.cpp
+++ b/fs_mgr/fs_mgr_remount.cpp
@@ -386,16 +386,15 @@
}
// Now remount!
- if (::mount(blk_device.c_str(), mount_point.c_str(), entry.fs_type.c_str(), MS_REMOUNT,
- nullptr) == 0) {
- 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,
+ for (const auto& mnt_point : {mount_point, entry.mount_point}) {
+ if (::mount(blk_device.c_str(), mnt_point.c_str(), entry.fs_type.c_str(), MS_REMOUNT,
nullptr) == 0) {
+ LOG(INFO) << "Remounted " << mnt_point << " as RW";
return true;
}
+ if (errno != EINVAL || mount_point == entry.mount_point) {
+ break;
+ }
}
PLOG(ERROR) << "failed to remount partition dev:" << blk_device << " mnt:" << mount_point;
@@ -484,8 +483,16 @@
return false;
}
if (verity_result.want_reboot) {
- check_result->reboot_later = true;
- check_result->disabled_verity = true;
+ // TODO(b/259207493): emulator has incorrect androidboot.veritymode value, causing
+ // .want_reboot to always be true. In order to workaround this, double check device mapper
+ // to see if verity is already disabled.
+ for (const auto& partition : partitions) {
+ if (fs_mgr_is_verity_enabled(partition)) {
+ check_result->reboot_later = true;
+ check_result->disabled_verity = true;
+ break;
+ }
+ }
}
// Optionally setup overlayfs backing.
@@ -660,10 +667,10 @@
} else if (check_result.setup_overlayfs) {
LOG(INFO) << "Overlayfs enabled.";
}
- if (remount_success) {
- LOG(INFO) << "remount succeeded";
- } else {
- LOG(ERROR) << "remount failed";
+ if (remount_success && check_result.remounted_anything) {
+ LOG(INFO) << "Remount succeeded";
+ } else if (!remount_success) {
+ LOG(ERROR) << "Remount failed";
}
if (check_result.reboot_later) {
if (auto_reboot) {