@@ -1206,19 +1206,21 @@ free_guid_map_onexit(void *arg)
1206
1206
}
1207
1207
1208
1208
static void *
1209
- restore_read (struct restorearg * ra , int len )
1209
+ restore_read (struct restorearg * ra , int len , char * buf )
1210
1210
{
1211
- void * rv ;
1212
1211
int done = 0 ;
1213
1212
1213
+ if (buf == NULL )
1214
+ buf = ra -> buf ;
1215
+
1214
1216
/* some things will require 8-byte alignment, so everything must */
1215
1217
ASSERT0 (len % 8 );
1216
1218
1217
1219
while (done < len ) {
1218
1220
ssize_t resid ;
1219
1221
1220
1222
ra -> err = vn_rdwr (UIO_READ , ra -> vp ,
1221
- ( caddr_t ) ra -> buf + done , len - done ,
1223
+ buf + done , len - done ,
1222
1224
ra -> voff , UIO_SYSSPACE , FAPPEND ,
1223
1225
RLIM64_INFINITY , CRED (), & resid );
1224
1226
@@ -1231,12 +1233,11 @@ restore_read(struct restorearg *ra, int len)
1231
1233
}
1232
1234
1233
1235
ASSERT3U (done , = = , len );
1234
- rv = ra -> buf ;
1235
1236
if (ra -> byteswap )
1236
- fletcher_4_incremental_byteswap (rv , len , & ra -> cksum );
1237
+ fletcher_4_incremental_byteswap (buf , len , & ra -> cksum );
1237
1238
else
1238
- fletcher_4_incremental_native (rv , len , & ra -> cksum );
1239
- return (rv );
1239
+ fletcher_4_incremental_native (buf , len , & ra -> cksum );
1240
+ return (buf );
1240
1241
}
1241
1242
1242
1243
noinline static void
@@ -1367,7 +1368,7 @@ restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro)
1367
1368
object = err == 0 ? drro -> drr_object : DMU_NEW_OBJECT ;
1368
1369
1369
1370
if (drro -> drr_bonuslen ) {
1370
- data = restore_read (ra , P2ROUNDUP (drro -> drr_bonuslen , 8 ));
1371
+ data = restore_read (ra , P2ROUNDUP (drro -> drr_bonuslen , 8 ), NULL );
1371
1372
if (ra -> err != 0 )
1372
1373
return (ra -> err );
1373
1374
}
@@ -1473,26 +1474,38 @@ restore_write(struct restorearg *ra, objset_t *os,
1473
1474
struct drr_write * drrw )
1474
1475
{
1475
1476
dmu_tx_t * tx ;
1477
+ dmu_buf_t * bonus ;
1478
+ arc_buf_t * abuf ;
1476
1479
void * data ;
1477
1480
int err ;
1478
1481
1479
1482
if (drrw -> drr_offset + drrw -> drr_length < drrw -> drr_offset ||
1480
1483
!DMU_OT_IS_VALID (drrw -> drr_type ))
1481
1484
return (SET_ERROR (EINVAL ));
1482
1485
1483
- data = restore_read (ra , drrw -> drr_length );
1484
- if (data == NULL )
1485
- return (ra -> err );
1486
-
1487
1486
if (dmu_object_info (os , drrw -> drr_object , NULL ) != 0 )
1488
1487
return (SET_ERROR (EINVAL ));
1489
1488
1489
+ if (dmu_bonus_hold (os , drrw -> drr_object , FTAG , & bonus ) != 0 )
1490
+ return (SET_ERROR (EINVAL ));
1491
+
1492
+ abuf = dmu_request_arcbuf (bonus , drrw -> drr_length );
1493
+
1494
+ data = restore_read (ra , drrw -> drr_length , abuf -> b_data );
1495
+ if (data == NULL ) {
1496
+ dmu_return_arcbuf (abuf );
1497
+ dmu_buf_rele (bonus , FTAG );
1498
+ return (ra -> err );
1499
+ }
1500
+
1490
1501
tx = dmu_tx_create (os );
1491
1502
1492
1503
dmu_tx_hold_write (tx , drrw -> drr_object ,
1493
1504
drrw -> drr_offset , drrw -> drr_length );
1494
1505
err = dmu_tx_assign (tx , TXG_WAIT );
1495
1506
if (err != 0 ) {
1507
+ dmu_return_arcbuf (abuf );
1508
+ dmu_buf_rele (bonus , FTAG );
1496
1509
dmu_tx_abort (tx );
1497
1510
return (err );
1498
1511
}
@@ -1501,9 +1514,9 @@ restore_write(struct restorearg *ra, objset_t *os,
1501
1514
DMU_OT_BYTESWAP (drrw -> drr_type );
1502
1515
dmu_ot_byteswap [byteswap ].ob_func (data , drrw -> drr_length );
1503
1516
}
1504
- dmu_write (os , drrw -> drr_object ,
1505
- drrw -> drr_offset , drrw -> drr_length , data , tx );
1517
+ dmu_assign_arcbuf (bonus , drrw -> drr_offset , abuf , tx );
1506
1518
dmu_tx_commit (tx );
1519
+ dmu_buf_rele (bonus , FTAG );
1507
1520
return (0 );
1508
1521
}
1509
1522
@@ -1585,7 +1598,7 @@ restore_write_embedded(struct restorearg *ra, objset_t *os,
1585
1598
if (drrwnp -> drr_compression >= ZIO_COMPRESS_FUNCTIONS )
1586
1599
return (EINVAL );
1587
1600
1588
- data = restore_read (ra , P2ROUNDUP (drrwnp -> drr_psize , 8 ));
1601
+ data = restore_read (ra , P2ROUNDUP (drrwnp -> drr_psize , 8 ), NULL );
1589
1602
if (data == NULL )
1590
1603
return (ra -> err );
1591
1604
@@ -1620,7 +1633,7 @@ restore_spill(struct restorearg *ra, objset_t *os, struct drr_spill *drrs)
1620
1633
drrs -> drr_length > SPA_MAXBLOCKSIZE )
1621
1634
return (SET_ERROR (EINVAL ));
1622
1635
1623
- data = restore_read (ra , drrs -> drr_length );
1636
+ data = restore_read (ra , drrs -> drr_length , NULL );
1624
1637
if (data == NULL )
1625
1638
return (ra -> err );
1626
1639
@@ -1761,7 +1774,7 @@ dmu_recv_stream(dmu_recv_cookie_t *drc, vnode_t *vp, offset_t *voffp,
1761
1774
*/
1762
1775
pcksum = ra .cksum ;
1763
1776
while (ra .err == 0 &&
1764
- NULL != (drr = restore_read (& ra , sizeof (* drr )))) {
1777
+ NULL != (drr = restore_read (& ra , sizeof (* drr ), NULL ))) {
1765
1778
if (issig (JUSTLOOKING ) && issig (FORREAL )) {
1766
1779
ra .err = SET_ERROR (EINTR );
1767
1780
goto out ;
0 commit comments