diff options
author | 2023-03-07 16:32:37 +0000 | |
---|---|---|
committer | 2023-03-07 16:32:37 +0000 | |
commit | 7fc9ab84e3aeb1c11bb7e44b7b84e3629e07ff6c (patch) | |
tree | a77e3dac7d83eecfd686979c1d5917eb81755ec6 | |
parent | d8572a7ec58f177507571eed5831c1135f1e26f9 (diff) | |
parent | 37f86ed847645614bb139407efbd9b6ce694a3dd (diff) |
Merge "Try erofs when mounting OTA partitions." am: 0b6974be81 am: 699fa0400c am: 082b527108 am: 37f86ed847
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2469753
Change-Id: Ic2a470287ff607d0106b134cacdd993112b2594b
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | cmds/installd/otapreopt_chroot.cpp | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/cmds/installd/otapreopt_chroot.cpp b/cmds/installd/otapreopt_chroot.cpp index c62734a925..1b7acabf70 100644 --- a/cmds/installd/otapreopt_chroot.cpp +++ b/cmds/installd/otapreopt_chroot.cpp @@ -45,6 +45,10 @@ using android::base::StringPrintf; namespace android { namespace installd { +// We don't know the filesystem types of the partitions in the update package, +// so just try the possibilities one by one. +static constexpr std::array kTryMountFsTypes = {"ext4", "erofs"}; + static void CloseDescriptor(int fd) { if (fd >= 0) { int result = close(fd); @@ -82,6 +86,27 @@ static void DeactivateApexPackages() { } } +static bool TryMountWithFstypes(const char* block_device, const char* target) { + for (int i = 0; i < kTryMountFsTypes.size(); ++i) { + const char* fstype = kTryMountFsTypes[i]; + int mount_result = mount(block_device, target, fstype, MS_RDONLY, /* data */ nullptr); + if (mount_result == 0) { + return true; + } + if (errno == EINVAL && i < kTryMountFsTypes.size() - 1) { + // Only try the next fstype if mounting failed due to the current one + // being invalid. + LOG(WARNING) << "Failed to mount " << block_device << " on " << target << " with " + << fstype << " - trying " << kTryMountFsTypes[i + 1]; + } else { + PLOG(ERROR) << "Failed to mount " << block_device << " on " << target << " with " + << fstype; + return false; + } + } + __builtin_unreachable(); +} + static void TryExtraMount(const char* name, const char* slot, const char* target) { std::string partition_name = StringPrintf("%s%s", name, slot); @@ -91,12 +116,7 @@ static void TryExtraMount(const char* name, const char* slot, const char* target if (dm.GetState(partition_name) != dm::DmDeviceState::INVALID) { std::string path; if (dm.GetDmDevicePathByName(partition_name, &path)) { - int mount_result = mount(path.c_str(), - target, - "ext4", - MS_RDONLY, - /* data */ nullptr); - if (mount_result == 0) { + if (TryMountWithFstypes(path.c_str(), target)) { return; } } @@ -105,12 +125,7 @@ static void TryExtraMount(const char* name, const char* slot, const char* target // Fall back and attempt a direct mount. std::string block_device = StringPrintf("/dev/block/by-name/%s", partition_name.c_str()); - int mount_result = mount(block_device.c_str(), - target, - "ext4", - MS_RDONLY, - /* data */ nullptr); - UNUSED(mount_result); + (void)TryMountWithFstypes(block_device.c_str(), target); } // Entry for otapreopt_chroot. Expected parameters are: |