diff options
author | Tom Caputi <[email protected]> | 2018-12-04 12:43:31 -0500 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2018-12-04 09:43:31 -0800 |
commit | 0b606cb33fd1c43a4eea416e48d81127373c20ea (patch) | |
tree | 60c1e81a4ec9d1f862ea337e518a59a7d31f3054 /cmd/ztest | |
parent | bdbd5477bcba03b1df1e02b3b89e795c99e2f4c8 (diff) |
Fix ztest deadlock in ztest_zil_remount()
This patch fixes a small race condition in ztest_zil_remount()
that could result in a deadlock. ztest_device_removal() calls
spa_vdev_remove() which may eventually call spa_reset_logs().
If ztest_zil_remount() attempts to call zil_close() while this
is happening, it may fail when it asserts !zilog_is_dirty(zilog).
This patch simply adds locking to correct the issue.
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Tom Caputi <[email protected]>
Closes #8154
Diffstat (limited to 'cmd/ztest')
-rw-r--r-- | cmd/ztest/ztest.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/cmd/ztest/ztest.c b/cmd/ztest/ztest.c index 111d45b9d..0d9495a28 100644 --- a/cmd/ztest/ztest.c +++ b/cmd/ztest/ztest.c @@ -2674,6 +2674,13 @@ ztest_zil_remount(ztest_ds_t *zd, uint64_t id) objset_t *os = zd->zd_os; /* + * We hold the ztest_vdev_lock so we don't cause problems with + * other threads that wish to remove a log device, such as + * ztest_device_removal(). + */ + mutex_enter(&ztest_vdev_lock); + + /* * We grab the zd_dirobj_lock to ensure that no other thread is * updating the zil (i.e. adding in-memory log records) and the * zd_zilog_lock to block any I/O. @@ -2690,6 +2697,7 @@ ztest_zil_remount(ztest_ds_t *zd, uint64_t id) (void) pthread_rwlock_unlock(&zd->zd_zilog_lock); mutex_exit(&zd->zd_dirobj_lock); + mutex_exit(&ztest_vdev_lock); } /* |