usr/src/uts/common/fs/zfs/dmu_send.c
changeset 13700 2889e2596bd6
parent 13686 4bc0783f6064
child 13736 9f1d48e1681f
equal deleted inserted replaced
13699:733714f4dc24 13700:2889e2596bd6
    18  *
    18  *
    19  * CDDL HEADER END
    19  * CDDL HEADER END
    20  */
    20  */
    21 /*
    21 /*
    22  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
    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  * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
    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  * Copyright (c) 2012, Joyent, Inc. All rights reserved.
    25  * Copyright (c) 2012, Joyent, Inc. All rights reserved.
    29  */
    26  */
    30 
    27 
    31 #include <sys/dmu.h>
    28 #include <sys/dmu.h>
    32 #include <sys/dmu_impl.h>
    29 #include <sys/dmu_impl.h>
  1073 	int err;
  1070 	int err;
  1074 	dmu_tx_t *tx;
  1071 	dmu_tx_t *tx;
  1075 	void *data = NULL;
  1072 	void *data = NULL;
  1076 
  1073 
  1077 	if (drro->drr_type == DMU_OT_NONE ||
  1074 	if (drro->drr_type == DMU_OT_NONE ||
  1078 	    drro->drr_type >= DMU_OT_NUMTYPES ||
  1075 	    !DMU_OT_IS_VALID(drro->drr_type) ||
  1079 	    drro->drr_bonustype >= DMU_OT_NUMTYPES ||
  1076 	    !DMU_OT_IS_VALID(drro->drr_bonustype) ||
  1080 	    drro->drr_checksumtype >= ZIO_CHECKSUM_FUNCTIONS ||
  1077 	    drro->drr_checksumtype >= ZIO_CHECKSUM_FUNCTIONS ||
  1081 	    drro->drr_compress >= ZIO_COMPRESS_FUNCTIONS ||
  1078 	    drro->drr_compress >= ZIO_COMPRESS_FUNCTIONS ||
  1082 	    P2PHASE(drro->drr_blksz, SPA_MINBLOCKSIZE) ||
  1079 	    P2PHASE(drro->drr_blksz, SPA_MINBLOCKSIZE) ||
  1083 	    drro->drr_blksz < SPA_MINBLOCKSIZE ||
  1080 	    drro->drr_blksz < SPA_MINBLOCKSIZE ||
  1084 	    drro->drr_blksz > SPA_MAXBLOCKSIZE ||
  1081 	    drro->drr_blksz > SPA_MAXBLOCKSIZE ||
  1139 		dmu_buf_will_dirty(db, tx);
  1136 		dmu_buf_will_dirty(db, tx);
  1140 
  1137 
  1141 		ASSERT3U(db->db_size, >=, drro->drr_bonuslen);
  1138 		ASSERT3U(db->db_size, >=, drro->drr_bonuslen);
  1142 		bcopy(data, db->db_data, drro->drr_bonuslen);
  1139 		bcopy(data, db->db_data, drro->drr_bonuslen);
  1143 		if (ra->byteswap) {
  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 			    drro->drr_bonuslen);
  1144 			    drro->drr_bonuslen);
  1146 		}
  1145 		}
  1147 		dmu_buf_rele(db, FTAG);
  1146 		dmu_buf_rele(db, FTAG);
  1148 	}
  1147 	}
  1149 	dmu_tx_commit(tx);
  1148 	dmu_tx_commit(tx);
  1182 	dmu_tx_t *tx;
  1181 	dmu_tx_t *tx;
  1183 	void *data;
  1182 	void *data;
  1184 	int err;
  1183 	int err;
  1185 
  1184 
  1186 	if (drrw->drr_offset + drrw->drr_length < drrw->drr_offset ||
  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 		return (EINVAL);
  1187 		return (EINVAL);
  1189 
  1188 
  1190 	data = restore_read(ra, drrw->drr_length);
  1189 	data = restore_read(ra, drrw->drr_length);
  1191 	if (data == NULL)
  1190 	if (data == NULL)
  1192 		return (ra->err);
  1191 		return (ra->err);
  1201 	err = dmu_tx_assign(tx, TXG_WAIT);
  1200 	err = dmu_tx_assign(tx, TXG_WAIT);
  1202 	if (err) {
  1201 	if (err) {
  1203 		dmu_tx_abort(tx);
  1202 		dmu_tx_abort(tx);
  1204 		return (err);
  1203 		return (err);
  1205 	}
  1204 	}
  1206 	if (ra->byteswap)
  1205 	if (ra->byteswap) {
  1207 		dmu_ot[drrw->drr_type].ot_byteswap(data, drrw->drr_length);
  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 	dmu_write(os, drrw->drr_object,
  1210 	dmu_write(os, drrw->drr_object,
  1209 	    drrw->drr_offset, drrw->drr_length, data, tx);
  1211 	    drrw->drr_offset, drrw->drr_length, data, tx);
  1210 	dmu_tx_commit(tx);
  1212 	dmu_tx_commit(tx);
  1211 	return (0);
  1213 	return (0);
  1212 }
  1214 }