Mercurial > illumos > illumos-gate
changeset 9997:174d75a29a1c
6843235 zpool resilver stalls with spa_scrub_thread in a 3 way deadlock
author | George Wilson <George.Wilson@Sun.COM> |
---|---|
date | Mon, 29 Jun 2009 22:20:35 -0700 |
parents | c439ba713aee |
children | 5f6596ec3328 |
files | usr/src/uts/common/fs/zfs/dsl_scrub.c |
diffstat | 1 files changed, 7 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/common/fs/zfs/dsl_scrub.c Mon Jun 29 22:03:21 2009 -0700 +++ b/usr/src/uts/common/fs/zfs/dsl_scrub.c Mon Jun 29 22:20:35 2009 -0700 @@ -1024,6 +1024,8 @@ int dsl_pool_scrub_clean(dsl_pool_t *dp) { + spa_t *spa = dp->dp_spa; + /* * Purge all vdev caches. We do this here rather than in sync * context because this requires a writer lock on the spa_config @@ -1031,11 +1033,11 @@ * spa_scrub_reopen flag indicates that vdev_open() should not * attempt to start another scrub. */ - spa_config_enter(dp->dp_spa, SCL_ALL, FTAG, RW_WRITER); - dp->dp_spa->spa_scrub_reopen = B_TRUE; - vdev_reopen(dp->dp_spa->spa_root_vdev); - dp->dp_spa->spa_scrub_reopen = B_FALSE; - spa_config_exit(dp->dp_spa, SCL_ALL, FTAG); + spa_vdev_state_enter(spa); + spa->spa_scrub_reopen = B_TRUE; + vdev_reopen(spa->spa_root_vdev); + spa->spa_scrub_reopen = B_FALSE; + (void) spa_vdev_state_exit(spa, NULL, 0); return (dsl_pool_scrub_setup(dp, SCRUB_FUNC_CLEAN)); }