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

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

Wait for first scan before partitioning is done.

This means newly created volumes are at least created for other
platform components to start poking with.

Bug: 19993667
Change-Id: I561a5d0e3659ff9146832aeb6a31ab78fd9da580
parent d709e411
Loading
Loading
Loading
Loading
+47 −5
Original line number Diff line number Diff line
@@ -215,7 +215,7 @@ class MountService extends IMountService.Stub
        public static final int DISK_CREATED = 640;
        public static final int DISK_SIZE_CHANGED = 641;
        public static final int DISK_LABEL_CHANGED = 642;
        public static final int DISK_UNSUPPORTED = 643;
        public static final int DISK_SCANNED = 643;
        public static final int DISK_DESTROYED = 649;

        public static final int VOLUME_CREATED = 650;
@@ -303,6 +303,10 @@ class MountService extends IMountService.Stub
    @GuardedBy("mLock")
    private ArrayMap<String, VolumeMetadata> mMetadata = new ArrayMap<>();

    /** Map from disk ID to latches */
    @GuardedBy("mLock")
    private ArrayMap<String, CountDownLatch> mDiskScanLatches = new ArrayMap<>();

    private DiskInfo findDiskById(String id) {
        synchronized (mLock) {
            final DiskInfo disk = mDisks.get(id);
@@ -345,6 +349,17 @@ class MountService extends IMountService.Stub
        return meta;
    }

    private CountDownLatch findOrCreateDiskScanLatch(String diskId) {
        synchronized (mLock) {
            CountDownLatch latch = mDiskScanLatches.get(diskId);
            if (latch == null) {
                latch = new CountDownLatch(1);
                mDiskScanLatches.put(diskId, latch);
            }
            return latch;
        }
    }

    private static int sNextMtpIndex = 1;

    private static int allocateMtpIndex(String volId) {
@@ -620,7 +635,7 @@ class MountService extends IMountService.Stub
    }

    private void waitForLatch(CountDownLatch latch, String condition) {
        for (;;) {
        while (true) {
            try {
                if (latch.await(5000, TimeUnit.MILLISECONDS)) {
                    return;
@@ -629,7 +644,7 @@ class MountService extends IMountService.Stub
                            + " still waiting for " + condition + "...");
                }
            } catch (InterruptedException e) {
                Slog.w(TAG, "Interrupt while waiting for MountService to be ready.");
                Slog.w(TAG, "Interrupt while waiting for " + condition);
            }
        }
    }
@@ -831,10 +846,12 @@ class MountService extends IMountService.Stub
                }
                break;
            }
            case VoldResponseCode.DISK_UNSUPPORTED: {
            case VoldResponseCode.DISK_SCANNED: {
                if (cooked.length != 2) break;
                final DiskInfo disk = mDisks.get(cooked[1]);
                mCallbacks.notifyDiskUnsupported(disk);
                if (disk != null) {
                    onDiskScannedLocked(disk);
                }
                break;
            }
            case VoldResponseCode.DISK_DESTROYED: {
@@ -922,6 +939,25 @@ class MountService extends IMountService.Stub
        return true;
    }

    private void onDiskScannedLocked(DiskInfo disk) {
        final CountDownLatch latch = mDiskScanLatches.remove(disk.id);
        if (latch != null) {
            latch.countDown();
        }

        boolean empty = true;
        for (int i = 0; i < mVolumes.size(); i++) {
            final VolumeInfo vol = mVolumes.valueAt(i);
            if (Objects.equals(disk.id, vol.getDiskId())) {
                empty = false;
            }
        }

        if (empty) {
            mCallbacks.notifyDiskUnsupported(disk);
        }
    }

    private void onVolumeCreatedLocked(VolumeInfo vol) {
        final boolean primaryPhysical = SystemProperties.getBoolean(
                StorageManager.PROP_PRIMARY_PHYSICAL, false);
@@ -1291,11 +1327,13 @@ class MountService extends IMountService.Stub
        enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS);
        waitForReady();

        final CountDownLatch latch = findOrCreateDiskScanLatch(diskId);
        try {
            mConnector.execute("volume", "partition", diskId, "public");
        } catch (NativeDaemonConnectorException e) {
            throw e.rethrowAsParcelableException();
        }
        waitForLatch(latch, "partitionPublic");
    }

    @Override
@@ -1303,11 +1341,13 @@ class MountService extends IMountService.Stub
        enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS);
        waitForReady();

        final CountDownLatch latch = findOrCreateDiskScanLatch(diskId);
        try {
            mConnector.execute("volume", "partition", diskId, "private");
        } catch (NativeDaemonConnectorException e) {
            throw e.rethrowAsParcelableException();
        }
        waitForLatch(latch, "partitionPrivate");
    }

    @Override
@@ -1315,11 +1355,13 @@ class MountService extends IMountService.Stub
        enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS);
        waitForReady();

        final CountDownLatch latch = findOrCreateDiskScanLatch(diskId);
        try {
            mConnector.execute("volume", "partition", diskId, "mixed", ratio);
        } catch (NativeDaemonConnectorException e) {
            throw e.rethrowAsParcelableException();
        }
        waitForLatch(latch, "partitionMixed");
    }

    @Override