@@ -443,10 +443,12 @@ metaslab_class_destroy(metaslab_class_t *mc)
443443{
444444 spa_t * spa = mc -> mc_spa ;
445445
446- ASSERT (mc -> mc_alloc == 0 );
447- ASSERT (mc -> mc_deferred == 0 );
448- ASSERT (mc -> mc_space == 0 );
449- ASSERT (mc -> mc_dspace == 0 );
446+ ASSERT0 (mc -> mc_alloc );
447+ ASSERT0 (mc -> mc_dalloc );
448+ ASSERT0 (mc -> mc_deferred );
449+ ASSERT0 (mc -> mc_ddeferred );
450+ ASSERT0 (mc -> mc_space );
451+ ASSERT0 (mc -> mc_dspace );
450452
451453 for (int i = 0 ; i < spa -> spa_alloc_count ; i ++ ) {
452454 metaslab_class_allocator_t * mca = & mc -> mc_allocator [i ];
@@ -487,36 +489,48 @@ metaslab_class_validate(metaslab_class_t *mc)
487489
488490static void
489491metaslab_class_space_update (metaslab_class_t * mc , int64_t alloc_delta ,
490- int64_t defer_delta , int64_t space_delta , int64_t dspace_delta )
492+ int64_t dalloc_delta , int64_t deferred_delta , int64_t ddeferred_delta ,
493+ int64_t space_delta , int64_t dspace_delta )
491494{
492495 atomic_add_64 (& mc -> mc_alloc , alloc_delta );
493- atomic_add_64 (& mc -> mc_deferred , defer_delta );
496+ atomic_add_64 (& mc -> mc_dalloc , dalloc_delta );
497+ atomic_add_64 (& mc -> mc_deferred , deferred_delta );
498+ atomic_add_64 (& mc -> mc_ddeferred , ddeferred_delta );
494499 atomic_add_64 (& mc -> mc_space , space_delta );
495500 atomic_add_64 (& mc -> mc_dspace , dspace_delta );
496501}
497502
498503uint64_t
499504metaslab_class_get_alloc (metaslab_class_t * mc )
500505{
501- return (mc -> mc_alloc );
506+ return (atomic_load_64 (& mc -> mc_alloc ));
507+ }
508+
509+ uint64_t
510+ metaslab_class_get_dalloc (metaslab_class_t * mc )
511+ {
512+ return (spa_deflate (mc -> mc_spa ) ? atomic_load_64 (& mc -> mc_dalloc ) :
513+ atomic_load_64 (& mc -> mc_alloc ));
502514}
503515
504516uint64_t
505517metaslab_class_get_deferred (metaslab_class_t * mc )
506518{
507- return (mc -> mc_deferred );
519+ return (spa_deflate (mc -> mc_spa ) ? atomic_load_64 (& mc -> mc_ddeferred ) :
520+ atomic_load_64 (& mc -> mc_deferred ));
508521}
509522
510523uint64_t
511524metaslab_class_get_space (metaslab_class_t * mc )
512525{
513- return (mc -> mc_space );
526+ return (atomic_load_64 ( & mc -> mc_space ) );
514527}
515528
516529uint64_t
517530metaslab_class_get_dspace (metaslab_class_t * mc )
518531{
519- return (spa_deflate (mc -> mc_spa ) ? mc -> mc_dspace : mc -> mc_space );
532+ return (spa_deflate (mc -> mc_spa ) ? atomic_load_64 (& mc -> mc_dspace ) :
533+ atomic_load_64 (& mc -> mc_space ));
520534}
521535
522536void
@@ -2698,16 +2712,21 @@ metaslab_set_selected_txg(metaslab_t *msp, uint64_t txg)
26982712}
26992713
27002714void
2701- metaslab_space_update (vdev_t * vd , metaslab_class_t * mc , int64_t alloc_delta ,
2715+ metaslab_space_update (metaslab_group_t * mg , int64_t alloc_delta ,
27022716 int64_t defer_delta , int64_t space_delta )
27032717{
2718+ vdev_t * vd = mg -> mg_vd ;
2719+ int64_t dalloc_delta = vdev_deflated_space (vd , alloc_delta );
2720+ int64_t ddefer_delta = vdev_deflated_space (vd , defer_delta );
2721+ int64_t dspace_delta = vdev_deflated_space (vd , space_delta );
2722+
27042723 vdev_space_update (vd , alloc_delta , defer_delta , space_delta );
27052724
27062725 ASSERT3P (vd -> vdev_spa -> spa_root_vdev , = = , vd -> vdev_parent );
27072726 ASSERT (vd -> vdev_ms_count != 0 );
27082727
2709- metaslab_class_space_update (mc , alloc_delta , defer_delta , space_delta ,
2710- vdev_deflated_space ( vd , space_delta ) );
2728+ metaslab_class_space_update (mg -> mg_class , alloc_delta , dalloc_delta ,
2729+ defer_delta , ddefer_delta , space_delta , dspace_delta );
27112730}
27122731
27132732int
@@ -2819,8 +2838,7 @@ metaslab_init(metaslab_group_t *mg, uint64_t id, uint64_t object,
28192838 */
28202839 if (txg <= TXG_INITIAL ) {
28212840 metaslab_sync_done (ms , 0 );
2822- metaslab_space_update (vd , mg -> mg_class ,
2823- metaslab_allocated_space (ms ), 0 , 0 );
2841+ metaslab_space_update (mg , metaslab_allocated_space (ms ), 0 , 0 );
28242842 }
28252843
28262844 if (txg != 0 ) {
@@ -2882,9 +2900,8 @@ metaslab_fini(metaslab_t *msp)
28822900 * subtracted.
28832901 */
28842902 if (!msp -> ms_new ) {
2885- metaslab_space_update (vd , mg -> mg_class ,
2886- - metaslab_allocated_space (msp ), 0 , - msp -> ms_size );
2887-
2903+ metaslab_space_update (mg , - metaslab_allocated_space (msp ), 0 ,
2904+ - msp -> ms_size );
28882905 }
28892906 space_map_close (msp -> ms_sm );
28902907 msp -> ms_sm = NULL ;
@@ -4392,7 +4409,7 @@ metaslab_sync_done(metaslab_t *msp, uint64_t txg)
43924409
43934410 if (msp -> ms_new ) {
43944411 /* this is a new metaslab, add its capacity to the vdev */
4395- metaslab_space_update (vd , mg -> mg_class , 0 , 0 , msp -> ms_size );
4412+ metaslab_space_update (mg , 0 , 0 , msp -> ms_size );
43964413
43974414 /* there should be no allocations nor frees at this point */
43984415 VERIFY0 (msp -> ms_allocated_this_txg );
@@ -4421,8 +4438,7 @@ metaslab_sync_done(metaslab_t *msp, uint64_t txg)
44214438 } else {
44224439 defer_delta -= zfs_range_tree_space (* defer_tree );
44234440 }
4424- metaslab_space_update (vd , mg -> mg_class , alloc_delta + defer_delta ,
4425- defer_delta , 0 );
4441+ metaslab_space_update (mg , alloc_delta + defer_delta , defer_delta , 0 );
44264442
44274443 if (spa_syncing_log_sm (spa ) == NULL ) {
44284444 /*
@@ -5339,8 +5355,16 @@ metaslab_alloc_dva(spa_t *spa, metaslab_class_t *mc, uint64_t psize,
53395355 */
53405356 if (mca -> mca_aliquot == 0 && metaslab_bias_enabled ) {
53415357 vdev_stat_t * vs = & vd -> vdev_stat ;
5342- int64_t vs_free = vs -> vs_space - vs -> vs_alloc ;
5343- int64_t mc_free = mc -> mc_space - mc -> mc_alloc ;
5358+ uint64_t vs_space =
5359+ atomic_load_64 (& vs -> vs_space );
5360+ uint64_t mc_space =
5361+ atomic_load_64 (& mc -> mc_space );
5362+ uint64_t mc_alloc =
5363+ atomic_load_64 (& mc -> mc_alloc );
5364+ uint64_t vs_alloc =
5365+ atomic_load_64 (& vs -> vs_alloc );
5366+ int64_t vs_free = vs_space - vs_alloc ;
5367+ int64_t mc_free = mc_space - mc_alloc ;
53445368 int64_t ratio ;
53455369
53465370 /*
0 commit comments