Merge "UserDataPrepare: CE storage property set too early." into pi-dev
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 6c35bda..00302b2 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -2541,11 +2541,6 @@
synchronized (mLock) {
mLocalUnlockedUsers = ArrayUtils.appendInt(mLocalUnlockedUsers, userId);
}
- if (userId == UserHandle.USER_SYSTEM) {
- String propertyName = "sys.user." + userId + ".ce_available";
- Slog.d(TAG, "Setting property: " + propertyName + "=true");
- SystemProperties.set(propertyName, "true");
- }
}
@Override
@@ -2685,7 +2680,8 @@
}
// Ignore requests to create directories if CE storage is not available
- if (!SystemProperties.getBoolean(propertyName, false)) {
+ if ((userId == UserHandle.USER_SYSTEM)
+ && !SystemProperties.getBoolean(propertyName, false)) {
throw new IllegalStateException("Failed to prepare " + appPath);
}
diff --git a/services/core/java/com/android/server/pm/UserDataPreparer.java b/services/core/java/com/android/server/pm/UserDataPreparer.java
index 96c102b..045a295 100644
--- a/services/core/java/com/android/server/pm/UserDataPreparer.java
+++ b/services/core/java/com/android/server/pm/UserDataPreparer.java
@@ -24,6 +24,8 @@
import android.os.FileUtils;
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
+import android.os.SystemProperties;
+import android.os.UserHandle;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
@@ -96,6 +98,14 @@
}
mInstaller.createUserData(volumeUuid, userId, userSerial, flags);
+
+ // CE storage is available after they are prepared.
+ if ((flags & StorageManager.FLAG_STORAGE_CE) != 0 &&
+ (userId == UserHandle.USER_SYSTEM)) {
+ String propertyName = "sys.user." + userId + ".ce_available";
+ Slog.d(TAG, "Setting property: " + propertyName + "=true");
+ SystemProperties.set(propertyName, "true");
+ }
} catch (Exception e) {
logCriticalInfo(Log.WARN, "Destroying user " + userId + " on volume " + volumeUuid
+ " because we failed to prepare: " + e);
@@ -103,7 +113,8 @@
if (allowRecover) {
// Try one last time; if we fail again we're really in trouble
- prepareUserDataLI(volumeUuid, userId, userSerial, flags, false);
+ prepareUserDataLI(volumeUuid, userId, userSerial,
+ flags | StorageManager.FLAG_STORAGE_DE, false);
}
}
}