From 71ab9dbebaa19a800b6fd64ea34432db900d570c Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 21 Jan 2021 20:13:35 -0800 Subject: [PATCH 1/2] libsnapshot: Do not attempt compression features in recovery. Test: adb sideload Change-Id: Ic69fc2f5c37a5d4fc0fcd0819ebf58e0249f7773 --- fs_mgr/libsnapshot/snapshot.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index b55d9a0b1..34c684c8b 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -2130,10 +2130,6 @@ bool SnapshotManager::UnmapCowDevices(LockedFile* lock, const std::string& name) bool SnapshotManager::UnmapDmUserDevice(const std::string& snapshot_name) { auto& dm = DeviceMapper::Instance(); - if (!EnsureSnapuserdConnected()) { - return false; - } - auto dm_user_name = GetDmUserCowName(snapshot_name); if (dm.GetState(dm_user_name) == DmDeviceState::INVALID) { return true; @@ -2144,6 +2140,9 @@ bool SnapshotManager::UnmapDmUserDevice(const std::string& snapshot_name) { return false; } + if (!EnsureSnapuserdConnected()) { + return false; + } if (!snapuserd_client_->WaitForDeviceDelete(dm_user_name)) { LOG(ERROR) << "Failed to wait for " << dm_user_name << " control device to delete"; return false; @@ -2585,8 +2584,9 @@ Return SnapshotManager::CreateUpdateSnapshots(const DeltaArchiveManifest& manife // these devices. AutoDeviceList created_devices; - bool use_compression = - IsCompressionEnabled() && manifest.dynamic_partition_metadata().vabc_enabled(); + bool use_compression = IsCompressionEnabled() && + manifest.dynamic_partition_metadata().vabc_enabled() && + !device_->IsRecovery(); PartitionCowCreator cow_creator{ .target_metadata = target_metadata.get(), From 5283ae4a86f003c029d020501473021c17f3b0ae Mon Sep 17 00:00:00 2001 From: David Anderson Date: Mon, 25 Jan 2021 13:52:16 -0800 Subject: [PATCH 2/2] libsnapshot: Only mount snapshots in MapAllSnapshots(). By accident, this was mounting partitions as well, which caused conflicts in partial updates where some partitions don't have snapshots. Test: update_device.py with partial OTA Change-Id: I2db0e6269f0a02cbe8164fa2a72b887c352f56d8 --- fs_mgr/libsnapshot/snapshot.cpp | 38 ++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 34c684c8b..932972576 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -2172,12 +2172,44 @@ bool SnapshotManager::MapAllSnapshots(const std::chrono::milliseconds& timeout_m return false; } - if (!UnmapAllSnapshots(lock.get())) { + std::vector snapshots; + if (!ListSnapshots(lock.get(), &snapshots)) { return false; } - uint32_t slot = SlotNumberForSlotSuffix(device_->GetOtherSlotSuffix()); - return MapAllPartitions(lock.get(), device_->GetSuperDevice(slot), slot, timeout_ms); + const auto& opener = device_->GetPartitionOpener(); + auto slot_suffix = device_->GetOtherSlotSuffix(); + auto slot_number = SlotNumberForSlotSuffix(slot_suffix); + auto super_device = device_->GetSuperDevice(slot_number); + auto metadata = android::fs_mgr::ReadMetadata(opener, super_device, slot_number); + if (!metadata) { + LOG(ERROR) << "MapAllSnapshots could not read dynamic partition metadata for device: " + << super_device; + return false; + } + + for (const auto& snapshot : snapshots) { + if (!UnmapPartitionWithSnapshot(lock.get(), snapshot)) { + LOG(ERROR) << "MapAllSnapshots could not unmap snapshot: " << snapshot; + return false; + } + + CreateLogicalPartitionParams params = { + .block_device = super_device, + .metadata = metadata.get(), + .partition_name = snapshot, + .partition_opener = &opener, + .timeout_ms = timeout_ms, + }; + if (!MapPartitionWithSnapshot(lock.get(), std::move(params), SnapshotContext::Mount, + nullptr)) { + LOG(ERROR) << "MapAllSnapshots failed to map: " << snapshot; + return false; + } + } + + LOG(INFO) << "MapAllSnapshots succeeded."; + return true; } bool SnapshotManager::UnmapAllSnapshots() {