diff options
author | David Anderson <dvander@google.com> | 2018-10-31 22:48:28 +0100 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2018-10-31 22:48:28 +0100 |
commit | 1f9cf242abe142be0610dbd5d6e7f11436ae3322 (patch) | |
tree | 1756dfdd6ac3fa71e456a4d903a1659441d2a949 /roots.cpp | |
parent | Import translations. DO NOT MERGE (diff) | |
parent | Merge "recovery: Fix mounting /system with dynamic partitions." am: 023807fcf7 (diff) | |
download | android_bootable_recovery-1f9cf242abe142be0610dbd5d6e7f11436ae3322.tar android_bootable_recovery-1f9cf242abe142be0610dbd5d6e7f11436ae3322.tar.gz android_bootable_recovery-1f9cf242abe142be0610dbd5d6e7f11436ae3322.tar.bz2 android_bootable_recovery-1f9cf242abe142be0610dbd5d6e7f11436ae3322.tar.lz android_bootable_recovery-1f9cf242abe142be0610dbd5d6e7f11436ae3322.tar.xz android_bootable_recovery-1f9cf242abe142be0610dbd5d6e7f11436ae3322.tar.zst android_bootable_recovery-1f9cf242abe142be0610dbd5d6e7f11436ae3322.zip |
Diffstat (limited to 'roots.cpp')
-rw-r--r-- | roots.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
@@ -38,10 +38,12 @@ #include <cryptfs.h> #include <ext4_utils/wipe.h> #include <fs_mgr.h> +#include <fs_mgr_dm_linear.h> #include "otautil/mounts.h" static struct fstab* fstab = nullptr; +static bool did_map_logical_partitions = false; extern struct selabel_handle* sehandle; @@ -117,6 +119,25 @@ int ensure_path_mounted_at(const char* path, const char* mount_point) { mount_point = v->mount_point; } + // If we can't acquire the block device for a logical partition, it likely + // was never created. In that case we try to create it. + if (fs_mgr_is_logical(v) && !fs_mgr_update_logical_partition(v)) { + if (did_map_logical_partitions) { + LOG(ERROR) << "Failed to find block device for partition"; + return -1; + } + std::string super_name = fs_mgr_get_super_partition_name(); + if (!android::fs_mgr::CreateLogicalPartitions(super_name)) { + LOG(ERROR) << "Failed to create logical partitions"; + return -1; + } + did_map_logical_partitions = true; + if (!fs_mgr_update_logical_partition(v)) { + LOG(ERROR) << "Failed to find block device for partition"; + return -1; + } + } + const MountedVolume* mv = find_mounted_volume_by_mount_point(mount_point); if (mv != nullptr) { // Volume is already mounted. @@ -387,3 +408,7 @@ int setup_install_mounts() { } return 0; } + +bool logical_partitions_mapped() { + return did_map_logical_partitions; +} |