]> granicus.if.org Git - zfs/commitdiff
Illumos 4975 - missing mutex_destroy() calls in zfs
authorJorgen Lundman <lundman@lundman.net>
Wed, 1 Apr 2015 13:49:14 +0000 (00:49 +1100)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 28 Apr 2015 23:23:38 +0000 (16:23 -0700)
4975 missing mutex_destroy() calls in zfs
Author: Jorgen Lundman <lundman@lundman.net>
Reviewed by: Matthew Ahrens <matthew.ahrens@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Rich Lowe <richlowe@richlowe.net>
Reviewed by: Seth Nimbosa <darth.Serious@gmail.com>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Don Brady <dev.fs.zfs@gmail.com>
Approved by: Dan McDonald <danmcd@omniti.com>

References:
  https://www.illumos.org/issues/4975
  https://github.com/illumos/illumos-gate/commit/d2b3cbb

Ported-by: Chris Dunlop <chris@onthe.net.au>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
module/zfs/dbuf.c
module/zfs/dnode.c
module/zfs/dnode_sync.c
module/zfs/dsl_dataset.c
module/zfs/sa.c

index ed6a8fd2a4dc1b59f75321625759cbe9580835dc..f5327a34aa4432e0f3ac8ac0ac9f28b782e2aacc 100644 (file)
@@ -1423,6 +1423,12 @@ dbuf_undirty(dmu_buf_impl_t *db, dmu_tx_t *tx)
                if (dr->dt.dl.dr_data != db->db_buf)
                        VERIFY(arc_buf_remove_ref(dr->dt.dl.dr_data, db));
        }
+
+       if (db->db_level != 0) {
+               mutex_destroy(&dr->dt.di.dr_mtx);
+               list_destroy(&dr->dt.di.dr_children);
+       }
+
        kmem_free(dr, sizeof (dbuf_dirty_record_t));
 
        ASSERT(db->db_dirtycnt > 0);
index ef74621a0f6ce60e24d11ab1fec51082933594d4..815696f702180ffb4080c5617fee923cc9633150 100644 (file)
@@ -1079,6 +1079,11 @@ dnode_hold_impl(objset_t *os, uint64_t object, int flag,
                }
                if ((winner = dmu_buf_set_user(&db->db, children_dnodes, NULL,
                    dnode_buf_pageout))) {
+
+                       for (i = 0; i < epb; i++) {
+                               zrl_destroy(&dnh[i].dnh_zrlock);
+                       }
+
                        kmem_free(children_dnodes, sizeof (dnode_children_t) +
                            (epb - 1) * sizeof (dnode_handle_t));
                        children_dnodes = winner;
index 1825e983551c7c2a0a0680b8af7971ecdd3bb610..9779c51ef324d5e6daf165462369d89aa5c08f07 100644 (file)
@@ -491,6 +491,9 @@ dnode_undirty_dbufs(list_t *list)
                        ASSERT(db->db_blkid == DMU_BONUS_BLKID ||
                            dr->dt.dl.dr_data == db->db_buf);
                        dbuf_unoverride(dr);
+               } else {
+                       mutex_destroy(&dr->dt.di.dr_mtx);
+                       list_destroy(&dr->dt.di.dr_children);
                }
                kmem_free(dr, sizeof (dbuf_dirty_record_t));
                dbuf_rele_and_unlock(db, (void *)(uintptr_t)txg);
index 34c473006df872bd73d368caf3e6e77dc973b242..5f2e205d925368e004f1116ae8b31b86c5dc20ab 100644 (file)
@@ -267,6 +267,7 @@ dsl_dataset_evict(dmu_buf_t *db, void *dsv)
 
        mutex_destroy(&ds->ds_lock);
        mutex_destroy(&ds->ds_opening_lock);
+       mutex_destroy(&ds->ds_sendstream_lock);
        refcount_destroy(&ds->ds_longholds);
 
        kmem_free(ds, sizeof (dsl_dataset_t));
@@ -396,6 +397,7 @@ dsl_dataset_hold_obj(dsl_pool_t *dp, uint64_t dsobj, void *tag,
                if (err != 0) {
                        mutex_destroy(&ds->ds_lock);
                        mutex_destroy(&ds->ds_opening_lock);
+                       mutex_destroy(&ds->ds_sendstream_lock);
                        refcount_destroy(&ds->ds_longholds);
                        bplist_destroy(&ds->ds_pending_deadlist);
                        dsl_deadlist_close(&ds->ds_deadlist);
@@ -452,6 +454,7 @@ dsl_dataset_hold_obj(dsl_pool_t *dp, uint64_t dsobj, void *tag,
                        dsl_dir_rele(ds->ds_dir, ds);
                        mutex_destroy(&ds->ds_lock);
                        mutex_destroy(&ds->ds_opening_lock);
+                       mutex_destroy(&ds->ds_sendstream_lock);
                        refcount_destroy(&ds->ds_longholds);
                        kmem_free(ds, sizeof (dsl_dataset_t));
                        if (err != 0) {
index 9063d1dae44955ee05e1564fe8a4610a067c73d0..7b6c7177d90c7f03130d062cb8fae420dfd46a23 100644 (file)
@@ -1112,6 +1112,9 @@ fail:
        if (sa->sa_user_table)
                kmem_free(sa->sa_user_table, sa->sa_user_table_sz);
        mutex_exit(&sa->sa_lock);
+       avl_destroy(&sa->sa_layout_hash_tree);
+       avl_destroy(&sa->sa_layout_num_tree);
+       mutex_destroy(&sa->sa_lock);
        kmem_free(sa, sizeof (sa_os_t));
        return ((error == ECKSUM) ? EIO : error);
 }
@@ -1148,6 +1151,7 @@ sa_tear_down(objset_t *os)
 
        avl_destroy(&sa->sa_layout_hash_tree);
        avl_destroy(&sa->sa_layout_num_tree);
+       mutex_destroy(&sa->sa_lock);
 
        kmem_free(sa, sizeof (sa_os_t));
        os->os_sa = NULL;