From a9665ced57ebd3f00f11cd8d9d99b33269687286 Mon Sep 17 00:00:00 2001 From: Alessio Balsini Date: Mon, 9 Dec 2019 09:26:05 +0000 Subject: Mount snapshotted /system in Virtual A/B devices Mounting /system in Virtual A/B devices may require the creation of the associated snapshot devices. This patch performs all the required initializations prior to attempting the mount of /system. Bug: 139157327 Test: manual /system partition mount on VAB device during OTA Depends-on: I7337bdd38d7016d12d3ee42be1c7893b10e9116d Change-Id: I71a9dfc57e1a1354f1f1edc5d287aca93c0c8924 Signed-off-by: Alessio Balsini --- install/include/install/snapshot_utils.h | 9 +++++++++ install/snapshot_utils.cpp | 25 +++++++++++++++++++++++++ recovery.cpp | 7 +++++++ 3 files changed, 41 insertions(+) diff --git a/install/include/install/snapshot_utils.h b/install/include/install/snapshot_utils.h index 00c3ef7e1..f4b978d2e 100644 --- a/install/include/install/snapshot_utils.h +++ b/install/include/install/snapshot_utils.h @@ -19,3 +19,12 @@ #include "recovery_ui/device.h" bool FinishPendingSnapshotMerges(Device* device); + +/* + * This function tries to create the snapshotted devices in the case a Virtual + * A/B device is updating. + * The function returns false in case of critical failure that would prevent + * the further mountings of devices, or true in case of success, if either the + * devices were created or there was no need to. + */ +bool CreateSnapshotPartitions(); diff --git a/install/snapshot_utils.cpp b/install/snapshot_utils.cpp index 69da5eea0..7235e67c8 100644 --- a/install/snapshot_utils.cpp +++ b/install/snapshot_utils.cpp @@ -15,6 +15,7 @@ * limitations under the License. */ +#include #include #include @@ -22,6 +23,7 @@ #include "recovery_ui/ui.h" #include "recovery_utils/roots.h" +using android::snapshot::CreateResult; using android::snapshot::SnapshotManager; bool FinishPendingSnapshotMerges(Device* device) { @@ -47,3 +49,26 @@ bool FinishPendingSnapshotMerges(Device* device) { } return true; } + +bool CreateSnapshotPartitions() { + if (!android::base::GetBoolProperty("ro.virtual_ab.enabled", false)) { + // If the device does not support Virtual A/B, there's no need to create + // snapshot devices. + return true; + } + + auto sm = SnapshotManager::NewForFirstStageMount(); + if (!sm) { + // SnapshotManager could not be created. The device is still in a + // consistent state and can continue with the mounting of the existing + // devices, but cannot initialize snapshot devices. + LOG(WARNING) << "Could not create SnapshotManager"; + return true; + } + + auto ret = sm->RecoveryCreateSnapshotDevices(); + if (ret == CreateResult::ERROR) { + return false; + } + return true; +} diff --git a/recovery.cpp b/recovery.cpp index f59a940fc..e4b8e45fb 100644 --- a/recovery.cpp +++ b/recovery.cpp @@ -50,6 +50,7 @@ #include "install/fuse_install.h" #include "install/install.h" #include "install/package.h" +#include "install/snapshot_utils.h" #include "install/wipe_data.h" #include "install/wipe_device.h" #include "otautil/boot_state.h" @@ -437,7 +438,13 @@ static Device::BuiltinAction PromptAndWait(Device* device, InstallResult status) screen_ui->CheckBackgroundTextImages(); break; } + case Device::MOUNT_SYSTEM: + // For Virtual A/B, set up the snapshot devices (if exist). + if (!CreateSnapshotPartitions()) { + ui->Print("Virtual A/B: snapshot partitions creation failed.\n"); + break; + } if (ensure_path_mounted_at(android::fs_mgr::GetSystemRoot(), "/mnt/system") != -1) { ui->Print("Mounted /system.\n"); } -- cgit v1.2.3