From eb50114a83818554470396845e6532bc7dc778fb Mon Sep 17 00:00:00 2001 From: cjbao Date: Wed, 12 Apr 2017 00:09:00 +0800 Subject: [PATCH] BuildDataUserCePath always use dir instead of symbolic link Select whichever is real dir instead of symbolic link from either /data/data or /data/user/0. This is to minimize path walking overhead in kernel. This works together with Change 369787 Test: Manual test Change-Id: I338518673fc22ccbfed6ddd6be196931fce18525 Signed-off-by: cjbao --- Utils.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Utils.cpp b/Utils.cpp index cc30d5d..ecc56e4 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -608,15 +608,15 @@ std::string BuildDataMediaCePath(const char* volumeUuid, userid_t userId) { std::string BuildDataUserCePath(const char* volumeUuid, userid_t userId) { // TODO: unify with installd path generation logic std::string data(BuildDataPath(volumeUuid)); - if (volumeUuid == nullptr) { - if (userId == 0) { - return StringPrintf("%s/data", data.c_str()); - } else { - return StringPrintf("%s/user/%u", data.c_str(), userId); + if (volumeUuid == nullptr && userId == 0) { + std::string legacy = StringPrintf("%s/data", data.c_str()); + struct stat sb; + if (lstat(legacy.c_str(), &sb) == 0 && S_ISDIR(sb.st_mode)) { + /* /data/data is dir, return /data/data for legacy system */ + return legacy; } - } else { - return StringPrintf("%s/user/%u", data.c_str(), userId); } + return StringPrintf("%s/user/%u", data.c_str(), userId); } std::string BuildDataUserDePath(const char* volumeUuid, userid_t userId) {