Deleted Added
full compact
5766c5766
< spa->spa_async_tasks = 0;
---
> spa->spa_async_tasks &= SPA_ASYNC_REMOVE;
5792,5804d5791
< /*
< * See if any devices need to be marked REMOVED.
< */
< if (tasks & SPA_ASYNC_REMOVE) {
< spa_vdev_state_enter(spa, SCL_NONE);
< spa_async_remove(spa, spa->spa_root_vdev);
< for (int i = 0; i < spa->spa_l2cache.sav_count; i++)
< spa_async_remove(spa, spa->spa_l2cache.sav_vdevs[i]);
< for (int i = 0; i < spa->spa_spares.sav_count; i++)
< spa_async_remove(spa, spa->spa_spares.sav_vdevs[i]);
< (void) spa_vdev_state_exit(spa, NULL, 0);
< }
<
5841a5829,5868
> static void
> spa_async_thread_vd(void *arg)
> {
> spa_t *spa = arg;
> int tasks;
>
> ASSERT(spa->spa_sync_on);
>
> mutex_enter(&spa->spa_async_lock);
> tasks = spa->spa_async_tasks;
> retry:
> spa->spa_async_tasks &= ~SPA_ASYNC_REMOVE;
> mutex_exit(&spa->spa_async_lock);
>
> /*
> * See if any devices need to be marked REMOVED.
> */
> if (tasks & SPA_ASYNC_REMOVE) {
> spa_vdev_state_enter(spa, SCL_NONE);
> spa_async_remove(spa, spa->spa_root_vdev);
> for (int i = 0; i < spa->spa_l2cache.sav_count; i++)
> spa_async_remove(spa, spa->spa_l2cache.sav_vdevs[i]);
> for (int i = 0; i < spa->spa_spares.sav_count; i++)
> spa_async_remove(spa, spa->spa_spares.sav_vdevs[i]);
> (void) spa_vdev_state_exit(spa, NULL, 0);
> }
>
> /*
> * Let the world know that we're done.
> */
> mutex_enter(&spa->spa_async_lock);
> tasks = spa->spa_async_tasks;
> if ((tasks & SPA_ASYNC_REMOVE) != 0)
> goto retry;
> spa->spa_async_thread_vd = NULL;
> cv_broadcast(&spa->spa_async_cv);
> mutex_exit(&spa->spa_async_lock);
> thread_exit();
> }
>
5847c5874,5875
< while (spa->spa_async_thread != NULL)
---
> while (spa->spa_async_thread != NULL &&
> spa->spa_async_thread_vd != NULL)
5868c5896,5897
< non_config_tasks = spa->spa_async_tasks & ~SPA_ASYNC_CONFIG_UPDATE;
---
> non_config_tasks = spa->spa_async_tasks & ~(SPA_ASYNC_CONFIG_UPDATE |
> SPA_ASYNC_REMOVE);
5893a5923,5935
> static void
> spa_async_dispatch_vd(spa_t *spa)
> {
> mutex_enter(&spa->spa_async_lock);
> if ((spa->spa_async_tasks & SPA_ASYNC_REMOVE) != 0 &&
> !spa->spa_async_suspended &&
> spa->spa_async_thread_vd == NULL &&
> rootdir != NULL)
> spa->spa_async_thread_vd = thread_create(NULL, 0,
> spa_async_thread_vd, spa, 0, &p0, TS_RUN, maxclsyspri);
> mutex_exit(&spa->spa_async_lock);
> }
>
5900a5943
> spa_async_dispatch_vd(spa);
6488a6532
> spa_async_dispatch_vd(spa);