@@ -1517,6 +1517,11 @@ dsl_dir_diduse_space(dsl_dir_t *dd, dd_used_t type,
1517
1517
{
1518
1518
int64_t accounted_delta ;
1519
1519
1520
+ ASSERT (dmu_tx_is_syncing (tx ));
1521
+ ASSERT (type < DD_USED_NUM );
1522
+
1523
+ dmu_buf_will_dirty (dd -> dd_dbuf , tx );
1524
+
1520
1525
/*
1521
1526
* dsl_dataset_set_refreservation_sync_impl() calls this with
1522
1527
* dd_lock held, so that it can atomically update
@@ -1525,48 +1530,38 @@ dsl_dir_diduse_space(dsl_dir_t *dd, dd_used_t type,
1525
1530
* consistently.
1526
1531
*/
1527
1532
boolean_t needlock = !MUTEX_HELD (& dd -> dd_lock );
1528
-
1529
- ASSERT (dmu_tx_is_syncing (tx ));
1530
- ASSERT (type < DD_USED_NUM );
1531
-
1532
- dmu_buf_will_dirty (dd -> dd_dbuf , tx );
1533
-
1534
1533
if (needlock )
1535
1534
mutex_enter (& dd -> dd_lock );
1536
- accounted_delta =
1537
- parent_delta (dd , dsl_dir_phys (dd )-> dd_used_bytes , used );
1538
- ASSERT (used >= 0 || dsl_dir_phys (dd )-> dd_used_bytes >= - used );
1539
- ASSERT (compressed >= 0 ||
1540
- dsl_dir_phys (dd )-> dd_compressed_bytes >= - compressed );
1535
+ dsl_dir_phys_t * ddp = dsl_dir_phys (dd );
1536
+ accounted_delta = parent_delta (dd , ddp -> dd_used_bytes , used );
1537
+ ASSERT (used >= 0 || ddp -> dd_used_bytes >= - used );
1538
+ ASSERT (compressed >= 0 || ddp -> dd_compressed_bytes >= - compressed );
1541
1539
ASSERT (uncompressed >= 0 ||
1542
- dsl_dir_phys (dd )-> dd_uncompressed_bytes >= - uncompressed );
1543
- dsl_dir_phys (dd )-> dd_used_bytes += used ;
1544
- dsl_dir_phys (dd )-> dd_uncompressed_bytes += uncompressed ;
1545
- dsl_dir_phys (dd )-> dd_compressed_bytes += compressed ;
1546
-
1547
- if (dsl_dir_phys (dd )-> dd_flags & DD_FLAG_USED_BREAKDOWN ) {
1548
- ASSERT (used > 0 ||
1549
- dsl_dir_phys (dd )-> dd_used_breakdown [type ] >= - used );
1550
- dsl_dir_phys (dd )-> dd_used_breakdown [type ] += used ;
1540
+ ddp -> dd_uncompressed_bytes >= - uncompressed );
1541
+ ddp -> dd_used_bytes += used ;
1542
+ ddp -> dd_uncompressed_bytes += uncompressed ;
1543
+ ddp -> dd_compressed_bytes += compressed ;
1544
+
1545
+ if (ddp -> dd_flags & DD_FLAG_USED_BREAKDOWN ) {
1546
+ ASSERT (used >= 0 || ddp -> dd_used_breakdown [type ] >= - used );
1547
+ ddp -> dd_used_breakdown [type ] += used ;
1551
1548
#ifdef ZFS_DEBUG
1552
1549
{
1553
1550
dd_used_t t ;
1554
1551
uint64_t u = 0 ;
1555
1552
for (t = 0 ; t < DD_USED_NUM ; t ++ )
1556
- u += dsl_dir_phys ( dd ) -> dd_used_breakdown [t ];
1557
- ASSERT3U (u , = = , dsl_dir_phys ( dd ) -> dd_used_bytes );
1553
+ u += ddp -> dd_used_breakdown [t ];
1554
+ ASSERT3U (u , = = , ddp -> dd_used_bytes );
1558
1555
}
1559
1556
#endif
1560
1557
}
1561
1558
if (needlock )
1562
1559
mutex_exit (& dd -> dd_lock );
1563
1560
1564
1561
if (dd -> dd_parent != NULL ) {
1565
- dsl_dir_diduse_space (dd -> dd_parent , DD_USED_CHILD ,
1566
- accounted_delta , compressed , uncompressed , tx );
1567
- dsl_dir_transfer_space (dd -> dd_parent ,
1568
- used - accounted_delta ,
1569
- DD_USED_CHILD_RSRV , DD_USED_CHILD , tx );
1562
+ dsl_dir_diduse_transfer_space (dd -> dd_parent ,
1563
+ accounted_delta , compressed , uncompressed ,
1564
+ used , DD_USED_CHILD_RSRV , DD_USED_CHILD , tx );
1570
1565
}
1571
1566
}
1572
1567
@@ -1578,21 +1573,72 @@ dsl_dir_transfer_space(dsl_dir_t *dd, int64_t delta,
1578
1573
ASSERT (oldtype < DD_USED_NUM );
1579
1574
ASSERT (newtype < DD_USED_NUM );
1580
1575
1576
+ dsl_dir_phys_t * ddp = dsl_dir_phys (dd );
1581
1577
if (delta == 0 ||
1582
- !(dsl_dir_phys ( dd ) -> dd_flags & DD_FLAG_USED_BREAKDOWN ))
1578
+ !(ddp -> dd_flags & DD_FLAG_USED_BREAKDOWN ))
1583
1579
return ;
1584
1580
1585
1581
dmu_buf_will_dirty (dd -> dd_dbuf , tx );
1586
1582
mutex_enter (& dd -> dd_lock );
1587
1583
ASSERT (delta > 0 ?
1588
- dsl_dir_phys ( dd ) -> dd_used_breakdown [oldtype ] >= delta :
1589
- dsl_dir_phys ( dd ) -> dd_used_breakdown [newtype ] >= - delta );
1590
- ASSERT (dsl_dir_phys ( dd ) -> dd_used_bytes >= ABS (delta ));
1591
- dsl_dir_phys ( dd ) -> dd_used_breakdown [oldtype ] -= delta ;
1592
- dsl_dir_phys ( dd ) -> dd_used_breakdown [newtype ] += delta ;
1584
+ ddp -> dd_used_breakdown [oldtype ] >= delta :
1585
+ ddp -> dd_used_breakdown [newtype ] >= - delta );
1586
+ ASSERT (ddp -> dd_used_bytes >= ABS (delta ));
1587
+ ddp -> dd_used_breakdown [oldtype ] -= delta ;
1588
+ ddp -> dd_used_breakdown [newtype ] += delta ;
1593
1589
mutex_exit (& dd -> dd_lock );
1594
1590
}
1595
1591
1592
+ void
1593
+ dsl_dir_diduse_transfer_space (dsl_dir_t * dd , int64_t used ,
1594
+ int64_t compressed , int64_t uncompressed , int64_t tonew ,
1595
+ dd_used_t oldtype , dd_used_t newtype , dmu_tx_t * tx )
1596
+ {
1597
+ int64_t accounted_delta ;
1598
+
1599
+ ASSERT (dmu_tx_is_syncing (tx ));
1600
+ ASSERT (oldtype < DD_USED_NUM );
1601
+ ASSERT (newtype < DD_USED_NUM );
1602
+
1603
+ dmu_buf_will_dirty (dd -> dd_dbuf , tx );
1604
+
1605
+ mutex_enter (& dd -> dd_lock );
1606
+ dsl_dir_phys_t * ddp = dsl_dir_phys (dd );
1607
+ accounted_delta = parent_delta (dd , ddp -> dd_used_bytes , used );
1608
+ ASSERT (used >= 0 || ddp -> dd_used_bytes >= - used );
1609
+ ASSERT (compressed >= 0 || ddp -> dd_compressed_bytes >= - compressed );
1610
+ ASSERT (uncompressed >= 0 ||
1611
+ ddp -> dd_uncompressed_bytes >= - uncompressed );
1612
+ ddp -> dd_used_bytes += used ;
1613
+ ddp -> dd_uncompressed_bytes += uncompressed ;
1614
+ ddp -> dd_compressed_bytes += compressed ;
1615
+
1616
+ if (ddp -> dd_flags & DD_FLAG_USED_BREAKDOWN ) {
1617
+ ASSERT (tonew - used <= 0 ||
1618
+ ddp -> dd_used_breakdown [oldtype ] >= tonew - used );
1619
+ ASSERT (tonew >= 0 ||
1620
+ ddp -> dd_used_breakdown [newtype ] >= - tonew );
1621
+ ddp -> dd_used_breakdown [oldtype ] -= tonew - used ;
1622
+ ddp -> dd_used_breakdown [newtype ] += tonew ;
1623
+ #ifdef ZFS_DEBUG
1624
+ {
1625
+ dd_used_t t ;
1626
+ uint64_t u = 0 ;
1627
+ for (t = 0 ; t < DD_USED_NUM ; t ++ )
1628
+ u += ddp -> dd_used_breakdown [t ];
1629
+ ASSERT3U (u , = = , ddp -> dd_used_bytes );
1630
+ }
1631
+ #endif
1632
+ }
1633
+ mutex_exit (& dd -> dd_lock );
1634
+
1635
+ if (dd -> dd_parent != NULL ) {
1636
+ dsl_dir_diduse_transfer_space (dd -> dd_parent ,
1637
+ accounted_delta , compressed , uncompressed ,
1638
+ used , DD_USED_CHILD_RSRV , DD_USED_CHILD , tx );
1639
+ }
1640
+ }
1641
+
1596
1642
typedef struct dsl_dir_set_qr_arg {
1597
1643
const char * ddsqra_name ;
1598
1644
zprop_source_t ddsqra_source ;
0 commit comments