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,619 ****
          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)) {
                  (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);
--- 609,619 ----
          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 (!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,826 ****
          uint64_t size;
  
          ASSERT(dsl_pool_config_held(dp));
  
          /* tosnap must be a snapshot */
!         if (!dsl_dataset_is_snapshot(ds))
                  return (SET_ERROR(EINVAL));
  
          /*
           * fromsnap must be an earlier snapshot from the same fs as tosnap,
           * or the origin's fs.
--- 816,826 ----
          uint64_t size;
  
          ASSERT(dsl_pool_config_held(dp));
  
          /* tosnap must be a snapshot */
!         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,1073 ****
                              FTAG, &origin);
                          if (error != 0) {
                                  dsl_dataset_rele(ds, FTAG);
                                  return (error);
                          }
!                         if (!dsl_dataset_is_snapshot(origin)) {
                                  dsl_dataset_rele(origin, FTAG);
                                  dsl_dataset_rele(ds, FTAG);
                                  return (SET_ERROR(EINVAL));
                          }
                          if (dsl_dataset_phys(origin)->ds_guid != fromguid) {
--- 1063,1073 ----
                              FTAG, &origin);
                          if (error != 0) {
                                  dsl_dataset_rele(ds, FTAG);
                                  return (error);
                          }
!                         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) {