Index: spa.c =================================================================== --- spa.c (revision 253644) +++ spa.c (working copy) @@ -5763,6 +5763,7 @@ spa_async_thread(void *arg) mutex_enter(&spa->spa_async_lock); tasks = spa->spa_async_tasks; +retry: spa->spa_async_tasks = 0; mutex_exit(&spa->spa_async_lock); @@ -5833,6 +5834,9 @@ spa_async_thread(void *arg) * 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 = NULL; cv_broadcast(&spa->spa_async_cv); mutex_exit(&spa->spa_async_lock); @@ -5898,6 +5902,9 @@ spa_async_request(spa_t *spa, int task) mutex_enter(&spa->spa_async_lock); spa->spa_async_tasks |= task; mutex_exit(&spa->spa_async_lock); + if ((task & SPA_ASYNC_REMOVE) != 0 && + spa->spa_state != POOL_STATE_UNINITIALIZED) + spa_async_dispatch(spa); } /*