--- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c +++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c @@ -904,7 +904,8 @@ ASSERT(spa->spa_state != POOL_STATE_UNINITIALIZED); /* - * Stop TRIM thread. + * Stop TRIM thread in case spa_unload() wasn't called directly + * before spa_deactivate(). */ trim_thread_destroy(spa); @@ -1024,6 +1025,11 @@ ASSERT(MUTEX_HELD(&spa_namespace_lock)); /* + * Stop TRIM thread. + */ + trim_thread_destroy(spa); + + /* * Stop async tasks. */ spa_async_suspend(spa); --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/trim_map.c +++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/trim_map.c @@ -501,6 +501,7 @@ /* The thread will set it back to != NULL on exit. */ while (spa->spa_trim_thread == NULL) cv_wait(&spa->spa_trim_cv, &spa->spa_trim_lock); + spa->spa_trim_thread = NULL; mutex_exit(&spa->spa_trim_lock); cv_destroy(&spa->spa_trim_cv); @@ -513,6 +514,8 @@ if (zfs_notrim) return; + if (spa->spa_trim_thread == NULL) + return; mutex_enter(&spa->spa_trim_lock); cv_signal(&spa->spa_trim_cv);