diff --git a/fs_mgr/libsnapshot/include/libsnapshot/mock_snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/mock_snapshot.h index 6dee3d43d..92e79107a 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/mock_snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/mock_snapshot.h @@ -47,6 +47,8 @@ class MockSnapshotManager : public ISnapshotManager { MOCK_METHOD(bool, CreateLogicalAndSnapshotPartitions, (const std::string& super_device, const std::chrono::milliseconds& timeout_ms), (override)); + MOCK_METHOD(bool, MapAllSnapshots, (const std::chrono::milliseconds& timeout_ms), (override)); + MOCK_METHOD(bool, UnmapAllSnapshots, (), (override)); MOCK_METHOD(bool, HandleImminentDataWipe, (const std::function& callback), (override)); MOCK_METHOD(bool, FinishMergeInRecovery, (), (override)); MOCK_METHOD(CreateResult, RecoveryCreateSnapshotDevices, (), (override)); diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index d81bbd075..35ed04a29 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -207,6 +207,14 @@ class ISnapshotManager { virtual bool CreateLogicalAndSnapshotPartitions( const std::string& super_device, const std::chrono::milliseconds& timeout_ms = {}) = 0; + // Map all snapshots. This is analogous to CreateLogicalAndSnapshotPartitions, except it maps + // the target slot rather than the current slot. It should only be used immediately after + // applying an update, before rebooting to the new slot. + virtual bool MapAllSnapshots(const std::chrono::milliseconds& timeout_ms = {}) = 0; + + // Unmap all snapshots. This should be called to undo MapAllSnapshots(). + virtual bool UnmapAllSnapshots() = 0; + // This method should be called preceding any wipe or flash of metadata or // userdata. It is only valid in recovery or fastbootd, and it ensures that // a merge has been completed. @@ -322,6 +330,8 @@ class SnapshotManager final : public ISnapshotManager { bool Dump(std::ostream& os) override; std::unique_ptr EnsureMetadataMounted() override; ISnapshotMergeStats* GetSnapshotMergeStatsInstance() override; + bool MapAllSnapshots(const std::chrono::milliseconds& timeout_ms = {}) override; + bool UnmapAllSnapshots() override; private: FRIEND_TEST(SnapshotTest, CleanFirstStageMount); diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stub.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stub.h index ed790a0f9..cba356005 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stub.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stub.h @@ -52,6 +52,8 @@ class SnapshotManagerStub : public ISnapshotManager { bool Dump(std::ostream& os) override; std::unique_ptr EnsureMetadataMounted() override; ISnapshotMergeStats* GetSnapshotMergeStatsInstance() override; + bool MapAllSnapshots(const std::chrono::milliseconds& timeout_ms) override; + bool UnmapAllSnapshots() override; }; } // namespace android::snapshot diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index c88c01a50..7061d5665 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -1945,6 +1945,16 @@ bool SnapshotManager::UnmapCowDevices(LockedFile* lock, const std::string& name) return true; } +bool SnapshotManager::MapAllSnapshots(const std::chrono::milliseconds&) { + LOG(ERROR) << "Not yet implemented."; + return false; +} + +bool SnapshotManager::UnmapAllSnapshots() { + LOG(ERROR) << "Not yet implemented."; + return false; +} + auto SnapshotManager::OpenFile(const std::string& file, int lock_flags) -> std::unique_ptr { unique_fd fd(open(file.c_str(), O_RDONLY | O_CLOEXEC | O_NOFOLLOW)); diff --git a/fs_mgr/libsnapshot/snapshot_stub.cpp b/fs_mgr/libsnapshot/snapshot_stub.cpp index 5be3c10c8..26b9129b8 100644 --- a/fs_mgr/libsnapshot/snapshot_stub.cpp +++ b/fs_mgr/libsnapshot/snapshot_stub.cpp @@ -136,4 +136,14 @@ std::unique_ptr SnapshotManagerStub::OpenSnapshotWriter( return nullptr; } +bool SnapshotManagerStub::MapAllSnapshots(const std::chrono::milliseconds&) { + LOG(ERROR) << __FUNCTION__ << " should never be called."; + return false; +} + +bool SnapshotManagerStub::UnmapAllSnapshots() { + LOG(ERROR) << __FUNCTION__ << " should never be called."; + return false; +} + } // namespace android::snapshot