recovery: Fix mounting /system with dynamic partitions.
When using dynamic partitions, the blk_device field in fstab_rec must be translated to a /dev/block/dm-N node with fs_mgr_update_logical_partition. However, init will not have created these nodes to begin with since CreateLogicalPartitions is not called in recovery. This patch addresses both issues. Note that flashing system through fastbootd will not work while /system is mounted. Bug: 118634720 Test: manual test Change-Id: I06c83309d09eab6b65245b1ed10c51d05398f23e
This commit is contained in:
parent
d84d570d8c
commit
2b2f423ef6
3 changed files with 34 additions and 2 deletions
|
@ -478,8 +478,13 @@ int main(int argc, char** argv) {
|
|||
break;
|
||||
|
||||
case Device::ENTER_FASTBOOT:
|
||||
LOG(INFO) << "Entering fastboot";
|
||||
fastboot = true;
|
||||
if (logical_partitions_mapped()) {
|
||||
ui->Print("Partitions may be mounted - rebooting to enter fastboot.");
|
||||
android::base::SetProperty(ANDROID_RB_PROPERTY, "reboot,fastboot");
|
||||
} else {
|
||||
LOG(INFO) << "Entering fastboot";
|
||||
fastboot = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case Device::ENTER_RECOVERY:
|
||||
|
|
25
roots.cpp
25
roots.cpp
|
@ -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;
|
||||
}
|
||||
|
|
2
roots.h
2
roots.h
|
@ -53,4 +53,6 @@ int format_volume(const char* volume, const char* directory);
|
|||
// mounted (/tmp and /cache) are mounted. Returns 0 on success.
|
||||
int setup_install_mounts();
|
||||
|
||||
bool logical_partitions_mapped();
|
||||
|
||||
#endif // RECOVERY_ROOTS_H_
|
||||
|
|
Loading…
Reference in a new issue