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>
        
*** 21,30 ****
--- 21,31 ----
  /*
   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
   * Copyright (c) 2013 by Delphix. All rights reserved.
   * Copyright (c) 2013, Joyent, Inc. All rights reserved.
   * Copyright (c) 2013 Steven Hartland. All rights reserved.
+  * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
   */
  
  #ifndef _SYS_DSL_DATASET_H
  #define _SYS_DSL_DATASET_H
  
*** 130,144 ****
--- 131,148 ----
          uint64_t ds_userrefs_obj;       /* DMU_OT_USERREFS */
          uint64_t ds_pad[5]; /* pad out to 320 bytes for good measure */
  } dsl_dataset_phys_t;
  
  typedef struct dsl_dataset {
+         dmu_buf_user_t ds_dbu;
+ 
          /* Immutable: */
          struct dsl_dir *ds_dir;
          dmu_buf_t *ds_dbuf;
          uint64_t ds_object;
          uint64_t ds_fsid_guid;
+         boolean_t ds_is_snapshot;
  
          /* only used in syncing context, only valid for non-snapshots: */
          struct dsl_dataset *ds_prev;
          uint64_t ds_bookmarks;  /* DMU_OTN_ZAP_METADATA */
          boolean_t ds_large_blocks;
*** 195,210 ****
   * The max length of a temporary tag prefix is the number of hex digits
   * required to express UINT64_MAX plus one for the hyphen.
   */
  #define MAX_TAG_PREFIX_LEN      17
  
- inline boolean_t
- dsl_dataset_is_snapshot(dsl_dataset_t *ds)
- {
-         return (dsl_dataset_phys(ds)->ds_num_children != 0);
- }
- 
  #define DS_UNIQUE_IS_ACCURATE(ds)       \
          ((dsl_dataset_phys(ds)->ds_flags & DS_FLAG_UNIQUE_ACCURATE) != 0)
  
  int dsl_dataset_hold(struct dsl_pool *dp, const char *name, void *tag,
      dsl_dataset_t **dsp);
--- 199,208 ----