Print this page
5056 ZFS deadlock on db_mtx and dn_holds
Reviewed by: Will Andrews <willa@spectralogic.com>
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Approved by: Dan McDonald <danmcd@omniti.com>
        
@@ -19,10 +19,11 @@
  * CDDL HEADER END
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2011, 2014 by Delphix. All rights reserved.
+ * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
  */
 
 #include <sys/zio.h>
 #include <sys/spa.h>
 #include <sys/dmu.h>
@@ -385,11 +386,12 @@
         /*
          * Make sure that zap_ismicro is set before we let others see
          * it, because zap_lockdir() checks zap_ismicro without the lock
          * held.
          */
-        winner = dmu_buf_set_user(db, zap, zap_evict);
+        dmu_buf_init_user(&zap->zap_dbu, zap_evict, &zap->zap_dbuf);
+        winner = dmu_buf_set_user(db, &zap->zap_dbu);
 
         if (winner != NULL) {
                 rw_exit(&zap->zap_rwlock);
                 rw_destroy(&zap->zap_rwlock);
                 if (!zap->zap_ismicro)
@@ -677,15 +679,14 @@
          */
 
         return (dmu_object_free(os, zapobj, tx));
 }
 
-_NOTE(ARGSUSED(0))
 void
-zap_evict(dmu_buf_t *db, void *vzap)
+zap_evict(void *dbu)
 {
-        zap_t *zap = vzap;
+        zap_t *zap = dbu;
 
         rw_destroy(&zap->zap_rwlock);
 
         if (zap->zap_ismicro)
                 mze_destroy(zap);