equal
deleted
inserted
replaced
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 } |