From dd4bb173439e7dcd2abc05e06405ebf933b8d1f7 Mon Sep 17 00:00:00 2001 From: Sudheer Shanka Date: Wed, 16 Jan 2019 23:35:49 -0800 Subject: [PATCH] Create new mount directory /mnt/runtime/full. This will be used for system internals to access secondary volumes without having to bypass sdcardfs. Bug: 121277410 Test: manual Exempt-From-Owner-Approval: Got approval on internal master Change-Id: I9b3e33f6c6e426e83469b8030b02d59c02183946 --- model/EmulatedVolume.cpp | 11 ++++++++--- model/EmulatedVolume.h | 1 + model/PublicVolume.cpp | 11 ++++++++--- model/PublicVolume.h | 1 + 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/model/EmulatedVolume.cpp b/model/EmulatedVolume.cpp index 8d9ac74..f933982 100644 --- a/model/EmulatedVolume.cpp +++ b/model/EmulatedVolume.cpp @@ -65,18 +65,20 @@ status_t EmulatedVolume::doMount() { mFuseDefault = StringPrintf("/mnt/runtime/default/%s", label.c_str()); mFuseRead = StringPrintf("/mnt/runtime/read/%s", label.c_str()); mFuseWrite = StringPrintf("/mnt/runtime/write/%s", label.c_str()); + mFuseFull = StringPrintf("/mnt/runtime/full/%s", label.c_str()); setInternalPath(mRawPath); setPath(StringPrintf("/storage/%s", label.c_str())); if (fs_prepare_dir(mFuseDefault.c_str(), 0700, AID_ROOT, AID_ROOT) || fs_prepare_dir(mFuseRead.c_str(), 0700, AID_ROOT, AID_ROOT) || - fs_prepare_dir(mFuseWrite.c_str(), 0700, AID_ROOT, AID_ROOT)) { + fs_prepare_dir(mFuseWrite.c_str(), 0700, AID_ROOT, AID_ROOT) || + fs_prepare_dir(mFuseFull.c_str(), 0700, AID_ROOT, AID_ROOT)) { PLOG(ERROR) << getId() << " failed to create mount points"; return -errno; } - dev_t before = GetDevice(mFuseWrite); + dev_t before = GetDevice(mFuseFull); if (!(mFusePid = fork())) { // clang-format off @@ -104,7 +106,7 @@ status_t EmulatedVolume::doMount() { } nsecs_t start = systemTime(SYSTEM_TIME_BOOTTIME); - while (before == GetDevice(mFuseWrite)) { + while (before == GetDevice(mFuseFull)) { LOG(DEBUG) << "Waiting for FUSE to spin up..."; usleep(50000); // 50ms @@ -130,14 +132,17 @@ status_t EmulatedVolume::doUnmount() { ForceUnmount(mFuseDefault); ForceUnmount(mFuseRead); ForceUnmount(mFuseWrite); + ForceUnmount(mFuseFull); rmdir(mFuseDefault.c_str()); rmdir(mFuseRead.c_str()); rmdir(mFuseWrite.c_str()); + rmdir(mFuseFull.c_str()); mFuseDefault.clear(); mFuseRead.clear(); mFuseWrite.clear(); + mFuseFull.clear(); return OK; } diff --git a/model/EmulatedVolume.h b/model/EmulatedVolume.h index f618c55..fddfe4e 100644 --- a/model/EmulatedVolume.h +++ b/model/EmulatedVolume.h @@ -52,6 +52,7 @@ class EmulatedVolume : public VolumeBase { std::string mFuseDefault; std::string mFuseRead; std::string mFuseWrite; + std::string mFuseFull; /* PID of FUSE wrapper */ pid_t mFusePid; diff --git a/model/PublicVolume.cpp b/model/PublicVolume.cpp index 8ed4356..1339eb3 100644 --- a/model/PublicVolume.cpp +++ b/model/PublicVolume.cpp @@ -119,6 +119,7 @@ status_t PublicVolume::doMount() { mFuseDefault = StringPrintf("/mnt/runtime/default/%s", stableName.c_str()); mFuseRead = StringPrintf("/mnt/runtime/read/%s", stableName.c_str()); mFuseWrite = StringPrintf("/mnt/runtime/write/%s", stableName.c_str()); + mFuseFull = StringPrintf("/mnt/runtime/full/%s", stableName.c_str()); setInternalPath(mRawPath); if (getMountFlags() & MountFlags::kVisible) { @@ -156,12 +157,13 @@ status_t PublicVolume::doMount() { if (fs_prepare_dir(mFuseDefault.c_str(), 0700, AID_ROOT, AID_ROOT) || fs_prepare_dir(mFuseRead.c_str(), 0700, AID_ROOT, AID_ROOT) || - fs_prepare_dir(mFuseWrite.c_str(), 0700, AID_ROOT, AID_ROOT)) { + fs_prepare_dir(mFuseWrite.c_str(), 0700, AID_ROOT, AID_ROOT) || + fs_prepare_dir(mFuseFull.c_str(), 0700, AID_ROOT, AID_ROOT)) { PLOG(ERROR) << getId() << " failed to create FUSE mount points"; return -errno; } - dev_t before = GetDevice(mFuseWrite); + dev_t before = GetDevice(mFuseFull); if (!(mFusePid = fork())) { if (getMountFlags() & MountFlags::kPrimary) { @@ -201,7 +203,7 @@ status_t PublicVolume::doMount() { } nsecs_t start = systemTime(SYSTEM_TIME_BOOTTIME); - while (before == GetDevice(mFuseWrite)) { + while (before == GetDevice(mFuseFull)) { LOG(DEBUG) << "Waiting for FUSE to spin up..."; usleep(50000); // 50ms @@ -230,16 +232,19 @@ status_t PublicVolume::doUnmount() { ForceUnmount(mFuseDefault); ForceUnmount(mFuseRead); ForceUnmount(mFuseWrite); + ForceUnmount(mFuseFull); ForceUnmount(mRawPath); rmdir(mFuseDefault.c_str()); rmdir(mFuseRead.c_str()); rmdir(mFuseWrite.c_str()); + rmdir(mFuseFull.c_str()); rmdir(mRawPath.c_str()); mFuseDefault.clear(); mFuseRead.clear(); mFuseWrite.clear(); + mFuseFull.clear(); mRawPath.clear(); return OK; diff --git a/model/PublicVolume.h b/model/PublicVolume.h index c918f52..2feccca 100644 --- a/model/PublicVolume.h +++ b/model/PublicVolume.h @@ -63,6 +63,7 @@ class PublicVolume : public VolumeBase { std::string mFuseDefault; std::string mFuseRead; std::string mFuseWrite; + std::string mFuseFull; /* PID of FUSE wrapper */ pid_t mFusePid;