diff usr/src/uts/common/fs/zfs/dsl_dataset.c @ 6975:c511f317869e

6717522 panic in dmu_objset_stats() due to freed objset_impl_t
author maybee
date Fri, 27 Jun 2008 14:18:08 -0700
parents 47572a2f5e73
children 20c04e18c58c
line wrap: on
line diff
--- a/usr/src/uts/common/fs/zfs/dsl_dataset.c	Fri Jun 27 14:06:49 2008 -0700
+++ b/usr/src/uts/common/fs/zfs/dsl_dataset.c	Fri Jun 27 14:18:08 2008 -0700
@@ -978,6 +978,13 @@
 	if (err != ESRCH)
 		goto out;
 
+	rw_enter(&dd->dd_pool->dp_config_rwlock, RW_READER);
+	err = dsl_dir_open_obj(dd->dd_pool, dd->dd_object, NULL, FTAG, &dd);
+	rw_exit(&dd->dd_pool->dp_config_rwlock);
+
+	if (err)
+		goto out;
+
 	if (ds->ds_user_ptr) {
 		/*
 		 * We need to sync out all in-flight IO before we try
@@ -985,21 +992,16 @@
 		 * the cached entries for this dataset in the ARC).
 		 */
 		txg_wait_synced(dd->dd_pool, 0);
-		ds->ds_user_evict_func(ds, ds->ds_user_ptr);
-		ds->ds_user_ptr = NULL;
 	}
 
-	rw_enter(&dd->dd_pool->dp_config_rwlock, RW_READER);
-	err = dsl_dir_open_obj(dd->dd_pool, dd->dd_object, NULL, FTAG, &dd);
-	rw_exit(&dd->dd_pool->dp_config_rwlock);
-
-	if (err)
-		goto out;
-
 	/*
 	 * Blow away the dsl_dir + head dataset.
 	 */
 	dsl_dataset_make_exclusive(ds, tag);
+	if (ds->ds_user_ptr) {
+		ds->ds_user_evict_func(ds, ds->ds_user_ptr);
+		ds->ds_user_ptr = NULL;
+	}
 	dstg = dsl_sync_task_group_create(ds->ds_dir->dd_pool);
 	dsl_sync_task_create(dstg, dsl_dataset_destroy_check,
 	    dsl_dataset_destroy_sync, ds, tag, 0);