From a841bd48f886bd66e859e0cea2e43514244ae23a Mon Sep 17 00:00:00 2001 From: Howard Chen Date: Wed, 8 Jan 2020 16:59:40 +0800 Subject: [PATCH] Refine the first stage mount for DSU * Open the ImageManager according to the saved DSU slot. * Load the saved install_dir when it presents. This is required when installing to an external storage and the current code seems to break it. * Remove an unnecessary C++ using. Test: gsi_tool install Bug: 144247097 Change-Id: I5b7be25787f235518a25abacefa612c33861f6ef --- fs_mgr/libfiemap/image_manager.cpp | 7 +++++++ init/first_stage_mount.cpp | 9 +++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/fs_mgr/libfiemap/image_manager.cpp b/fs_mgr/libfiemap/image_manager.cpp index baa5de430..6a8b46e06 100644 --- a/fs_mgr/libfiemap/image_manager.cpp +++ b/fs_mgr/libfiemap/image_manager.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include "metadata.h" #include "utility.h" @@ -34,6 +35,7 @@ namespace android { namespace fiemap { using namespace std::literals; +using android::base::ReadFileToString; using android::base::unique_fd; using android::dm::DeviceMapper; using android::dm::DmDeviceState; @@ -53,6 +55,11 @@ static constexpr char kTestImageMetadataDir[] = "/metadata/gsi/test"; std::unique_ptr ImageManager::Open(const std::string& dir_prefix) { auto metadata_dir = "/metadata/gsi/" + dir_prefix; auto data_dir = "/data/gsi/" + dir_prefix; + auto install_dir_file = gsi::DsuInstallDirFile(gsi::GetDsuSlot(dir_prefix)); + std::string path; + if (ReadFileToString(install_dir_file, &path)) { + data_dir = path; + } return Open(metadata_dir, data_dir); } diff --git a/init/first_stage_mount.cpp b/init/first_stage_mount.cpp index e5e99e1e4..dccd23c44 100644 --- a/init/first_stage_mount.cpp +++ b/init/first_stage_mount.cpp @@ -58,7 +58,6 @@ using android::fs_mgr::ReadDefaultFstab; using android::fs_mgr::ReadFstabFromDt; using android::fs_mgr::SkipMountingPartitions; using android::fs_mgr::TransformFstabForDsu; -using android::init::WriteFile; using android::snapshot::SnapshotManager; using namespace std::literals; @@ -612,7 +611,13 @@ void FirstStageMount::UseDsuIfPresent() { } return InitRequiredDevices(std::move(devices)); }; - auto images = IImageManager::Open("dsu", 0ms); + std::string active_dsu; + if (!gsi::GetActiveDsu(&active_dsu)) { + LOG(ERROR) << "Failed to GetActiveDsu"; + return; + } + LOG(INFO) << "DSU slot: " << active_dsu; + auto images = IImageManager::Open("dsu/" + active_dsu, 0ms); if (!images || !images->MapAllImages(init_devices)) { LOG(ERROR) << "DSU partition layout could not be instantiated"; return;