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>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/zfs/dmu_send.c
          +++ new/usr/src/uts/common/fs/zfs/dmu_send.c
↓ open down ↓ 603 lines elided ↑ open up ↑
 604  604                  drr->drr_u.drr_begin.drr_flags |= DRR_FLAG_CLONE;
 605  605          drr->drr_u.drr_begin.drr_toguid = dsl_dataset_phys(ds)->ds_guid;
 606  606          if (dsl_dataset_phys(ds)->ds_flags & DS_FLAG_CI_DATASET)
 607  607                  drr->drr_u.drr_begin.drr_flags |= DRR_FLAG_CI_DATA;
 608  608  
 609  609          if (fromzb != NULL) {
 610  610                  drr->drr_u.drr_begin.drr_fromguid = fromzb->zbm_guid;
 611  611                  fromtxg = fromzb->zbm_creation_txg;
 612  612          }
 613  613          dsl_dataset_name(ds, drr->drr_u.drr_begin.drr_toname);
 614      -        if (!dsl_dataset_is_snapshot(ds)) {
      614 +        if (!ds->ds_is_snapshot) {
 615  615                  (void) strlcat(drr->drr_u.drr_begin.drr_toname, "@--head--",
 616  616                      sizeof (drr->drr_u.drr_begin.drr_toname));
 617  617          }
 618  618  
 619  619          dsp = kmem_zalloc(sizeof (dmu_sendarg_t), KM_SLEEP);
 620  620  
 621  621          dsp->dsa_drr = drr;
 622  622          dsp->dsa_vp = vp;
 623  623          dsp->dsa_outfd = outfd;
 624  624          dsp->dsa_proc = curproc;
↓ open down ↓ 186 lines elided ↑ open up ↑
 811  811  int
 812  812  dmu_send_estimate(dsl_dataset_t *ds, dsl_dataset_t *fromds, uint64_t *sizep)
 813  813  {
 814  814          dsl_pool_t *dp = ds->ds_dir->dd_pool;
 815  815          int err;
 816  816          uint64_t size;
 817  817  
 818  818          ASSERT(dsl_pool_config_held(dp));
 819  819  
 820  820          /* tosnap must be a snapshot */
 821      -        if (!dsl_dataset_is_snapshot(ds))
      821 +        if (!ds->ds_is_snapshot)
 822  822                  return (SET_ERROR(EINVAL));
 823  823  
 824  824          /*
 825  825           * fromsnap must be an earlier snapshot from the same fs as tosnap,
 826  826           * or the origin's fs.
 827  827           */
 828  828          if (fromds != NULL && !dsl_dataset_is_before(ds, fromds, 0))
 829  829                  return (SET_ERROR(EXDEV));
 830  830  
 831  831          /* Get uncompressed size estimate of changed data. */
↓ open down ↓ 226 lines elided ↑ open up ↑
1058 1058                  }
1059 1059  
1060 1060                  if (drba->drba_origin != NULL) {
1061 1061                          dsl_dataset_t *origin;
1062 1062                          error = dsl_dataset_hold(dp, drba->drba_origin,
1063 1063                              FTAG, &origin);
1064 1064                          if (error != 0) {
1065 1065                                  dsl_dataset_rele(ds, FTAG);
1066 1066                                  return (error);
1067 1067                          }
1068      -                        if (!dsl_dataset_is_snapshot(origin)) {
     1068 +                        if (!origin->ds_is_snapshot) {
1069 1069                                  dsl_dataset_rele(origin, FTAG);
1070 1070                                  dsl_dataset_rele(ds, FTAG);
1071 1071                                  return (SET_ERROR(EINVAL));
1072 1072                          }
1073 1073                          if (dsl_dataset_phys(origin)->ds_guid != fromguid) {
1074 1074                                  dsl_dataset_rele(origin, FTAG);
1075 1075                                  dsl_dataset_rele(ds, FTAG);
1076 1076                                  return (SET_ERROR(ENODEV));
1077 1077                          }
1078 1078                          dsl_dataset_rele(origin, FTAG);
↓ open down ↓ 1088 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX