]> git.proxmox.com Git - mirror_zfs.git/blobdiff - module/zfs/dsl_dir.c
Illumos 6171 - dsl_prop_unregister() slows down dataset eviction.
[mirror_zfs.git] / module / zfs / dsl_dir.c
index ba6c24486463cb3819b1678d5b33738de3375875..2c521e285baf1241635c8eb847fe5b84fdd83bcd 100644 (file)
@@ -147,11 +147,7 @@ dsl_dir_evict(void *dbu)
 
        spa_async_close(dd->dd_pool->dp_spa, dd);
 
-       /*
-        * The props callback list should have been cleaned up by
-        * objset_evict().
-        */
-       list_destroy(&dd->dd_prop_cbs);
+       dsl_prop_fini(dd);
        mutex_destroy(&dd->dd_lock);
        kmem_free(dd, sizeof (dsl_dir_t));
 }
@@ -186,9 +182,7 @@ dsl_dir_hold_obj(dsl_pool_t *dp, uint64_t ddobj,
                dd->dd_dbuf = dbuf;
                dd->dd_pool = dp;
                mutex_init(&dd->dd_lock, NULL, MUTEX_DEFAULT, NULL);
-
-               list_create(&dd->dd_prop_cbs, sizeof (dsl_prop_cb_record_t),
-                   offsetof(dsl_prop_cb_record_t, cbr_node));
+               dsl_prop_init(dd);
 
                dsl_dir_snap_cmtime_update(dd);
 
@@ -246,6 +240,7 @@ dsl_dir_hold_obj(dsl_pool_t *dp, uint64_t ddobj,
                if (winner != NULL) {
                        if (dd->dd_parent)
                                dsl_dir_rele(dd->dd_parent, dd);
+                       dsl_prop_fini(dd);
                        mutex_destroy(&dd->dd_lock);
                        kmem_free(dd, sizeof (dsl_dir_t));
                        dd = winner;
@@ -273,6 +268,7 @@ dsl_dir_hold_obj(dsl_pool_t *dp, uint64_t ddobj,
 errout:
        if (dd->dd_parent)
                dsl_dir_rele(dd->dd_parent, dd);
+       dsl_prop_fini(dd);
        mutex_destroy(&dd->dd_lock);
        kmem_free(dd, sizeof (dsl_dir_t));
        dmu_buf_rele(dbuf, tag);