Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a1bccd9 authored by Daniel Rosenberg's avatar Daniel Rosenberg
Browse files

Check property for sdcardfs use

Sdcardfs is only used if present in the kernel, and
external_storage.sdcardfs.enabled=0. For compatibility, this property
defaults to 1.

Bug: 155222498
Test: mount|grep "type sdcardfs" should find nothing after boot complete
      if external_storage.sdcardfs.enabled=0
Change-Id: Ide648405c260ac46d07877c3a7b78a8bee48e09a
parent 19f6945f
Loading
Loading
Loading
Loading
+3 −13
Original line number Diff line number Diff line
@@ -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.
+10 −19
Original line number Diff line number Diff line
@@ -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,14 +1546,13 @@ 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");
    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);
        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);

+43 −0
Original line number Diff line number Diff line
/*
 * 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_