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>

@@ -609,11 +609,11 @@
         if (fromzb != NULL) {
                 drr->drr_u.drr_begin.drr_fromguid = fromzb->zbm_guid;
                 fromtxg = fromzb->zbm_creation_txg;
         }
         dsl_dataset_name(ds, drr->drr_u.drr_begin.drr_toname);
-        if (!dsl_dataset_is_snapshot(ds)) {
+        if (!ds->ds_is_snapshot) {
                 (void) strlcat(drr->drr_u.drr_begin.drr_toname, "@--head--",
                     sizeof (drr->drr_u.drr_begin.drr_toname));
         }
 
         dsp = kmem_zalloc(sizeof (dmu_sendarg_t), KM_SLEEP);

@@ -816,11 +816,11 @@
         uint64_t size;
 
         ASSERT(dsl_pool_config_held(dp));
 
         /* tosnap must be a snapshot */
-        if (!dsl_dataset_is_snapshot(ds))
+        if (!ds->ds_is_snapshot)
                 return (SET_ERROR(EINVAL));
 
         /*
          * fromsnap must be an earlier snapshot from the same fs as tosnap,
          * or the origin's fs.

@@ -1063,11 +1063,11 @@
                             FTAG, &origin);
                         if (error != 0) {
                                 dsl_dataset_rele(ds, FTAG);
                                 return (error);
                         }
-                        if (!dsl_dataset_is_snapshot(origin)) {
+                        if (!origin->ds_is_snapshot) {
                                 dsl_dataset_rele(origin, FTAG);
                                 dsl_dataset_rele(ds, FTAG);
                                 return (SET_ERROR(EINVAL));
                         }
                         if (dsl_dataset_phys(origin)->ds_guid != fromguid) {