@@ -5230,7 +5230,7 @@ metaslab_group_alloc(metaslab_group_t *mg, zio_alloc_list_t *zal,
5230
5230
static int
5231
5231
metaslab_alloc_dva_range (spa_t * spa , metaslab_class_t * mc , uint64_t psize ,
5232
5232
uint64_t max_psize , dva_t * dva , int d , dva_t * hintdva , uint64_t txg ,
5233
- int flags , zio_alloc_list_t * zal , int allocator )
5233
+ int flags , zio_alloc_list_t * zal , int allocator , uint64_t * actual_psize )
5234
5234
{
5235
5235
metaslab_class_allocator_t * mca = & mc -> mc_allocator [allocator ];
5236
5236
metaslab_group_t * mg , * rotor ;
@@ -5253,9 +5253,13 @@ metaslab_alloc_dva_range(spa_t *spa, metaslab_class_t *mc, uint64_t psize,
5253
5253
allocator );
5254
5254
return (SET_ERROR (ENOSPC ));
5255
5255
}
5256
- if (max_psize > psize && max_psize >= metaslab_force_ganging ) {
5257
- max_psize = (metaslab_force_ganging - psize ) / 2 + psize ;
5256
+ if (max_psize > psize && max_psize >= metaslab_force_ganging &&
5257
+ metaslab_force_ganging_pct > 0 &&
5258
+ (random_in_range (100 ) < MIN (metaslab_force_ganging_pct , 100 ))) {
5259
+ max_psize = MAX ((psize + max_psize ) / 2 ,
5260
+ metaslab_force_ganging );
5258
5261
}
5262
+ ASSERT3U (psize , <=, max_psize );
5259
5263
5260
5264
/*
5261
5265
* Start at the rotor and loop through all mgs until we find something.
@@ -5377,6 +5381,8 @@ metaslab_alloc_dva_range(spa_t *spa, metaslab_class_t *mc, uint64_t psize,
5377
5381
uint64_t offset = metaslab_group_alloc (mg , zal , asize ,
5378
5382
max_asize , txg , !try_hard , dva , d , allocator , try_hard ,
5379
5383
& asize );
5384
+ if (actual_psize )
5385
+ * actual_psize = vdev_asize_to_psize_txg (vd , asize , txg );
5380
5386
5381
5387
if (offset != -1ULL ) {
5382
5388
/*
@@ -5471,7 +5477,7 @@ metaslab_alloc_dva(spa_t *spa, metaslab_class_t *mc, uint64_t psize,
5471
5477
zio_alloc_list_t * zal , int allocator )
5472
5478
{
5473
5479
return (metaslab_alloc_dva_range (spa , mc , psize , psize , dva , d , hintdva ,
5474
- txg , flags , zal , allocator ));
5480
+ txg , flags , zal , allocator , NULL ));
5475
5481
}
5476
5482
5477
5483
void
@@ -5952,14 +5958,14 @@ metaslab_alloc(spa_t *spa, metaslab_class_t *mc, uint64_t psize, blkptr_t *bp,
5952
5958
zio_alloc_list_t * zal , zio_t * zio , int allocator )
5953
5959
{
5954
5960
return (metaslab_alloc_range (spa , mc , psize , psize , bp , ndvas , txg ,
5955
- hintbp , flags , zal , zio , allocator ));
5961
+ hintbp , flags , zal , zio , allocator , NULL ));
5956
5962
}
5957
5963
5958
5964
int
5959
5965
metaslab_alloc_range (spa_t * spa , metaslab_class_t * mc , uint64_t psize ,
5960
5966
uint64_t max_psize , blkptr_t * bp , int ndvas , uint64_t txg ,
5961
5967
blkptr_t * hintbp , int flags , zio_alloc_list_t * zal , zio_t * zio ,
5962
- int allocator )
5968
+ int allocator , uint64_t * actual_psize )
5963
5969
{
5964
5970
dva_t * dva = bp -> blk_dva ;
5965
5971
dva_t * hintdva = (hintbp != NULL ) ? hintbp -> blk_dva : NULL ;
@@ -5981,9 +5987,11 @@ metaslab_alloc_range(spa_t *spa, metaslab_class_t *mc, uint64_t psize,
5981
5987
ASSERT (hintbp == NULL || ndvas <= BP_GET_NDVAS (hintbp ));
5982
5988
ASSERT3P (zal , != , NULL );
5983
5989
5990
+ uint64_t cur_psize = 0 , min_psize = UINT64_MAX ;
5991
+
5984
5992
for (int d = 0 ; d < ndvas ; d ++ ) {
5985
5993
error = metaslab_alloc_dva_range (spa , mc , psize , max_psize ,
5986
- dva , d , hintdva , txg , flags , zal , allocator );
5994
+ dva , d , hintdva , txg , flags , zal , allocator , & cur_psize );
5987
5995
if (error != 0 ) {
5988
5996
for (d -- ; d >= 0 ; d -- ) {
5989
5997
metaslab_unalloc_dva (spa , & dva [d ], txg );
@@ -6001,10 +6009,14 @@ metaslab_alloc_range(spa_t *spa, metaslab_class_t *mc, uint64_t psize,
6001
6009
*/
6002
6010
metaslab_group_alloc_increment (spa ,
6003
6011
DVA_GET_VDEV (& dva [d ]), zio , flags , allocator );
6012
+ min_psize = MIN (cur_psize , min_psize );
6004
6013
}
6005
6014
}
6006
6015
ASSERT (error == 0 );
6007
6016
ASSERT (BP_GET_NDVAS (bp ) == ndvas );
6017
+ ASSERT3U (min_psize , != , UINT64_MAX );
6018
+ if (actual_psize )
6019
+ * actual_psize = min_psize ;
6008
6020
6009
6021
spa_config_exit (spa , SCL_ALLOC , FTAG );
6010
6022
0 commit comments