From 2055364f8331ae9d103c4b61a44edb19ebc6a094 Mon Sep 17 00:00:00 2001 From: Paul Lawrence Date: Fri, 12 Jun 2020 07:32:23 -0700 Subject: [PATCH] Don't call block checkpoint functions above dm-default-key Bug: 156225476 Test: Build for f2fs and ext4 device, make sure checkpoints roll back and commit Change-Id: I7a772ff712dec9e69df175de840d69d296c65923 --- fs_mgr/fs_mgr.cpp | 17 ++++++++++------- fs_mgr/include/fs_mgr.h | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index 49ca5db46..5e5e3ac9b 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -1014,7 +1014,8 @@ static bool SupportsCheckpoint(FstabEntry* entry) { class CheckpointManager { public: - CheckpointManager(int needs_checkpoint = -1) : needs_checkpoint_(needs_checkpoint) {} + CheckpointManager(int needs_checkpoint = -1, bool metadata_encrypted = false) + : needs_checkpoint_(needs_checkpoint), metadata_encrypted_(metadata_encrypted) {} bool NeedsCheckpoint() { if (needs_checkpoint_ != UNKNOWN) { @@ -1032,7 +1033,7 @@ class CheckpointManager { return true; } - if (entry->fs_mgr_flags.checkpoint_blk) { + if (entry->fs_mgr_flags.checkpoint_blk && !metadata_encrypted_) { call_vdc({"checkpoint", "restoreCheckpoint", entry->blk_device}, nullptr); } @@ -1121,6 +1122,7 @@ class CheckpointManager { enum { UNKNOWN = -1, NO = 0, YES = 1 }; int needs_checkpoint_; + bool metadata_encrypted_; std::map device_map_; }; @@ -1685,11 +1687,11 @@ int fs_mgr_do_mount_one(const FstabEntry& entry, const std::string& mount_point) // in turn, and stop on 1st success, or no more match. static int fs_mgr_do_mount_helper(Fstab* fstab, const std::string& n_name, const std::string& n_blk_device, const char* tmp_mount_point, - int needs_checkpoint) { + int needs_checkpoint, bool metadata_encrypted) { int mount_errors = 0; int first_mount_errno = 0; std::string mount_point; - CheckpointManager checkpoint_manager(needs_checkpoint); + CheckpointManager checkpoint_manager(needs_checkpoint, metadata_encrypted); AvbUniquePtr avb_handle(nullptr); if (!fstab) { @@ -1799,12 +1801,13 @@ static int fs_mgr_do_mount_helper(Fstab* fstab, const std::string& n_name, } int fs_mgr_do_mount(Fstab* fstab, const char* n_name, char* n_blk_device, char* tmp_mount_point) { - return fs_mgr_do_mount_helper(fstab, n_name, n_blk_device, tmp_mount_point, -1); + return fs_mgr_do_mount_helper(fstab, n_name, n_blk_device, tmp_mount_point, -1, false); } int fs_mgr_do_mount(Fstab* fstab, const char* n_name, char* n_blk_device, char* tmp_mount_point, - bool needs_checkpoint) { - return fs_mgr_do_mount_helper(fstab, n_name, n_blk_device, tmp_mount_point, needs_checkpoint); + bool needs_checkpoint, bool metadata_encrypted) { + return fs_mgr_do_mount_helper(fstab, n_name, n_blk_device, tmp_mount_point, needs_checkpoint, + metadata_encrypted); } /* diff --git a/fs_mgr/include/fs_mgr.h b/fs_mgr/include/fs_mgr.h index 9bc38f97b..ecb86a1f9 100644 --- a/fs_mgr/include/fs_mgr.h +++ b/fs_mgr/include/fs_mgr.h @@ -69,7 +69,7 @@ int fs_mgr_mount_all(android::fs_mgr::Fstab* fstab, int mount_mode); int fs_mgr_do_mount(android::fs_mgr::Fstab* fstab, const char* n_name, char* n_blk_device, char* tmp_mount_point); int fs_mgr_do_mount(android::fs_mgr::Fstab* fstab, const char* n_name, char* n_blk_device, - char* tmp_mount_point, bool need_cp); + char* tmp_mount_point, bool need_cp, bool metadata_encrypted); int fs_mgr_do_mount_one(const android::fs_mgr::FstabEntry& entry, const std::string& mount_point = ""); int fs_mgr_do_tmpfs_mount(const char *n_name);