From 2991cbe49fb54bbdfaabb392b59bb495c2aae605 Mon Sep 17 00:00:00 2001 From: Youkichi Hosoi Date: Thu, 11 Nov 2021 11:23:01 +0900 Subject: [PATCH] Split MOUNT_FLAG_VISIBLE into MOUNT_FLAG_VISIBLE_FOR_{READ, WRITE} IVold.MOUNT_FLAG_VISIBLE is split into MOUNT_FLAG_VISIBLE_FOR_READ and MOUNT_FLAG_VISIBLE_FOR_WRITE. Accordingly, VolumeBase::MountFlags::kVisible is split into kVisibleForRead and kVisibleForWrite. Bug: 206019156 Test: m Change-Id: Ia55673400d9f713f221650e1335a46ba11f6f027 Merged-In: Ia55673400d9f713f221650e1335a46ba11f6f027 --- VolumeManager.cpp | 8 ++++---- binder/android/os/IVold.aidl | 3 ++- model/EmulatedVolume.cpp | 2 +- model/PublicVolume.cpp | 2 +- model/VolumeBase.h | 13 +++++++++++-- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/VolumeManager.cpp b/VolumeManager.cpp index d299593..02025b7 100644 --- a/VolumeManager.cpp +++ b/VolumeManager.cpp @@ -1002,8 +1002,8 @@ int VolumeManager::setupAppDir(const std::string& path, int32_t appUid, bool fix // The volume must be mounted return false; } - if ((vol.getMountFlags() & VolumeBase::MountFlags::kVisible) == 0) { - // and visible + if (!vol.isVisibleForWrite()) { + // App dirs should only be created for writable volumes. return false; } if (vol.getInternalPath().empty()) { @@ -1077,8 +1077,8 @@ int VolumeManager::createObb(const std::string& sourcePath, const std::string& s // The volume must be mounted return false; } - if ((vol.getMountFlags() & VolumeBase::MountFlags::kVisible) == 0) { - // and visible + if (!vol.isVisibleForWrite()) { + // Obb volume should only be created for writable volumes. return false; } if (vol.getInternalPath().empty()) { diff --git a/binder/android/os/IVold.aidl b/binder/android/os/IVold.aidl index 606f473..8dd7860 100644 --- a/binder/android/os/IVold.aidl +++ b/binder/android/os/IVold.aidl @@ -159,7 +159,8 @@ interface IVold { const int FSTRIM_FLAG_DEEP_TRIM = 1; const int MOUNT_FLAG_PRIMARY = 1; - const int MOUNT_FLAG_VISIBLE = 2; + const int MOUNT_FLAG_VISIBLE_FOR_READ = 2; + const int MOUNT_FLAG_VISIBLE_FOR_WRITE = 4; const int PARTITION_TYPE_PUBLIC = 0; const int PARTITION_TYPE_PRIVATE = 1; diff --git a/model/EmulatedVolume.cpp b/model/EmulatedVolume.cpp index 6f21ff8..b686437 100644 --- a/model/EmulatedVolume.cpp +++ b/model/EmulatedVolume.cpp @@ -246,7 +246,7 @@ status_t EmulatedVolume::unmountSdcardFs() { status_t EmulatedVolume::doMount() { std::string label = getLabel(); - bool isVisible = getMountFlags() & MountFlags::kVisible; + bool isVisible = isVisibleForWrite(); mSdcardFsDefault = StringPrintf("/mnt/runtime/default/%s", label.c_str()); mSdcardFsRead = StringPrintf("/mnt/runtime/read/%s", label.c_str()); diff --git a/model/PublicVolume.cpp b/model/PublicVolume.cpp index 12e31ff..bf54c95 100644 --- a/model/PublicVolume.cpp +++ b/model/PublicVolume.cpp @@ -97,7 +97,7 @@ status_t PublicVolume::doDestroy() { } status_t PublicVolume::doMount() { - bool isVisible = getMountFlags() & MountFlags::kVisible; + bool isVisible = isVisibleForWrite(); readMetadata(); if (mFsType == "vfat" && vfat::IsSupported()) { diff --git a/model/VolumeBase.h b/model/VolumeBase.h index 689750d..f29df65 100644 --- a/model/VolumeBase.h +++ b/model/VolumeBase.h @@ -63,8 +63,14 @@ class VolumeBase { enum MountFlags { /* Flag that volume is primary external storage */ kPrimary = 1 << 0, - /* Flag that volume is visible to normal apps */ - kVisible = 1 << 1, + /* + * Flags indicating that volume is visible to normal apps. + * kVisibleForRead and kVisibleForWrite correspond to + * VolumeInfo.MOUNT_FLAG_VISIBLE_FOR_READ and + * VolumeInfo.MOUNT_FLAG_VISIBLE_FOR_WRITE, respectively. + */ + kVisibleForRead = 1 << 1, + kVisibleForWrite = 1 << 2, }; enum class State { @@ -103,6 +109,9 @@ class VolumeBase { std::shared_ptr findVolume(const std::string& id); bool isEmulated() { return mType == Type::kEmulated; } + bool isVisibleForRead() const { return (mMountFlags & MountFlags::kVisibleForRead) != 0; } + bool isVisibleForWrite() const { return (mMountFlags & MountFlags::kVisibleForWrite) != 0; } + bool isVisible() const { return isVisibleForRead() || isVisibleForWrite(); } status_t create(); status_t destroy();