diff options
| author | 2022-05-04 18:56:16 +0000 | |
|---|---|---|
| committer | 2022-05-04 18:56:16 +0000 | |
| commit | 0c0888da1dbb78eaa25e529e11ec1cc19ea2f9ee (patch) | |
| tree | 526e16d875a0484f526dca1588c5ec317ff9a5b9 | |
| parent | 2dc0d124a7ce11fdefb47f889cee66667fd22e38 (diff) | |
| parent | a8a53c2615f4f6fe9ba14c920bfd8d0b27b8233f (diff) | |
Merge "UserDataPreparer: fix volume preparation order"
| -rw-r--r-- | services/core/java/com/android/server/pm/UserDataPreparer.java | 18 |
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); } } |