From ed36545f40aff14945ceabe6132b0939f5efdc2a Mon Sep 17 00:00:00 2001 From: Zaijian Lin Date: Mon, 19 Jul 2021 13:59:13 +0800 Subject: [PATCH] Check the data directory before mount tmpfs As it's possible that dir is not created when mount tmpfs on external private mount, add a busy waiting check in zygote to ensure data directory is created before we do our work. Bug:189406326 Change-Id: I5e5beca36383027580eeb9ead77f59ce4b3ee4e5 --- core/jni/com_android_internal_os_Zygote.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index 1b3f78c8f3d8b..69c2c5b27ee3e 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -201,6 +201,8 @@ static constexpr unsigned int STORAGE_DIR_CHECK_MAX_INTERVAL_US = 1000; */ static constexpr int STORAGE_DIR_CHECK_TIMEOUT_US = 1000 * 1000 * 60 * 5; +static void WaitUntilDirReady(const std::string& target, fail_fn_t fail_fn); + /** * A helper class containing accounting information for USAPs. */ @@ -1248,7 +1250,11 @@ static void isolateAppData(JNIEnv* env, const std::vector& merged_d auto volPath = StringPrintf("%s/%s", externalPrivateMountPath, ent->d_name); auto cePath = StringPrintf("%s/user", volPath.c_str()); auto dePath = StringPrintf("%s/user_de", volPath.c_str()); + // Wait until dir user is created. + WaitUntilDirReady(cePath.c_str(), fail_fn); MountAppDataTmpFs(cePath.c_str(), fail_fn); + // Wait until dir user_de is created. + WaitUntilDirReady(dePath.c_str(), fail_fn); MountAppDataTmpFs(dePath.c_str(), fail_fn); } closedir(dir);