diff options
| author | 2020-02-13 16:55:58 +0000 | |
|---|---|---|
| committer | 2020-02-13 16:55:58 +0000 | |
| commit | a069bc5f4066d1245c3fa96e86769e3f5f4dcbbc (patch) | |
| tree | a94e64b67b0217c49480b33688d76f38881ee51e | |
| parent | edd6bc95bbc71b94bd1d760c0ce8054cb521835f (diff) | |
| parent | 2a4983f49f508b472f7b06aeb411381b04e21c62 (diff) | |
Merge "Fix private volume DE data path for mounting data mirror"
| -rw-r--r-- | cmds/installd/InstalldNativeService.cpp | 44 | ||||
| -rw-r--r-- | cmds/installd/InstalldNativeService.h | 2 | ||||
| -rw-r--r-- | cmds/installd/binder/android/os/IInstalld.aidl | 2 |
3 files changed, 37 insertions, 11 deletions
diff --git a/cmds/installd/InstalldNativeService.cpp b/cmds/installd/InstalldNativeService.cpp index 08d4657a48..42887359d1 100644 --- a/cmds/installd/InstalldNativeService.cpp +++ b/cmds/installd/InstalldNativeService.cpp @@ -2684,7 +2684,7 @@ binder::Status InstalldNativeService::invalidateMounts() { } // Mount volume's CE and DE storage to mirror -binder::Status InstalldNativeService::onPrivateVolumeMounted( +binder::Status InstalldNativeService::tryMountDataMirror( const std::unique_ptr<std::string>& uuid) { ENFORCE_UID(AID_SYSTEM); CHECK_ARGUMENT_UUID(uuid); @@ -2696,24 +2696,50 @@ binder::Status InstalldNativeService::onPrivateVolumeMounted( } const char* uuid_ = uuid->c_str(); - // Mount CE mirror + std::string mirrorVolCePath(StringPrintf("%s/%s", kDataMirrorCePath, uuid_)); std::lock_guard<std::recursive_mutex> lock(mLock); - if (fs_prepare_dir(mirrorVolCePath.c_str(), 0700, AID_ROOT, AID_ROOT) != 0) { + if (fs_prepare_dir(mirrorVolCePath.c_str(), 0711, AID_SYSTEM, AID_SYSTEM) != 0) { return error("Failed to create CE mirror"); } - auto cePath = StringPrintf("%s/user_ce", create_data_path(uuid_).c_str()); + + std::string mirrorVolDePath(StringPrintf("%s/%s", kDataMirrorDePath, uuid_)); + if (fs_prepare_dir(mirrorVolDePath.c_str(), 0711, AID_SYSTEM, AID_SYSTEM) != 0) { + return error("Failed to create DE mirror"); + } + + auto cePath = StringPrintf("%s/user", create_data_path(uuid_).c_str()); + auto dePath = StringPrintf("%s/user_de", create_data_path(uuid_).c_str()); + + if (access(cePath.c_str(), F_OK) != 0) { + return error("Cannot access CE path: " + cePath); + } + if (access(dePath.c_str(), F_OK) != 0) { + return error("Cannot access DE path: " + dePath); + } + + struct stat ceStat, mirrorCeStat; + if (stat(cePath.c_str(), &ceStat) != 0) { + return error("Failed to stat " + cePath); + } + if (stat(mirrorVolCePath.c_str(), &mirrorCeStat) != 0) { + return error("Failed to stat " + mirrorVolCePath); + } + + if (mirrorCeStat.st_ino == ceStat.st_ino) { + // As it's being called by prepareUserStorage, it can be called multiple times. + // Hence, we if we mount it already, we should skip it. + LOG(WARNING) << "CE dir is mounted already: " + cePath; + return ok(); + } + + // Mount CE mirror if (TEMP_FAILURE_RETRY(mount(cePath.c_str(), mirrorVolCePath.c_str(), NULL, MS_NOSUID | MS_NODEV | MS_NOATIME | MS_BIND | MS_NOEXEC, nullptr)) == -1) { return error("Failed to mount " + mirrorVolCePath); } // Mount DE mirror - std::string mirrorVolDePath(StringPrintf("%s/%s", kDataMirrorDePath, uuid_)); - if (fs_prepare_dir(mirrorVolDePath.c_str(), 0700, AID_ROOT, AID_ROOT) != 0) { - return error("Failed to create DE mirror"); - } - auto dePath = StringPrintf("%s/user_de", create_data_path(uuid_).c_str()); if (TEMP_FAILURE_RETRY(mount(dePath.c_str(), mirrorVolDePath.c_str(), NULL, MS_NOSUID | MS_NODEV | MS_NOATIME | MS_BIND | MS_NOEXEC, nullptr)) == -1) { return error("Failed to mount " + mirrorVolDePath); diff --git a/cmds/installd/InstalldNativeService.h b/cmds/installd/InstalldNativeService.h index eb35fd3126..27c59b054f 100644 --- a/cmds/installd/InstalldNativeService.h +++ b/cmds/installd/InstalldNativeService.h @@ -155,7 +155,7 @@ public: binder::Status invalidateMounts(); binder::Status isQuotaSupported(const std::unique_ptr<std::string>& volumeUuid, bool* _aidl_return); - binder::Status onPrivateVolumeMounted(const std::unique_ptr<std::string>& volumeUuid); + binder::Status tryMountDataMirror(const std::unique_ptr<std::string>& volumeUuid); binder::Status onPrivateVolumeRemoved(const std::unique_ptr<std::string>& volumeUuid); binder::Status prepareAppProfile(const std::string& packageName, diff --git a/cmds/installd/binder/android/os/IInstalld.aidl b/cmds/installd/binder/android/os/IInstalld.aidl index 80d97038b4..f2e86baabb 100644 --- a/cmds/installd/binder/android/os/IInstalld.aidl +++ b/cmds/installd/binder/android/os/IInstalld.aidl @@ -116,7 +116,7 @@ interface IInstalld { int appId, @utf8InCpp String seInfo, int user, int snapshotId, int storageflags); void destroyAppDataSnapshot(@nullable @utf8InCpp String uuid, @utf8InCpp String packageName, int userId, long ceSnapshotInode, int snapshotId, int storageFlags); - void onPrivateVolumeMounted(@nullable @utf8InCpp String volumeUuid); + void tryMountDataMirror(@nullable @utf8InCpp String volumeUuid); void onPrivateVolumeRemoved(@nullable @utf8InCpp String volumeUuid); void migrateLegacyObbData(); |