aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Caputi <tcaputi@datto.com>2018-11-07 23:38:10 +0000
committerBrian Behlendorf <behlendorf1@llnl.gov>2018-11-07 23:38:10 +0000
commitac53e50f799b39d9cd04e5ecc0a6552c9490c84a (patch)
treec427e7d429dedd9057bffb2646d0411d8b67a250
parent4021ba4cfaa861602ae75d45713224d5a7866004 (diff)
downloadsrc-ac53e50f799b39d9cd04e5ecc0a6552c9490c84a.tar.gz
src-ac53e50f799b39d9cd04e5ecc0a6552c9490c84a.zip
Fix vdev removal finishing race
This patch fixes a race condition where the end of vdev_remove_replace_with_indirect(), which holds svr_lock, would race against spa_vdev_removal_destroy(), which destroys the same lock and is called asynchronously via dsl_sync_task_nowait(). Reviewed-by: Matthew Ahrens <mahrens@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Tom Caputi <tcaputi@datto.com> Issue #6900 Closes #8083
-rw-r--r--module/zfs/vdev_removal.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/module/zfs/vdev_removal.c b/module/zfs/vdev_removal.c
index 4e4a6c4f5a25..c259b5a1b45c 100644
--- a/module/zfs/vdev_removal.c
+++ b/module/zfs/vdev_removal.c
@@ -1115,19 +1115,16 @@ vdev_remove_replace_with_indirect(vdev_t *vd, uint64_t txg)
ASSERT(!list_link_active(&vd->vdev_state_dirty_node));
- tx = dmu_tx_create_assigned(spa->spa_dsl_pool, txg);
- dsl_sync_task_nowait(spa->spa_dsl_pool, vdev_remove_complete_sync, svr,
- 0, ZFS_SPACE_CHECK_NONE, tx);
- dmu_tx_commit(tx);
-
- /*
- * Indicate that this thread has exited.
- * After this, we can not use svr.
- */
mutex_enter(&svr->svr_lock);
svr->svr_thread = NULL;
cv_broadcast(&svr->svr_cv);
mutex_exit(&svr->svr_lock);
+
+ /* After this, we can not use svr. */
+ tx = dmu_tx_create_assigned(spa->spa_dsl_pool, txg);
+ dsl_sync_task_nowait(spa->spa_dsl_pool, vdev_remove_complete_sync, svr,
+ 0, ZFS_SPACE_CHECK_NONE, tx);
+ dmu_tx_commit(tx);
}
/*