diff options
author | David Anderson <dvander@google.com> | 2018-10-31 21:50:17 +0100 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2018-10-31 21:50:17 +0100 |
commit | e3f68144516ddc7c1c50d4082b5da59fd70e0f1d (patch) | |
tree | ebf4be0805c18d4bb9f450be8bfcd2742e16845b /roots.cpp | |
parent | Merge "Add description for the new translation" (diff) | |
parent | Merge "recovery: Fix mounting /system with dynamic partitions." (diff) | |
download | android_bootable_recovery-e3f68144516ddc7c1c50d4082b5da59fd70e0f1d.tar android_bootable_recovery-e3f68144516ddc7c1c50d4082b5da59fd70e0f1d.tar.gz android_bootable_recovery-e3f68144516ddc7c1c50d4082b5da59fd70e0f1d.tar.bz2 android_bootable_recovery-e3f68144516ddc7c1c50d4082b5da59fd70e0f1d.tar.lz android_bootable_recovery-e3f68144516ddc7c1c50d4082b5da59fd70e0f1d.tar.xz android_bootable_recovery-e3f68144516ddc7c1c50d4082b5da59fd70e0f1d.tar.zst android_bootable_recovery-e3f68144516ddc7c1c50d4082b5da59fd70e0f1d.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; +} |