diff --git a/Checkpoint.cpp b/Checkpoint.cpp index 948231d..4766d79 100644 --- a/Checkpoint.cpp +++ b/Checkpoint.cpp @@ -138,6 +138,7 @@ Status cp_startCheckpoint(int retry) { namespace { volatile bool isCheckpointing = false; +volatile bool isBow = true; volatile bool needsCheckpointWasCalled = false; @@ -194,7 +195,7 @@ Status cp_commitChanges() { return error(EINVAL, "Failed to remount"); } } - } else if (fstab_rec->fs_mgr_flags.checkpoint_blk) { + } else if (fstab_rec->fs_mgr_flags.checkpoint_blk && isBow) { if (!setBowState(mount_rec.blk_device, "2")) return error(EINVAL, "Failed to set bow state"); } @@ -381,7 +382,7 @@ Status cp_prepareCheckpoint() { LOG(INFO) << "Trimmed " << range.len << " bytes on " << mount_rec.mount_point << " in " << nanoseconds_to_milliseconds(time) << "ms for checkpoint"; - setBowState(mount_rec.blk_device, "1"); + isBow &= setBowState(mount_rec.blk_device, "1"); } if (fstab_rec->fs_mgr_flags.checkpoint_blk || fstab_rec->fs_mgr_flags.checkpoint_fs) { std::thread(cp_healthDaemon, std::string(mount_rec.mount_point), diff --git a/MetadataCrypt.cpp b/MetadataCrypt.cpp index 91a8d62..0396138 100644 --- a/MetadataCrypt.cpp +++ b/MetadataCrypt.cpp @@ -95,7 +95,7 @@ void defaultkey_precreate_dm_device() { } } -static bool mount_via_fs_mgr(const char* mount_point, const char* blk_device) { +static bool mount_via_fs_mgr(const char* mount_point, const char* blk_device, bool needs_encrypt) { // fs_mgr_do_mount runs fsck. Use setexeccon to run trusted // partitions in the fsck domain. if (setexeccon(android::vold::sFsckContext)) { @@ -104,7 +104,8 @@ static bool mount_via_fs_mgr(const char* mount_point, const char* blk_device) { } auto mount_rc = fs_mgr_do_mount(&fstab_default, const_cast(mount_point), const_cast(blk_device), nullptr, - android::vold::cp_needsCheckpoint(), true); + needs_encrypt? false: android::vold::cp_needsCheckpoint(), + true); if (setexeccon(nullptr)) { PLOG(ERROR) << "Failed to clear setexeccon"; return false; @@ -350,7 +351,7 @@ bool fscrypt_mount_metadata_encrypted(const std::string& blk_device, const std:: } LOG(DEBUG) << "Mounting metadata-encrypted filesystem:" << mount_point; - mount_via_fs_mgr(mount_point.c_str(), crypto_blkdev.c_str()); + mount_via_fs_mgr(mount_point.c_str(), crypto_blkdev.c_str(), needs_encrypt); // Record that there's at least one fstab entry with metadata encryption if (!android::base::SetProperty("ro.crypto.metadata.enabled", "true")) {