From 15bbe22879c293e8836a4e6bce18a28cfdbf0609 Mon Sep 17 00:00:00 2001 From: Tri Vo Date: Fri, 21 Jun 2019 12:21:48 -0700 Subject: [PATCH] vold: use RAII wake locks Prevents wake lock leaks, e.g. b/133175847 Bug: 133175847 Test: boot blueline Change-Id: Icda4c81e00a61adec6a12c61c329867fef284dc5 --- Benchmark.cpp | 6 ++---- IdleMaint.cpp | 13 ++++--------- MoveStorage.cpp | 6 ++---- cryptfs.cpp | 15 ++++----------- 4 files changed, 12 insertions(+), 28 deletions(-) diff --git a/Benchmark.cpp b/Benchmark.cpp index b0a3b85..0770da7 100644 --- a/Benchmark.cpp +++ b/Benchmark.cpp @@ -23,8 +23,8 @@ #include #include -#include #include +#include #include @@ -181,7 +181,7 @@ static status_t benchmarkInternal(const std::string& rootPath, void Benchmark(const std::string& path, const android::sp& listener) { std::lock_guard lock(kBenchmarkLock); - acquire_wake_lock(PARTIAL_WAKE_LOCK, kWakeLock); + android::wakelock::WakeLock wl{kWakeLock}; PerformanceBoost boost; android::os::PersistableBundle extras; @@ -190,8 +190,6 @@ void Benchmark(const std::string& path, if (listener) { listener->onFinished(res, extras); } - - release_wake_lock(kWakeLock); } } // namespace vold diff --git a/IdleMaint.cpp b/IdleMaint.cpp index a2d0f91..47c277e 100644 --- a/IdleMaint.cpp +++ b/IdleMaint.cpp @@ -29,8 +29,8 @@ #include #include #include -#include #include +#include #include #include @@ -145,7 +145,7 @@ static void addFromFstab(std::list* paths, PathTypes path_type) { } void Trim(const android::sp& listener) { - acquire_wake_lock(PARTIAL_WAKE_LOCK, kWakeLock); + android::wakelock::WakeLock wl{kWakeLock}; // Collect both fstab and vold volumes std::list paths; @@ -195,7 +195,6 @@ void Trim(const android::sp& listener) { listener->onFinished(0, extras); } - release_wake_lock(kWakeLock); } static bool waitForGc(const std::list& paths) { @@ -370,7 +369,7 @@ int RunIdleMaint(const android::sp& listener) { LOG(DEBUG) << "idle maintenance started"; - acquire_wake_lock(PARTIAL_WAKE_LOCK, kWakeLock); + android::wakelock::WakeLock wl{kWakeLock}; std::list paths; addFromFstab(&paths, PathTypes::kBlkDevice); @@ -400,13 +399,11 @@ int RunIdleMaint(const android::sp& listener) { LOG(DEBUG) << "idle maintenance completed"; - release_wake_lock(kWakeLock); - return android::OK; } int AbortIdleMaint(const android::sp& listener) { - acquire_wake_lock(PARTIAL_WAKE_LOCK, kWakeLock); + android::wakelock::WakeLock wl{kWakeLock}; std::unique_lock lk(cv_m); if (idle_maint_stat != IdleMaintStats::kStopped) { @@ -424,8 +421,6 @@ int AbortIdleMaint(const android::sp& listener) listener->onFinished(0, extras); } - release_wake_lock(kWakeLock); - LOG(DEBUG) << "idle maintenance stopped"; return android::OK; diff --git a/MoveStorage.cpp b/MoveStorage.cpp index 79a47ae..2447cce 100644 --- a/MoveStorage.cpp +++ b/MoveStorage.cpp @@ -21,8 +21,8 @@ #include #include #include -#include #include +#include #include @@ -258,15 +258,13 @@ fail: void MoveStorage(const std::shared_ptr& from, const std::shared_ptr& to, const android::sp& listener) { - acquire_wake_lock(PARTIAL_WAKE_LOCK, kWakeLock); + android::wakelock::WakeLock wl{kWakeLock}; android::os::PersistableBundle extras; status_t res = moveStorageInternal(from, to, listener); if (listener) { listener->onFinished(res, extras); } - - release_wake_lock(kWakeLock); } } // namespace vold diff --git a/cryptfs.cpp b/cryptfs.cpp index c5d0307..403282e 100644 --- a/cryptfs.cpp +++ b/cryptfs.cpp @@ -44,13 +44,13 @@ #include #include #include -#include #include #include #include #include #include #include +#include #include #include @@ -2007,6 +2007,7 @@ int cryptfs_enable_internal(int crypt_type, const char* passwd, int no_ui) { off64_t previously_encrypted_upto = 0; bool rebootEncryption = false; bool onlyCreateHeader = false; + std::unique_ptr wakeLock = nullptr; if (get_crypt_ftr_and_key(&crypt_ftr) == 0) { if (crypt_ftr.flags & CRYPT_ENCRYPTION_IN_PROGRESS) { @@ -2073,7 +2074,7 @@ int cryptfs_enable_internal(int crypt_type, const char* passwd, int no_ui) { * wants to keep the screen on, it can grab a full wakelock. */ snprintf(lockid, sizeof(lockid), "enablecrypto%d", (int)getpid()); - acquire_wake_lock(PARTIAL_WAKE_LOCK, lockid); + wakeLock = std::make_unique(lockid); /* The init files are setup to stop the class main and late start when * vold sets trigger_shutdown_framework. @@ -2254,7 +2255,7 @@ int cryptfs_enable_internal(int crypt_type, const char* passwd, int no_ui) { /* default encryption - continue first boot sequence */ property_set("ro.crypto.state", "encrypted"); property_set("ro.crypto.type", "block"); - release_wake_lock(lockid); + wakeLock.reset(nullptr); if (rebootEncryption && crypt_ftr.crypt_type != CRYPT_TYPE_DEFAULT) { // Bring up cryptkeeper that will check the password and set it property_set("vold.decrypt", "trigger_shutdown_framework"); @@ -2291,7 +2292,6 @@ int cryptfs_enable_internal(int crypt_type, const char* passwd, int no_ui) { } else { /* set property to trigger dialog */ property_set("vold.encrypt_progress", "error_partially_encrypted"); - release_wake_lock(lockid); } return -1; } @@ -2301,14 +2301,10 @@ int cryptfs_enable_internal(int crypt_type, const char* passwd, int no_ui) { * Set the property and return. Hope the framework can deal with it. */ property_set("vold.encrypt_progress", "error_reboot_failed"); - release_wake_lock(lockid); return rc; error_unencrypted: property_set("vold.encrypt_progress", "error_not_encrypted"); - if (lockid[0]) { - release_wake_lock(lockid); - } return -1; error_shutting_down: @@ -2323,9 +2319,6 @@ error_shutting_down: /* shouldn't get here */ property_set("vold.encrypt_progress", "error_shutting_down"); - if (lockid[0]) { - release_wake_lock(lockid); - } return -1; }