Fix secondary volume mounts on user switch
If a public volume is mounted when the foreground user is switched, the old user is stopped but the public volume isn't unmounted so the /mnt/user/<old user>/<volume> path still exists but is inaccessible, even after the foreground user is switched back the old user. Now, we remount the public volumes in such cases to fixup the mounts Test: Manual Bug: 183686263 Bug: 171460866 Change-Id: Ic1226229d377d7106bd78798a03adfc9b7f2efb6
This commit is contained in:
@@ -249,6 +249,8 @@ class StorageManagerService extends IStorageManager.Stub
|
||||
@Override
|
||||
public void onUserSwitching(@Nullable TargetUser from, @NonNull TargetUser to) {
|
||||
mStorageManagerService.mCurrentUserId = to.getUserIdentifier();
|
||||
// To reset public volume mounts
|
||||
mStorageManagerService.onUserSwitching(mStorageManagerService.mCurrentUserId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1218,6 +1220,28 @@ class StorageManagerService extends IStorageManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
private void onUserSwitching(int userId) {
|
||||
boolean reset = false;
|
||||
List<VolumeInfo> volumesToRemount = new ArrayList<>();
|
||||
synchronized (mLock) {
|
||||
for (int i = 0; i < mVolumes.size(); i++) {
|
||||
final VolumeInfo vol = mVolumes.valueAt(i);
|
||||
if (!vol.isPrimary() && vol.isMountedWritable() && vol.isVisible()
|
||||
&& vol.getMountUserId() != mCurrentUserId) {
|
||||
// If there's a visible secondary volume mounted,
|
||||
// we need to update the currentUserId and remount
|
||||
vol.mountUserId = mCurrentUserId;
|
||||
volumesToRemount.add(vol);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (VolumeInfo vol : volumesToRemount) {
|
||||
mHandler.obtainMessage(H_VOLUME_UNMOUNT, vol).sendToTarget();
|
||||
mHandler.obtainMessage(H_VOLUME_MOUNT, vol).sendToTarget();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean supportsBlockCheckpoint() throws RemoteException {
|
||||
enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS);
|
||||
return mVold.supportsBlockCheckpoint();
|
||||
|
||||
Reference in New Issue
Block a user