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));
 }