Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0c191606 authored by Eric Biggers's avatar Eric Biggers Committed by Automerger Merge Worker
Browse files

Merge "Unmount unusable partition instead of putting device into crashloop."...

Merge "Unmount unusable partition instead of putting device into crashloop." into main am: 0dcb0da5

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



Change-Id: Icacc25df72206c02e008f49928b398745a8c0d96
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 6d8c2a63 0dcb0da5
Loading
Loading
Loading
Loading
+25 −11
Original line number Diff line number Diff line
@@ -1735,6 +1735,23 @@ class StorageManagerService extends IStorageManager.Stub
    }

    private void onVolumeStateChangedAsync(VolumeInfo vol, int oldState, int newState) {
        if (newState == VolumeInfo.STATE_MOUNTED) {
            // Private volumes can be unmounted and re-mounted even after a user has
            // been unlocked; on devices that support encryption keys tied to the filesystem,
            // this requires setting up the keys again.
            try {
                prepareUserStorageIfNeeded(vol);
            } catch (Exception e) {
                // Unusable partition, unmount.
                try {
                    mVold.unmount(vol.id);
                } catch (Exception ee) {
                    Slog.wtf(TAG, ee);
                }
                return;
            }
        }

        synchronized (mLock) {
            // Remember that we saw this volume so we're ready to accept user
            // metadata, or so we can annoy them when a private volume is ejected
@@ -1760,13 +1777,6 @@ class StorageManagerService extends IStorageManager.Stub
            }
        }

        if (newState == VolumeInfo.STATE_MOUNTED) {
            // Private volumes can be unmounted and re-mounted even after a user has
            // been unlocked; on devices that support encryption keys tied to the filesystem,
            // this requires setting up the keys again.
            prepareUserStorageIfNeeded(vol);
        }

        // This is a blocking call to Storage Service which needs to process volume state changed
        // before notifying other listeners.
        // Intentionally called without the mLock to avoid deadlocking from the Storage Service.
@@ -3355,7 +3365,7 @@ class StorageManagerService extends IStorageManager.Stub
        }
    }

    private void prepareUserStorageIfNeeded(VolumeInfo vol) {
    private void prepareUserStorageIfNeeded(VolumeInfo vol) throws Exception {
        if (vol.type != VolumeInfo.TYPE_PRIVATE) {
            return;
        }
@@ -3382,11 +3392,15 @@ class StorageManagerService extends IStorageManager.Stub
    public void prepareUserStorage(String volumeUuid, int userId, int serialNumber, int flags) {
        enforcePermission(android.Manifest.permission.STORAGE_INTERNAL);

        try {
            prepareUserStorageInternal(volumeUuid, userId, serialNumber, flags);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private void prepareUserStorageInternal(String volumeUuid, int userId, int serialNumber,
            int flags) {
            int flags) throws Exception {
        try {
            mVold.prepareUserStorage(volumeUuid, userId, serialNumber, flags);
            // After preparing user storage, we should check if we should mount data mirror again,
@@ -3413,7 +3427,7 @@ class StorageManagerService extends IStorageManager.Stub
                        + "; device may be insecure!");
                return;
            }
            throw new RuntimeException(e);
            throw e;
        }
    }