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) {