Fix vdev_rebuild_thread deadlock
The metaslab_disable() call may block waiting for a txg sync. Therefore it's important that vdev_rebuild_thread release the SCL_CONFIG read lock it is holding before this call. Failure to do so can result in the txg_sync thread getting blocked waiting for this lock which results in a deadlock. Reviewed-by: Mark Maybee <mark.maybee@delphix.com> Reviewd-by: Srikanth N S <srikanth.nagasubbaraoseetharaman@hpe.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #11647
This commit is contained in:
parent
75a089ed34
commit
8e43fa12c5
|
@ -807,8 +807,8 @@ vdev_rebuild_thread(void *arg)
|
||||||
ASSERT0(range_tree_space(vr->vr_scan_tree));
|
ASSERT0(range_tree_space(vr->vr_scan_tree));
|
||||||
|
|
||||||
/* Disable any new allocations to this metaslab */
|
/* Disable any new allocations to this metaslab */
|
||||||
metaslab_disable(msp);
|
|
||||||
spa_config_exit(spa, SCL_CONFIG, FTAG);
|
spa_config_exit(spa, SCL_CONFIG, FTAG);
|
||||||
|
metaslab_disable(msp);
|
||||||
|
|
||||||
mutex_enter(&msp->ms_sync_lock);
|
mutex_enter(&msp->ms_sync_lock);
|
||||||
mutex_enter(&msp->ms_lock);
|
mutex_enter(&msp->ms_lock);
|
||||||
|
|
Loading…
Reference in New Issue