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

Commit a31460ce authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Start primary storage move outside lock.

Otherwise there is a potential deadlock when an unsolicited event
arrives from vold while we're still waiting for the move operation
to be processed.

The safe fix here is to kick off the move after dropping the lock.

Bug: 29501052
Change-Id: I2160c6a7a19c1d9981c692a2be2b04019352db2e
parent 94a20367
Loading
Loading
Loading
Loading
+12 −8
Original line number Diff line number Diff line
@@ -2030,6 +2030,9 @@ class MountService extends IMountService.Stub
        enforcePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS);
        waitForReady();

        final VolumeInfo from;
        final VolumeInfo to;

        synchronized (mLock) {
            if (Objects.equals(mPrimaryStorageUuid, volumeUuid)) {
                throw new IllegalArgumentException("Primary storage already at " + volumeUuid);
@@ -2049,10 +2052,11 @@ class MountService extends IMountService.Stub
                onMoveStatusLocked(MOVE_STATUS_COPY_FINISHED);
                onMoveStatusLocked(PackageManager.MOVE_SUCCEEDED);
                mHandler.obtainMessage(H_RESET).sendToTarget();
                return;

            } else {
                final VolumeInfo from = findStorageForUuid(mPrimaryStorageUuid);
                final VolumeInfo to = findStorageForUuid(volumeUuid);
                from = findStorageForUuid(mPrimaryStorageUuid);
                to = findStorageForUuid(volumeUuid);

                if (from == null) {
                    Slog.w(TAG, "Failing move due to missing from volume " + mPrimaryStorageUuid);
@@ -2063,6 +2067,8 @@ class MountService extends IMountService.Stub
                    onMoveStatusLocked(PackageManager.MOVE_FAILED_INTERNAL_ERROR);
                    return;
                }
            }
        }

        try {
            mConnector.execute("volume", "move_storage", from.id, to.id);
@@ -2070,8 +2076,6 @@ class MountService extends IMountService.Stub
            throw e.rethrowAsParcelableException();
        }
    }
        }
    }

    @Override
    public int[] getStorageUsers(String path) {