@@ -1152,42 +1152,6 @@ dbuf_set_data(dmu_buf_impl_t *db, arc_buf_t *buf)
1152
1152
db -> db .db_data = buf -> b_data ;
1153
1153
}
1154
1154
1155
- static arc_buf_t *
1156
- dbuf_alloc_arcbuf_from_arcbuf (dmu_buf_impl_t * db , arc_buf_t * data )
1157
- {
1158
- objset_t * os = db -> db_objset ;
1159
- spa_t * spa = os -> os_spa ;
1160
- arc_buf_contents_t type = DBUF_GET_BUFC_TYPE (db );
1161
- enum zio_compress compress_type ;
1162
- uint8_t complevel ;
1163
- int psize , lsize ;
1164
-
1165
- psize = arc_buf_size (data );
1166
- lsize = arc_buf_lsize (data );
1167
- compress_type = arc_get_compression (data );
1168
- complevel = arc_get_complevel (data );
1169
-
1170
- if (arc_is_encrypted (data )) {
1171
- boolean_t byteorder ;
1172
- uint8_t salt [ZIO_DATA_SALT_LEN ];
1173
- uint8_t iv [ZIO_DATA_IV_LEN ];
1174
- uint8_t mac [ZIO_DATA_MAC_LEN ];
1175
- dnode_t * dn = DB_DNODE (db );
1176
-
1177
- arc_get_raw_params (data , & byteorder , salt , iv , mac );
1178
- data = arc_alloc_raw_buf (spa , db , dmu_objset_id (os ),
1179
- byteorder , salt , iv , mac , dn -> dn_type , psize , lsize ,
1180
- compress_type , complevel );
1181
- } else if (compress_type != ZIO_COMPRESS_OFF ) {
1182
- ASSERT3U (type , = = , ARC_BUFC_DATA );
1183
- data = arc_alloc_compressed_buf (spa , db ,
1184
- psize , lsize , compress_type , complevel );
1185
- } else {
1186
- data = arc_alloc_buf (spa , db , type , psize );
1187
- }
1188
- return (data );
1189
- }
1190
-
1191
1155
static arc_buf_t *
1192
1156
dbuf_alloc_arcbuf (dmu_buf_impl_t * db )
1193
1157
{
@@ -1635,9 +1599,35 @@ dbuf_fix_old_data(dmu_buf_impl_t *db, uint64_t txg)
1635
1599
arc_space_consume (bonuslen , ARC_SPACE_BONUS );
1636
1600
bcopy (db -> db .db_data , dr -> dt .dl .dr_data , bonuslen );
1637
1601
} else if (zfs_refcount_count (& db -> db_holds ) > db -> db_dirtycnt ) {
1638
- arc_buf_t * buf = dbuf_alloc_arcbuf_from_arcbuf (db , db -> db_buf );
1639
- dr -> dt .dl .dr_data = buf ;
1640
- bcopy (db -> db .db_data , buf -> b_data , arc_buf_size (buf ));
1602
+ dnode_t * dn = DB_DNODE (db );
1603
+ int size = arc_buf_size (db -> db_buf );
1604
+ arc_buf_contents_t type = DBUF_GET_BUFC_TYPE (db );
1605
+ spa_t * spa = db -> db_objset -> os_spa ;
1606
+ enum zio_compress compress_type =
1607
+ arc_get_compression (db -> db_buf );
1608
+ uint8_t complevel = arc_get_complevel (db -> db_buf );
1609
+
1610
+ if (arc_is_encrypted (db -> db_buf )) {
1611
+ boolean_t byteorder ;
1612
+ uint8_t salt [ZIO_DATA_SALT_LEN ];
1613
+ uint8_t iv [ZIO_DATA_IV_LEN ];
1614
+ uint8_t mac [ZIO_DATA_MAC_LEN ];
1615
+
1616
+ arc_get_raw_params (db -> db_buf , & byteorder , salt ,
1617
+ iv , mac );
1618
+ dr -> dt .dl .dr_data = arc_alloc_raw_buf (spa , db ,
1619
+ dmu_objset_id (dn -> dn_objset ), byteorder , salt , iv ,
1620
+ mac , dn -> dn_type , size , arc_buf_lsize (db -> db_buf ),
1621
+ compress_type , complevel );
1622
+ } else if (compress_type != ZIO_COMPRESS_OFF ) {
1623
+ ASSERT3U (type , = = , ARC_BUFC_DATA );
1624
+ dr -> dt .dl .dr_data = arc_alloc_compressed_buf (spa , db ,
1625
+ size , arc_buf_lsize (db -> db_buf ), compress_type ,
1626
+ complevel );
1627
+ } else {
1628
+ dr -> dt .dl .dr_data = arc_alloc_buf (spa , db , type , size );
1629
+ }
1630
+ bcopy (db -> db .db_data , dr -> dt .dl .dr_data -> b_data , size );
1641
1631
} else {
1642
1632
db -> db_buf = NULL ;
1643
1633
dbuf_clear_data (db );
@@ -3438,10 +3428,30 @@ noinline static void
3438
3428
dbuf_hold_copy (dnode_t * dn , dmu_buf_impl_t * db )
3439
3429
{
3440
3430
dbuf_dirty_record_t * dr = db -> db_data_pending ;
3441
- arc_buf_t * newdata , * data = dr -> dt .dl .dr_data ;
3431
+ arc_buf_t * data = dr -> dt .dl .dr_data ;
3432
+ enum zio_compress compress_type = arc_get_compression (data );
3433
+ uint8_t complevel = arc_get_complevel (data );
3434
+
3435
+ if (arc_is_encrypted (data )) {
3436
+ boolean_t byteorder ;
3437
+ uint8_t salt [ZIO_DATA_SALT_LEN ];
3438
+ uint8_t iv [ZIO_DATA_IV_LEN ];
3439
+ uint8_t mac [ZIO_DATA_MAC_LEN ];
3440
+
3441
+ arc_get_raw_params (data , & byteorder , salt , iv , mac );
3442
+ dbuf_set_data (db , arc_alloc_raw_buf (dn -> dn_objset -> os_spa , db ,
3443
+ dmu_objset_id (dn -> dn_objset ), byteorder , salt , iv , mac ,
3444
+ dn -> dn_type , arc_buf_size (data ), arc_buf_lsize (data ),
3445
+ compress_type , complevel ));
3446
+ } else if (compress_type != ZIO_COMPRESS_OFF ) {
3447
+ dbuf_set_data (db , arc_alloc_compressed_buf (
3448
+ dn -> dn_objset -> os_spa , db , arc_buf_size (data ),
3449
+ arc_buf_lsize (data ), compress_type , complevel ));
3450
+ } else {
3451
+ dbuf_set_data (db , arc_alloc_buf (dn -> dn_objset -> os_spa , db ,
3452
+ DBUF_GET_BUFC_TYPE (db ), db -> db .db_size ));
3453
+ }
3442
3454
3443
- newdata = dbuf_alloc_arcbuf_from_arcbuf (db , data );
3444
- dbuf_set_data (db , newdata );
3445
3455
rw_enter (& db -> db_rwlock , RW_WRITER );
3446
3456
bcopy (data -> b_data , db -> db .db_data , arc_buf_size (data ));
3447
3457
rw_exit (& db -> db_rwlock );
@@ -4363,8 +4373,31 @@ dbuf_sync_leaf(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
4363
4373
* objects only modified in the syncing context (e.g.
4364
4374
* DNONE_DNODE blocks).
4365
4375
*/
4366
- * datap = dbuf_alloc_arcbuf_from_arcbuf (db , db -> db_buf );
4367
- bcopy (db -> db .db_data , (* datap )-> b_data , arc_buf_size (* datap ));
4376
+ int psize = arc_buf_size (* datap );
4377
+ int lsize = arc_buf_lsize (* datap );
4378
+ arc_buf_contents_t type = DBUF_GET_BUFC_TYPE (db );
4379
+ enum zio_compress compress_type = arc_get_compression (* datap );
4380
+ uint8_t complevel = arc_get_complevel (* datap );
4381
+
4382
+ if (arc_is_encrypted (* datap )) {
4383
+ boolean_t byteorder ;
4384
+ uint8_t salt [ZIO_DATA_SALT_LEN ];
4385
+ uint8_t iv [ZIO_DATA_IV_LEN ];
4386
+ uint8_t mac [ZIO_DATA_MAC_LEN ];
4387
+
4388
+ arc_get_raw_params (* datap , & byteorder , salt , iv , mac );
4389
+ * datap = arc_alloc_raw_buf (os -> os_spa , db ,
4390
+ dmu_objset_id (os ), byteorder , salt , iv , mac ,
4391
+ dn -> dn_type , psize , lsize , compress_type ,
4392
+ complevel );
4393
+ } else if (compress_type != ZIO_COMPRESS_OFF ) {
4394
+ ASSERT3U (type , = = , ARC_BUFC_DATA );
4395
+ * datap = arc_alloc_compressed_buf (os -> os_spa , db ,
4396
+ psize , lsize , compress_type , complevel );
4397
+ } else {
4398
+ * datap = arc_alloc_buf (os -> os_spa , db , type , psize );
4399
+ }
4400
+ bcopy (db -> db .db_data , (* datap )-> b_data , psize );
4368
4401
}
4369
4402
db -> db_data_pending = dr ;
4370
4403
0 commit comments