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

Commit aba0a551 authored by Alex Buynytskyy's avatar Alex Buynytskyy Committed by Eric Biggers
Browse files

Unmount unusable partition instead of putting device into crashloop.

Bug: 233902887
Test: presubmit
Change-Id: I91963f4fcde27656e1a253d6181e4d81b02b26fe
Merged-In: I91963f4fcde27656e1a253d6181e4d81b02b26fe
(cherry picked from commit 335f4714)
parent 7507728a
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;
        }
    }