From f71ad94e3737764a0a7fa2e041a2305d1fc10c40 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sun, 22 Nov 2020 00:15:45 -0800 Subject: [PATCH] libsnapshot: Add a compression bit to SnapshotUpdateStatus. This adds a compression bit to SnapshotUpdateStatus. This is so init can tell whether it needs to launch snapuserd, without reading the individual state of each snapshot, since this state is global. Bug: 173476209 Test: manual test Change-Id: I8c3bbfb0d184f70e661e7b043afc37e335d1e187 --- fs_mgr/libsnapshot/android/snapshot/snapshot.proto | 5 ++++- fs_mgr/libsnapshot/include/libsnapshot/snapshot.h | 4 ++++ fs_mgr/libsnapshot/snapshot.cpp | 11 ++++++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/fs_mgr/libsnapshot/android/snapshot/snapshot.proto b/fs_mgr/libsnapshot/android/snapshot/snapshot.proto index acb75d0d1..38c6bf893 100644 --- a/fs_mgr/libsnapshot/android/snapshot/snapshot.proto +++ b/fs_mgr/libsnapshot/android/snapshot/snapshot.proto @@ -118,7 +118,7 @@ enum UpdateState { Cancelled = 7; }; -// Next: 5 +// Next: 6 message SnapshotUpdateStatus { UpdateState state = 1; @@ -133,6 +133,9 @@ message SnapshotUpdateStatus { // Sectors allocated for metadata in all the snapshot devices. uint64 metadata_sectors = 4; + + // Whether compression/dm-user was used for any snapshots. + bool compression_enabled = 5; } // Next: 4 diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index ab258bcf4..c06b0b4a6 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -353,6 +353,10 @@ class SnapshotManager final : public ISnapshotManager { uevent_regen_callback_ = callback; } + // If true, compression is enabled for this update. This is used by + // first-stage to decide whether to launch snapuserd. + bool IsSnapuserdRequired(); + private: FRIEND_TEST(SnapshotTest, CleanFirstStageMount); FRIEND_TEST(SnapshotTest, CreateSnapshot); diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index e38c82171..57e7b8382 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -2283,6 +2283,7 @@ SnapshotUpdateStatus SnapshotManager::ReadSnapshotUpdateStatus(LockedFile* lock) bool SnapshotManager::WriteUpdateState(LockedFile* lock, UpdateState state) { SnapshotUpdateStatus status = {}; status.set_state(state); + status.set_compression_enabled(IsCompressionEnabled()); return WriteSnapshotUpdateStatus(lock, status); } @@ -2855,7 +2856,7 @@ std::unique_ptr SnapshotManager::OpenSnapshotWriter( return nullptr; } - if (IsCompressionEnabled()) { + if (status.compression_enabled()) { return OpenCompressedSnapshotWriter(lock.get(), source_device, params.GetPartitionName(), status, paths); } @@ -3346,5 +3347,13 @@ bool SnapshotManager::WaitForDevice(const std::string& device, return true; } +bool SnapshotManager::IsSnapuserdRequired() { + auto lock = LockExclusive(); + if (!lock) return false; + + auto status = ReadSnapshotUpdateStatus(lock.get()); + return status.state() != UpdateState::None && status.compression_enabled(); +} + } // namespace snapshot } // namespace android