summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Eric Biggers <ebiggers@google.com> 2022-05-04 18:56:16 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2022-05-04 18:56:16 +0000
commit0c0888da1dbb78eaa25e529e11ec1cc19ea2f9ee (patch)
tree526e16d875a0484f526dca1588c5ec317ff9a5b9
parent2dc0d124a7ce11fdefb47f889cee66667fd22e38 (diff)
parenta8a53c2615f4f6fe9ba14c920bfd8d0b27b8233f (diff)
Merge "UserDataPreparer: fix volume preparation order"
-rw-r--r--services/core/java/com/android/server/pm/UserDataPreparer.java18
1 files changed, 16 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/pm/UserDataPreparer.java b/services/core/java/com/android/server/pm/UserDataPreparer.java
index 5418dc59097c..7650d2ef5b2e 100644
--- a/services/core/java/com/android/server/pm/UserDataPreparer.java
+++ b/services/core/java/com/android/server/pm/UserDataPreparer.java
@@ -70,9 +70,16 @@ class UserDataPreparer {
void prepareUserData(int userId, int userSerial, int flags) {
synchronized (mInstallLock) {
final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ /*
+ * Internal storage must be prepared before adoptable storage, since the user's volume
+ * keys are stored in their internal storage.
+ */
+ prepareUserDataLI(null /* internal storage */, userId, userSerial, flags, true);
for (VolumeInfo vol : storage.getWritablePrivateVolumes()) {
final String volumeUuid = vol.getFsUuid();
- prepareUserDataLI(volumeUuid, userId, userSerial, flags, true);
+ if (volumeUuid != null) {
+ prepareUserDataLI(volumeUuid, userId, userSerial, flags, true);
+ }
}
}
}
@@ -133,10 +140,17 @@ class UserDataPreparer {
void destroyUserData(int userId, int flags) {
synchronized (mInstallLock) {
final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ /*
+ * Volume destruction order isn't really important, but to avoid any weird issues we
+ * process internal storage last, the opposite of prepareUserData.
+ */
for (VolumeInfo vol : storage.getWritablePrivateVolumes()) {
final String volumeUuid = vol.getFsUuid();
- destroyUserDataLI(volumeUuid, userId, flags);
+ if (volumeUuid != null) {
+ destroyUserDataLI(volumeUuid, userId, flags);
+ }
}
+ destroyUserDataLI(null /* internal storage */, userId, flags);
}
}