From dd1e91ff58532f97850303997b36a3795004ac3b Mon Sep 17 00:00:00 2001 From: Alessio Balsini Date: Wed, 13 Oct 2021 12:03:18 +0100 Subject: [PATCH] Disable bind mounts for data and obb if FUSE BPF is available FUSE BPF aims at achieving comparable performance to bind-mounts, with the flexibility of FUSE. Disable data and obb bind-mounts in favor of the FUSE filesystem if the system implements the feature. Bug: 202785178 Test: mount | grep obb Signed-off-by: Alessio Balsini Change-Id: Ia8b289b84542125831a857b559bb6f93afbee494 --- Utils.h | 1 + model/EmulatedVolume.cpp | 20 +++++++++++++------- model/EmulatedVolume.h | 3 +++ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Utils.h b/Utils.h index bb6615c..df322b8 100644 --- a/Utils.h +++ b/Utils.h @@ -36,6 +36,7 @@ namespace vold { static const char* kVoldAppDataIsolationEnabled = "persist.sys.vold_app_data_isolation_enabled"; static const char* kExternalStorageSdcardfs = "external_storage.sdcardfs.enabled"; +static const char* kFuseBpfEnabled = "persist.sys.fuse.bpf.enable"; /* SELinux contexts used depending on the block device type */ extern char* sBlkidContext; diff --git a/model/EmulatedVolume.cpp b/model/EmulatedVolume.cpp index b686437..7c8a4e0 100644 --- a/model/EmulatedVolume.cpp +++ b/model/EmulatedVolume.cpp @@ -49,6 +49,7 @@ EmulatedVolume::EmulatedVolume(const std::string& rawPath, int userId) mRawPath = rawPath; mLabel = "emulated"; mFuseMounted = false; + mFuseBpfEnabled = base::GetBoolProperty(kFuseBpfEnabled, false); mUseSdcardFs = IsSdcardfsUsed(); mAppDataIsolationEnabled = base::GetBoolProperty(kVoldAppDataIsolationEnabled, false); } @@ -60,6 +61,7 @@ EmulatedVolume::EmulatedVolume(const std::string& rawPath, dev_t device, const s mRawPath = rawPath; mLabel = fsUuid; mFuseMounted = false; + mFuseBpfEnabled = base::GetBoolProperty(kFuseBpfEnabled, false); mUseSdcardFs = IsSdcardfsUsed(); mAppDataIsolationEnabled = base::GetBoolProperty(kVoldAppDataIsolationEnabled, false); } @@ -359,10 +361,12 @@ status_t EmulatedVolume::doMount() { } } - // Only do the bind-mounts when we know for sure the FUSE daemon can resolve the path. - res = mountFuseBindMounts(); - if (res != OK) { - return res; + if (!mFuseBpfEnabled) { + // Only do the bind-mounts when we know for sure the FUSE daemon can resolve the path. + res = mountFuseBindMounts(); + if (res != OK) { + return res; + } } ConfigureReadAheadForFuse(GetFuseMountPathForUser(user_id, label), 256u); @@ -416,9 +420,11 @@ status_t EmulatedVolume::doUnmount() { if (mFuseMounted) { std::string label = getLabel(); - // Ignoring unmount return status because we do want to try to unmount - // the rest cleanly. - unmountFuseBindMounts(); + if (!mFuseBpfEnabled) { + // Ignoring unmount return status because we do want to try to + // unmount the rest cleanly. + unmountFuseBindMounts(); + } if (UnmountUserFuse(userId, getInternalPath(), label) != OK) { PLOG(INFO) << "UnmountUserFuse failed on emulated fuse volume"; diff --git a/model/EmulatedVolume.h b/model/EmulatedVolume.h index 1d2385d..0f39fbd 100644 --- a/model/EmulatedVolume.h +++ b/model/EmulatedVolume.h @@ -64,6 +64,9 @@ class EmulatedVolume : public VolumeBase { /* Whether we mounted FUSE for this volume */ bool mFuseMounted; + /* Whether the FUSE BPF feature is enabled */ + bool mFuseBpfEnabled; + /* Whether to use sdcardfs for this volume */ bool mUseSdcardFs;