Mercurial > illumos > illumos-gate
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);