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,28 ****
--- 19,29 ----
   * 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,395 ****
          /*
           * 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);
  
          if (winner != NULL) {
                  rw_exit(&zap->zap_rwlock);
                  rw_destroy(&zap->zap_rwlock);
                  if (!zap->zap_ismicro)
--- 386,397 ----
          /*
           * Make sure that zap_ismicro is set before we let others see
           * it, because zap_lockdir() checks zap_ismicro without the lock
           * held.
           */
!         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,691 ****
           */
  
          return (dmu_object_free(os, zapobj, tx));
  }
  
- _NOTE(ARGSUSED(0))
  void
! zap_evict(dmu_buf_t *db, void *vzap)
  {
!         zap_t *zap = vzap;
  
          rw_destroy(&zap->zap_rwlock);
  
          if (zap->zap_ismicro)
                  mze_destroy(zap);
--- 679,692 ----
           */
  
          return (dmu_object_free(os, zapobj, tx));
  }
  
  void
! zap_evict(void *dbu)
  {
!         zap_t *zap = dbu;
  
          rw_destroy(&zap->zap_rwlock);
  
          if (zap->zap_ismicro)
                  mze_destroy(zap);