OSDN Git Service

BuildDataUserCePath always use dir instead of symbolic link
authorcjbao <cathy.bao@intel.com>
Tue, 11 Apr 2017 16:09:00 +0000 (00:09 +0800)
committercjbao <cathy.bao@intel.com>
Tue, 18 Apr 2017 11:57:54 +0000 (19:57 +0800)
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 <cathy.bao@intel.com>
Utils.cpp

index cc30d5d..ecc56e4 100644 (file)
--- 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) {