diff --git a/lib/private/Files/Mount/Manager.php b/lib/private/Files/Mount/Manager.php index 72b38f38575b7..3d586ba4c5911 100644 --- a/lib/private/Files/Mount/Manager.php +++ b/lib/private/Files/Mount/Manager.php @@ -20,6 +20,7 @@ class Manager implements IMountManager { /** @var array */ private array $mounts = []; + private array $mountsByProvider = []; private bool $areMountsSorted = false; /** @var list|null $mountKeys */ private ?array $mountKeys = null; @@ -36,7 +37,11 @@ public function __construct(SetupManagerFactory $setupManagerFactory) { } public function addMount(IMountPoint $mount): void { - $this->mounts[$mount->getMountPoint()] = $mount; + $mountPoint = $mount->getMountPoint(); + $mountProvider = $mount->getMountProvider(); + $this->mounts[$mountPoint] = $mount; + $this->mountsByProvider[$mountProvider] ??= []; + $this->mountsByProvider[$mountProvider][$mountPoint] = $mount; $this->pathCache->clear(); $this->inPathCache->clear(); $this->areMountsSorted = false; @@ -167,6 +172,7 @@ private function binarySearch(array $sortedArray, array $sortedKeys, string $pre public function clear(): void { $this->mounts = []; + $this->mountsByProvider = []; $this->pathCache->clear(); $this->inPathCache->clear(); } @@ -236,15 +242,18 @@ public function getSetupManager(): SetupManager { * @param string[] $mountProviders * @return array */ - public function getMountsByMountProvider(string $path, array $mountProviders) { + public function getMountsByMountProvider(string $path, array $mountProviders): array { $this->getSetupManager()->setupForProvider($path, $mountProviders); - if (in_array('', $mountProviders)) { + if (\in_array('', $mountProviders)) { return $this->mounts; - } else { - return array_filter($this->mounts, function ($mount) use ($mountProviders) { - return in_array($mount->getMountProvider(), $mountProviders); - }); } + + $mounts = []; + foreach ($mountProviders as $mountProvider) { + $mounts[] = $this->mountsByProvider[$mountProvider] ?? []; + } + + return array_merge(...$mounts); } /**