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
diff --git a/fs_mgr/libsnapshot/android/snapshot/snapshot.proto b/fs_mgr/libsnapshot/android/snapshot/snapshot.proto
index acb75d0..38c6bf8 100644
--- a/fs_mgr/libsnapshot/android/snapshot/snapshot.proto
+++ b/fs_mgr/libsnapshot/android/snapshot/snapshot.proto
@@ -118,7 +118,7 @@
Cancelled = 7;
};
-// Next: 5
+// Next: 6
message SnapshotUpdateStatus {
UpdateState state = 1;
@@ -133,6 +133,9 @@
// 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 ab258bc..c06b0b4 100644
--- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h
+++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h
@@ -353,6 +353,10 @@
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 e38c821..57e7b83 100644
--- a/fs_mgr/libsnapshot/snapshot.cpp
+++ b/fs_mgr/libsnapshot/snapshot.cpp
@@ -2283,6 +2283,7 @@
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 @@
return nullptr;
}
- if (IsCompressionEnabled()) {
+ if (status.compression_enabled()) {
return OpenCompressedSnapshotWriter(lock.get(), source_device, params.GetPartitionName(),
status, paths);
}
@@ -3346,5 +3347,13 @@
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