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>

@@ -373,11 +373,11 @@
 
 static uint64_t
 dsl_scan_ds_maxtxg(dsl_dataset_t *ds)
 {
         uint64_t smt = ds->ds_dir->dd_pool->dp_scan->scn_phys.scn_max_txg;
-        if (dsl_dataset_is_snapshot(ds))
+        if (ds->ds_is_snapshot)
                 return (MIN(smt, dsl_dataset_phys(ds)->ds_creation_txg));
         return (smt);
 }
 
 static void

@@ -809,11 +809,11 @@
 
         if (scn->scn_phys.scn_state != DSS_SCANNING)
                 return;
 
         if (scn->scn_phys.scn_bookmark.zb_objset == ds->ds_object) {
-                if (dsl_dataset_is_snapshot(ds)) {
+                if (ds->ds_is_snapshot) {
                         /* Note, scn_cur_{min,max}_txg stays the same. */
                         scn->scn_phys.scn_bookmark.zb_objset =
                             dsl_dataset_phys(ds)->ds_next_snap_obj;
                         zfs_dbgmsg("destroying ds %llu; currently traversing; "
                             "reset zb_objset to %llu",

@@ -831,11 +831,11 @@
         } else if (zap_lookup_int_key(dp->dp_meta_objset,
             scn->scn_phys.scn_queue_obj, ds->ds_object, &mintxg) == 0) {
                 ASSERT3U(dsl_dataset_phys(ds)->ds_num_children, <=, 1);
                 VERIFY3U(0, ==, zap_remove_int(dp->dp_meta_objset,
                     scn->scn_phys.scn_queue_obj, ds->ds_object, tx));
-                if (dsl_dataset_is_snapshot(ds)) {
+                if (ds->ds_is_snapshot) {
                         /*
                          * We keep the same mintxg; it could be >
                          * ds_creation_txg if the previous snapshot was
                          * deleted too.
                          */

@@ -1015,11 +1015,11 @@
          * snapshots can have ZIL block pointers (which may be the same
          * BP as in the head), they must be ignored.  So we traverse the
          * ZIL here, rather than in scan_recurse(), because the regular
          * snapshot block-sharing rules don't apply to it.
          */
-        if (DSL_SCAN_IS_SCRUB_RESILVER(scn) && !dsl_dataset_is_snapshot(ds))
+        if (DSL_SCAN_IS_SCRUB_RESILVER(scn) && !ds->ds_is_snapshot)
                 dsl_scan_zil(dp, &os->os_zil_header);
 
         /*
          * Iterate over the bps in this ds.
          */