Print this page
patch first-pass

@@ -268,20 +268,28 @@
 
         return (B_TRUE);
 }
 
 static void
+dsl_dataset_evict_prep(void *dbu)
+{
+        dsl_dataset_t *ds = dbu;
+
+        ASSERT(ds->ds_owner == NULL);
+
+        unique_remove(ds->ds_fsid_guid);
+}
+
+static void
 dsl_dataset_evict(void *dbu)
 {
         dsl_dataset_t *ds = dbu;
 
         ASSERT(ds->ds_owner == NULL);
 
         ds->ds_dbuf = NULL;
 
-        unique_remove(ds->ds_fsid_guid);
-
         if (ds->ds_objset != NULL)
                 dmu_objset_evict(ds->ds_objset);
 
         if (ds->ds_prev) {
                 dsl_dataset_rele(ds->ds_prev, ds);

@@ -510,11 +518,12 @@
                         }
                 } else {
                         ds->ds_reserved = ds->ds_quota = 0;
                 }
 
-                dmu_buf_init_user(&ds->ds_dbu, dsl_dataset_evict, &ds->ds_dbuf);
+                dmu_buf_init_user(&ds->ds_dbu, dsl_dataset_evict_prep,
+                    dsl_dataset_evict, &ds->ds_dbuf);
                 if (err == 0)
                         winner = dmu_buf_set_user_ie(dbuf, &ds->ds_dbu);
 
                 if (err != 0 || winner != NULL) {
                         bplist_destroy(&ds->ds_pending_deadlist);