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>

@@ -49,11 +49,11 @@
 } dmu_snapshots_destroy_arg_t;
 
 int
 dsl_destroy_snapshot_check_impl(dsl_dataset_t *ds, boolean_t defer)
 {
-        if (!dsl_dataset_is_snapshot(ds))
+        if (!ds->ds_is_snapshot)
                 return (SET_ERROR(EINVAL));
 
         if (dsl_dataset_long_held(ds))
                 return (SET_ERROR(EBUSY));
 

@@ -352,11 +352,11 @@
 
         /* Collapse range in clone heads */
         dsl_dataset_remove_clones_key(ds,
             dsl_dataset_phys(ds)->ds_creation_txg, tx);
 
-        if (dsl_dataset_is_snapshot(ds_next)) {
+        if (ds_next->ds_is_snapshot) {
                 dsl_dataset_t *ds_nextnext;
 
                 /*
                  * Update next's unique to include blocks which
                  * were previously shared by only this snapshot

@@ -602,12 +602,12 @@
 {
         int error;
         uint64_t count;
         objset_t *mos;
 
-        ASSERT(!dsl_dataset_is_snapshot(ds));
-        if (dsl_dataset_is_snapshot(ds))
+        ASSERT(!ds->ds_is_snapshot);
+        if (ds->ds_is_snapshot)
                 return (SET_ERROR(EINVAL));
 
         if (refcount_count(&ds->ds_longholds) != expected_holds)
                 return (SET_ERROR(EBUSY));