Merge "Fix race condition around CE storage becoming available." into sc-qpr1-dev am: d172b787d3 am: 09c663fd4a

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15879518

Change-Id: I0533e2541b07fa06e3e361d983849ee159276084
This commit is contained in:
Martijn Coenen
2021-09-24 07:57:21 +00:00
committed by Automerger Merge Worker
4 changed files with 45 additions and 3 deletions

View File

@@ -18,6 +18,7 @@ package android.os.storage;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.os.IVold; import android.os.IVold;
import java.util.List; import java.util.List;
@@ -135,4 +136,19 @@ public abstract class StorageManagerInternal {
* {@link VolumeInfo#isPrimary()} * {@link VolumeInfo#isPrimary()}
*/ */
public abstract List<String> getPrimaryVolumeIds(); public abstract List<String> getPrimaryVolumeIds();
/**
* Tells StorageManager that CE storage for this user has been prepared.
*
* @param userId userId for which CE storage has been prepared
*/
public abstract void markCeStoragePrepared(@UserIdInt int userId);
/**
* Returns true when CE storage for this user has been prepared.
*
* When the user key is unlocked and CE storage has been prepared,
* it's ok to access and modify CE directories on volumes for this user.
*/
public abstract boolean isCeStoragePrepared(@UserIdInt int userId);
} }

View File

@@ -221,6 +221,9 @@ class StorageManagerService extends IStorageManager.Stub
@GuardedBy("mLock") @GuardedBy("mLock")
private final Set<Integer> mFuseMountedUser = new ArraySet<>(); private final Set<Integer> mFuseMountedUser = new ArraySet<>();
@GuardedBy("mLock")
private final Set<Integer> mCeStoragePreparedUsers = new ArraySet<>();
public static class Lifecycle extends SystemService { public static class Lifecycle extends SystemService {
private StorageManagerService mStorageManagerService; private StorageManagerService mStorageManagerService;
@@ -4864,5 +4867,19 @@ class StorageManagerService extends IStorageManager.Stub
} }
return primaryVolumeIds; return primaryVolumeIds;
} }
@Override
public void markCeStoragePrepared(int userId) {
synchronized (mLock) {
mCeStoragePreparedUsers.add(userId);
}
}
@Override
public boolean isCeStoragePrepared(int userId) {
synchronized (mLock) {
return mCeStoragePreparedUsers.contains(userId);
}
}
} }
} }

View File

@@ -22648,8 +22648,9 @@ public class PackageManagerService extends IPackageManager.Stub
removeKeystoreDataIfNeeded(mInjector.getUserManagerInternal(), userId, appId); removeKeystoreDataIfNeeded(mInjector.getUserManagerInternal(), userId, appId);
UserManagerInternal umInternal = mInjector.getUserManagerInternal(); UserManagerInternal umInternal = mInjector.getUserManagerInternal();
StorageManagerInternal smInternal = mInjector.getLocalService(StorageManagerInternal.class);
final int flags; final int flags;
if (umInternal.isUserUnlockingOrUnlocked(userId)) { if (StorageManager.isUserKeyUnlocked(userId) && smInternal.isCeStoragePrepared(userId)) {
flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE; flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE;
} else if (umInternal.isUserRunning(userId)) { } else if (umInternal.isUserRunning(userId)) {
flags = StorageManager.FLAG_STORAGE_DE; flags = StorageManager.FLAG_STORAGE_DE;
@@ -25514,9 +25515,11 @@ public class PackageManagerService extends IPackageManager.Stub
// Reconcile app data for all started/unlocked users // Reconcile app data for all started/unlocked users
final StorageManager sm = mInjector.getSystemService(StorageManager.class); final StorageManager sm = mInjector.getSystemService(StorageManager.class);
UserManagerInternal umInternal = mInjector.getUserManagerInternal(); UserManagerInternal umInternal = mInjector.getUserManagerInternal();
StorageManagerInternal smInternal = mInjector.getLocalService(StorageManagerInternal.class);
for (UserInfo user : mUserManager.getUsers(false /* includeDying */)) { for (UserInfo user : mUserManager.getUsers(false /* includeDying */)) {
final int flags; final int flags;
if (umInternal.isUserUnlockingOrUnlocked(user.id)) { if (StorageManager.isUserKeyUnlocked(user.id)
&& smInternal.isCeStoragePrepared(user.id)) {
flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE; flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE;
} else if (umInternal.isUserRunning(user.id)) { } else if (umInternal.isUserRunning(user.id)) {
flags = StorageManager.FLAG_STORAGE_DE; flags = StorageManager.FLAG_STORAGE_DE;
@@ -25856,7 +25859,8 @@ public class PackageManagerService extends IPackageManager.Stub
StorageManagerInternal smInternal = mInjector.getLocalService(StorageManagerInternal.class); StorageManagerInternal smInternal = mInjector.getLocalService(StorageManagerInternal.class);
for (UserInfo user : mUserManager.getUsers(false /*excludeDying*/)) { for (UserInfo user : mUserManager.getUsers(false /*excludeDying*/)) {
final int flags; final int flags;
if (umInternal.isUserUnlockingOrUnlocked(user.id)) { if (StorageManager.isUserKeyUnlocked(user.id)
&& smInternal.isCeStoragePrepared(user.id)) {
flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE; flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE;
} else if (umInternal.isUserRunning(user.id)) { } else if (umInternal.isUserRunning(user.id)) {
flags = StorageManager.FLAG_STORAGE_DE; flags = StorageManager.FLAG_STORAGE_DE;

View File

@@ -80,6 +80,7 @@ import android.os.UserManager;
import android.os.UserManager.EnforcingUser; import android.os.UserManager.EnforcingUser;
import android.os.UserManager.QuietModeFlag; import android.os.UserManager.QuietModeFlag;
import android.os.storage.StorageManager; import android.os.storage.StorageManager;
import android.os.storage.StorageManagerInternal;
import android.provider.Settings; import android.provider.Settings;
import android.security.GateKeeper; import android.security.GateKeeper;
import android.service.gatekeeper.IGateKeeperService; import android.service.gatekeeper.IGateKeeperService;
@@ -4815,6 +4816,10 @@ public class UserManagerService extends IUserManager.Stub {
// Migrate only if build fingerprints mismatch // Migrate only if build fingerprints mismatch
boolean migrateAppsData = !Build.FINGERPRINT.equals(userInfo.lastLoggedInFingerprint); boolean migrateAppsData = !Build.FINGERPRINT.equals(userInfo.lastLoggedInFingerprint);
mUserDataPreparer.prepareUserData(userId, userSerial, StorageManager.FLAG_STORAGE_CE); mUserDataPreparer.prepareUserData(userId, userSerial, StorageManager.FLAG_STORAGE_CE);
StorageManagerInternal smInternal = LocalServices.getService(StorageManagerInternal.class);
smInternal.markCeStoragePrepared(userId);
mPm.reconcileAppsData(userId, StorageManager.FLAG_STORAGE_CE, migrateAppsData); mPm.reconcileAppsData(userId, StorageManager.FLAG_STORAGE_CE, migrateAppsData);
} }