diff options
| author | 2020-05-21 08:31:23 +0000 | |
|---|---|---|
| committer | 2020-05-21 08:31:23 +0000 | |
| commit | 3f15f4018e0f6c53b6a3a321f0e5d81546a777a8 (patch) | |
| tree | ad359a5bda10c75d32ecb50d135de0b8370d9086 | |
| parent | 6a468598f0639c7e210bf76073f5aef59f68e19e (diff) | |
| parent | 3a1bccd9f226cba5b9558b41318afe0cd728a77a (diff) | |
Merge "Check property for sdcardfs use" into rvc-dev
| -rw-r--r-- | core/jni/android_os_storage_StorageManager.cpp | 16 | ||||
| -rw-r--r-- | core/jni/com_android_internal_os_Zygote.cpp | 29 | ||||
| -rw-r--r-- | core/jni/filesystem_utils.h | 43 |
3 files changed, 56 insertions, 32 deletions
diff --git a/core/jni/android_os_storage_StorageManager.cpp b/core/jni/android_os_storage_StorageManager.cpp index fd3e66b1bbce..3116cc8f19e6 100644 --- a/core/jni/android_os_storage_StorageManager.cpp +++ b/core/jni/android_os_storage_StorageManager.cpp @@ -17,33 +17,23 @@ #define LOG_TAG "StorageManager" #include <android-base/file.h> #include <android-base/logging.h> +#include <android-base/properties.h> #include <android-base/unique_fd.h> #include <fcntl.h> #include <linux/fs.h> #include <nativehelper/JNIHelp.h> #include "core_jni_helpers.h" +#include "filesystem_utils.h" namespace android { -static const char* kProcFilesystems = "/proc/filesystems"; - -// Checks whether the passed in filesystem is listed in /proc/filesystems -static bool IsFilesystemSupported(const std::string& fsType) { - std::string supported; - if (!android::base::ReadFileToString(kProcFilesystems, &supported)) { - PLOG(ERROR) << "Failed to read supported filesystems"; - return false; - } - return supported.find(fsType + "\n") != std::string::npos; -} - jboolean android_os_storage_StorageManager_setQuotaProjectId(JNIEnv* env, jobject self, jstring path, jlong projectId) { struct fsxattr fsx; ScopedUtfChars utf_chars_path(env, path); - static bool sdcardFsSupported = IsFilesystemSupported("sdcardfs"); + static bool sdcardFsSupported = IsSdcardfsUsed(); if (sdcardFsSupported) { // sdcardfs doesn't support project ID quota tracking and takes care of quota // in a different way. diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index c5bc083dfabf..fc2005a31696 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -88,12 +88,13 @@ #include <utils/String8.h> #include <utils/Trace.h> -#include "core_jni_helpers.h" #include <nativehelper/JNIHelp.h> #include <nativehelper/ScopedLocalRef.h> #include <nativehelper/ScopedPrimitiveArray.h> #include <nativehelper/ScopedUtfChars.h> +#include "core_jni_helpers.h" #include "fd_utils.h" +#include "filesystem_utils.h" #include "nativebridge/native_bridge.h" @@ -614,15 +615,6 @@ static void EnableDebugger() { } } -static bool IsFilesystemSupported(const std::string& fsType) { - std::string supported; - if (!ReadFileToString("/proc/filesystems", &supported)) { - ALOGE("Failed to read supported filesystems"); - return false; - } - return supported.find(fsType + "\n") != std::string::npos; -} - static void PreApplicationInit() { // The child process sets this to indicate it's not the zygote. android_mallopt(M_SET_ZYGOTE_CHILD, nullptr, 0); @@ -1554,15 +1546,14 @@ static void isolateJitProfile(JNIEnv* env, jobjectArray pkg_data_info_list, static void BindMountStorageToLowerFs(const userid_t user_id, const uid_t uid, const char* dir_name, const char* package, fail_fn_t fail_fn) { - - bool hasSdcardFs = IsFilesystemSupported("sdcardfs"); - std::string source; - if (hasSdcardFs) { - source = StringPrintf("/mnt/runtime/default/emulated/%d/%s/%s", user_id, dir_name, package); - } else { - source = StringPrintf("/mnt/pass_through/%d/emulated/%d/%s/%s", - user_id, user_id, dir_name, package); - } + bool hasSdcardFs = IsSdcardfsUsed(); + std::string source; + if (hasSdcardFs) { + source = StringPrintf("/mnt/runtime/default/emulated/%d/%s/%s", user_id, dir_name, package); + } else { + source = StringPrintf("/mnt/pass_through/%d/emulated/%d/%s/%s", user_id, user_id, dir_name, + package); + } std::string target = StringPrintf("/storage/emulated/%d/%s/%s", user_id, dir_name, package); // As the parent is mounted as tmpfs, we need to create the target dir here. diff --git a/core/jni/filesystem_utils.h b/core/jni/filesystem_utils.h new file mode 100644 index 000000000000..c4728a09883b --- /dev/null +++ b/core/jni/filesystem_utils.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FRAMEWORKS_BASE_CORE_JNI_MISC_UTILS_H_ +#define FRAMEWORKS_BASE_CORE_JNI_MISC_UTILS_H_ + +#include <android-base/file.h> +#include <android-base/logging.h> +#include <android-base/properties.h> +#include <fcntl.h> +#include <linux/fs.h> + +namespace { +static constexpr const char* kExternalStorageSdcardfs = "external_storage.sdcardfs.enabled"; + +static bool IsFilesystemSupported(const std::string& fsType) { + std::string supported; + if (!android::base::ReadFileToString("/proc/filesystems", &supported)) { + ALOGE("Failed to read supported filesystems"); + return false; + } + return supported.find(fsType + "\n") != std::string::npos; +} + +static inline bool IsSdcardfsUsed() { + return IsFilesystemSupported("sdcardfs") && + android::base::GetBoolProperty(kExternalStorageSdcardfs, true); +} +} // namespace +#endif // FRAMEWORKS_BASE_CORE_JNI_MISC_UTILS_H_ |