@@ -236,6 +236,8 @@ public function setupForUser(IUser $user): void {
236236
237237 $ this ->eventLogger ->start ('fs:setup:user:full ' , 'Setup full filesystem for user ' );
238238
239+ $ this ->dropPartialMountsForUser ($ user );
240+
239241 $ this ->setupUserMountProviders [$ user ->getUID ()] ??= [];
240242 $ previouslySetupProviders = $ this ->setupUserMountProviders [$ user ->getUID ()];
241243
@@ -656,6 +658,7 @@ public function setupForProvider(string $path, array $providers): void {
656658 $ this ->eventLogger ->end ('fs:setup:user:providers ' );
657659 return ;
658660 } else {
661+ $ this ->dropPartialMountsForUser ($ user , $ providers );
659662 $ this ->setupUserMountProviders [$ user ->getUID ()] = array_merge ($ setupProviders , $ providers );
660663 $ mounts = $ this ->mountProviderCollection ->getUserMountsForProviderClasses ($ user , $ providers );
661664 }
@@ -739,4 +742,39 @@ private function registerMounts(IUser $user, array $mounts, ?array $mountProvide
739742 $ this ->userMountCache ->registerMounts ($ user , $ mounts , $ mountProviderClasses );
740743 }
741744 }
745+
746+ /**
747+ * Drops partially set-up mounts for the given user
748+ * @param class-string<IMountProvider>[] $providers
749+ */
750+ public function dropPartialMountsForUser (IUser $ user , array $ providers = []): void {
751+ // mounts are cached by mount-point
752+ $ mounts = $ this ->mountManager ->getAll ();
753+ $ partialMounts = array_filter ($ this ->setupMountProviderPaths ,
754+ static function (string $ mountPoint ) use (
755+ $ providers ,
756+ $ user ,
757+ $ mounts
758+ ) {
759+ $ userMount = str_starts_with ($ mountPoint , '/ ' . $ user ->getUID () . '/files ' );
760+
761+ if (!$ userMount ) {
762+ return false ;
763+ }
764+
765+ $ mountProvider = ($ mounts [$ mountPoint ] ?? null )?->getMountProvider();
766+
767+ return empty ($ providers )
768+ || \in_array ($ mountProvider , $ providers , true );
769+ },
770+ ARRAY_FILTER_USE_KEY );
771+
772+ if (!empty ($ partialMounts )) {
773+ // remove partially set up mounts
774+ foreach ($ partialMounts as $ mountPoint => $ _mount ) {
775+ $ this ->mountManager ->removeMount ($ mountPoint );
776+ unset($ this ->setupMountProviderPaths [$ mountPoint ]);
777+ }
778+ }
779+ }
742780}
0 commit comments