Print this page
2619 asynchronous destruction of ZFS file systems
2747 SPA versioning with zfs feature flags
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <gwilson@delphix.com>
Reviewed by: Richard Lowe <richlowe@richlowe.net>
Reviewed by: Dan Kruchinin <dan.kruchinin@gmail.com>
Approved by: Dan McDonald <danmcd@nexenta.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 ↓ 12 lines elided ↑ open up ↑
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  23      - * Copyright (c) 2011 by Delphix. All rights reserved.
  24      - */
  25      -/*
  26   23   * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
  27      - * Copyright (c) 2011 by Delphix. All rights reserved.
       24 + * Copyright (c) 2012 by Delphix. All rights reserved.
  28   25   * Copyright (c) 2012, Joyent, Inc. All rights reserved.
  29   26   */
  30   27  
  31   28  #include <sys/dmu.h>
  32   29  #include <sys/dmu_impl.h>
  33   30  #include <sys/dmu_tx.h>
  34   31  #include <sys/dbuf.h>
  35   32  #include <sys/dnode.h>
  36   33  #include <sys/zfs_context.h>
  37   34  #include <sys/dmu_objset.h>
↓ open down ↓ 1030 lines elided ↑ open up ↑
1068 1065  }
1069 1066  
1070 1067  static int
1071 1068  restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro)
1072 1069  {
1073 1070          int err;
1074 1071          dmu_tx_t *tx;
1075 1072          void *data = NULL;
1076 1073  
1077 1074          if (drro->drr_type == DMU_OT_NONE ||
1078      -            drro->drr_type >= DMU_OT_NUMTYPES ||
1079      -            drro->drr_bonustype >= DMU_OT_NUMTYPES ||
     1075 +            !DMU_OT_IS_VALID(drro->drr_type) ||
     1076 +            !DMU_OT_IS_VALID(drro->drr_bonustype) ||
1080 1077              drro->drr_checksumtype >= ZIO_CHECKSUM_FUNCTIONS ||
1081 1078              drro->drr_compress >= ZIO_COMPRESS_FUNCTIONS ||
1082 1079              P2PHASE(drro->drr_blksz, SPA_MINBLOCKSIZE) ||
1083 1080              drro->drr_blksz < SPA_MINBLOCKSIZE ||
1084 1081              drro->drr_blksz > SPA_MAXBLOCKSIZE ||
1085 1082              drro->drr_bonuslen > DN_MAX_BONUSLEN) {
1086 1083                  return (EINVAL);
1087 1084          }
1088 1085  
1089 1086          err = dmu_object_info(os, drro->drr_object, NULL);
↓ open down ↓ 44 lines elided ↑ open up ↑
1134 1131  
1135 1132          if (data != NULL) {
1136 1133                  dmu_buf_t *db;
1137 1134  
1138 1135                  VERIFY(0 == dmu_bonus_hold(os, drro->drr_object, FTAG, &db));
1139 1136                  dmu_buf_will_dirty(db, tx);
1140 1137  
1141 1138                  ASSERT3U(db->db_size, >=, drro->drr_bonuslen);
1142 1139                  bcopy(data, db->db_data, drro->drr_bonuslen);
1143 1140                  if (ra->byteswap) {
1144      -                        dmu_ot[drro->drr_bonustype].ot_byteswap(db->db_data,
     1141 +                        dmu_object_byteswap_t byteswap =
     1142 +                            DMU_OT_BYTESWAP(drro->drr_bonustype);
     1143 +                        dmu_ot_byteswap[byteswap].ob_func(db->db_data,
1145 1144                              drro->drr_bonuslen);
1146 1145                  }
1147 1146                  dmu_buf_rele(db, FTAG);
1148 1147          }
1149 1148          dmu_tx_commit(tx);
1150 1149          return (0);
1151 1150  }
1152 1151  
1153 1152  /* ARGSUSED */
1154 1153  static int
↓ open down ↓ 22 lines elided ↑ open up ↑
1177 1176  
1178 1177  static int
1179 1178  restore_write(struct restorearg *ra, objset_t *os,
1180 1179      struct drr_write *drrw)
1181 1180  {
1182 1181          dmu_tx_t *tx;
1183 1182          void *data;
1184 1183          int err;
1185 1184  
1186 1185          if (drrw->drr_offset + drrw->drr_length < drrw->drr_offset ||
1187      -            drrw->drr_type >= DMU_OT_NUMTYPES)
     1186 +            !DMU_OT_IS_VALID(drrw->drr_type))
1188 1187                  return (EINVAL);
1189 1188  
1190 1189          data = restore_read(ra, drrw->drr_length);
1191 1190          if (data == NULL)
1192 1191                  return (ra->err);
1193 1192  
1194 1193          if (dmu_object_info(os, drrw->drr_object, NULL) != 0)
1195 1194                  return (EINVAL);
1196 1195  
1197 1196          tx = dmu_tx_create(os);
1198 1197  
1199 1198          dmu_tx_hold_write(tx, drrw->drr_object,
1200 1199              drrw->drr_offset, drrw->drr_length);
1201 1200          err = dmu_tx_assign(tx, TXG_WAIT);
1202 1201          if (err) {
1203 1202                  dmu_tx_abort(tx);
1204 1203                  return (err);
1205 1204          }
1206      -        if (ra->byteswap)
1207      -                dmu_ot[drrw->drr_type].ot_byteswap(data, drrw->drr_length);
     1205 +        if (ra->byteswap) {
     1206 +                dmu_object_byteswap_t byteswap =
     1207 +                    DMU_OT_BYTESWAP(drrw->drr_type);
     1208 +                dmu_ot_byteswap[byteswap].ob_func(data, drrw->drr_length);
     1209 +        }
1208 1210          dmu_write(os, drrw->drr_object,
1209 1211              drrw->drr_offset, drrw->drr_length, data, tx);
1210 1212          dmu_tx_commit(tx);
1211 1213          return (0);
1212 1214  }
1213 1215  
1214 1216  /*
1215 1217   * Handle a DRR_WRITE_BYREF record.  This record is used in dedup'ed
1216 1218   * streams to refer to a copy of the data that is already on the
1217 1219   * system because it came in earlier in the stream.  This function
↓ open down ↓ 467 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX