@@ -9212,10 +9212,13 @@ static void remove_bdev_from_group(char *bdev_names) {
9212
9212
struct spdk_bdev_qos_group_id_mapping * qos_group_id_object = NULL ;
9213
9213
struct qos_bdev_list_node * bdev_node = NULL ;
9214
9214
9215
+ if (TAILQ_EMPTY (& g_qos_bdev_group_list )) {
9216
+ return ;
9217
+ }
9215
9218
TAILQ_FOREACH (qos_group_id_object , & g_qos_bdev_group_list , link ) {
9216
9219
TAILQ_FOREACH (bdev_node , & qos_group_id_object -> bdev_list , link ) {
9217
9220
if (strcmp (bdev_node -> bdev_name , bdev_names ) == 0 ) {
9218
- SPDK_NOTICELOG ("Removing the bdev from list: %s\n" , bdev_node -> bdev_name );
9221
+ SPDK_NOTICELOG ("Removing the bdev from list: %s vs %s \n" , bdev_node -> bdev_name , bdev_names );
9219
9222
TAILQ_REMOVE (& qos_group_id_object -> bdev_list , bdev_node , link );
9220
9223
if (bdev_node -> bdev_name ) {
9221
9224
free (bdev_node -> bdev_name );
@@ -9228,13 +9231,13 @@ static void remove_bdev_from_group(char *bdev_names) {
9228
9231
-- qos_group_id_object -> bdev_list_size ;
9229
9232
9230
9233
if (qos_group_id_object -> bdev_list_size == 0 ) {
9231
- SPDK_NOTICELOG ("Cleaning the group mapping\n" );
9232
- if (qos_group_id_object -> rate_limits ) {
9233
- SPDK_NOTICELOG ("Cleaning the rate limit\n" );
9234
- free (qos_group_id_object -> rate_limits );
9235
- qos_group_id_object -> rate_limits = NULL ;
9236
- }
9237
- free (qos_group_id_object -> rate_limits );
9234
+ SPDK_NOTICELOG ("Cleaning the group mapping for group %" PRIu64 " \n", qos_group_id_object -> bdev_group_id );
9235
+ // if(qos_group_id_object->rate_limits != NULL ) {
9236
+ // SPDK_NOTICELOG("Cleaning the rate limit\n");
9237
+ // // free(qos_group_id_object->rate_limits);
9238
+ // // qos_group_id_object->rate_limits = NULL;
9239
+ // }
9240
+ // free(qos_group_id_object->rate_limits);
9238
9241
TAILQ_REMOVE (& g_qos_bdev_group_list , qos_group_id_object , link );
9239
9242
if (qos_group_id_object ) {
9240
9243
free (qos_group_id_object );
@@ -9425,7 +9428,6 @@ bdev_set_qos_limit_done(struct set_qos_limit_ctx *ctx, int status)
9425
9428
ctx -> cb_fn (ctx -> cb_arg , 0 );
9426
9429
free (ctx );
9427
9430
ctx = NULL ;
9428
- spdk_spin_unlock (& ctx -> bdev -> internal .spinlock );
9429
9431
return ;
9430
9432
}
9431
9433
rc = spdk_bdev_open_ext (next_qos_bdev_node -> bdev_name , false, dummy_bdev_event_cb , NULL , & desc );
@@ -9434,7 +9436,6 @@ bdev_set_qos_limit_done(struct set_qos_limit_ctx *ctx, int status)
9434
9436
ctx -> cb_fn (ctx -> cb_arg , - ENXIO );
9435
9437
free (ctx );
9436
9438
ctx = NULL ;
9437
- spdk_spin_unlock (& ctx -> bdev -> internal .spinlock );
9438
9439
return ;
9439
9440
}
9440
9441
@@ -9456,7 +9457,6 @@ bdev_set_qos_limit_done(struct set_qos_limit_ctx *ctx, int status)
9456
9457
} else {
9457
9458
// End of the the nodes
9458
9459
if (ctx -> is_remove_requets ) {
9459
-
9460
9460
remove_bdev_from_group (ctx -> qos_bdev_node -> bdev_name );
9461
9461
for (uint64_t i = 0 ; i < ctx -> total_bdev_to_process ; i ++ ) {
9462
9462
if (ctx -> remove_bdev_names [i ] != NULL ) {
@@ -9487,6 +9487,7 @@ bdev_disable_qos_done(void *cb_arg)
9487
9487
struct set_qos_limit_ctx * ctx = cb_arg ;
9488
9488
struct spdk_bdev * bdev = ctx -> bdev ;
9489
9489
struct spdk_bdev_qos * qos ;
9490
+ bool deleted_common_rate_limit = false;
9490
9491
9491
9492
spdk_spin_lock (& bdev -> internal .spinlock );
9492
9493
qos = bdev -> internal .qos ;
@@ -9504,9 +9505,13 @@ bdev_disable_qos_done(void *cb_arg)
9504
9505
if (ctx -> total_bdev_to_process <= ctx -> bdev_node_cout ) {
9505
9506
free (ctx -> qos_group_id_object -> rate_limits );
9506
9507
ctx -> qos_group_id_object -> rate_limits = NULL ;
9508
+ deleted_common_rate_limit = true;
9507
9509
}
9508
9510
if (ctx -> is_remove_requets == true) {
9509
- free (qos -> rate_limits );
9511
+ if (deleted_common_rate_limit == false ){
9512
+ free (qos -> rate_limits );
9513
+ }
9514
+
9510
9515
}
9511
9516
} else {
9512
9517
free (qos -> rate_limits );
@@ -9944,8 +9949,8 @@ spdk_bdev_set_qos_rate_limits_ex(struct spdk_bdev *bdev, uint64_t *limits, uint6
9944
9949
}
9945
9950
} else {
9946
9951
if (bdev -> internal .qos != NULL ) {
9947
- SPDK_NOTICELOG ("DISABLING the limits for bdev %s\n" , bdev -> name );
9948
- if (is_remove_bdev_request == true) {
9952
+ SPDK_NOTICELOG ("DISABLING the limits for bdev %s vs %d \n" , bdev -> name , qos_group_id_object -> bdev_list_size );
9953
+ if (is_remove_bdev_request == true && qos_group_id_object -> bdev_list_size != 1 ) {
9949
9954
// Replace the rate_limits with new memory to make sure the group limits are intact.
9950
9955
bdev -> internal .qos -> rate_limits = calloc (SPDK_BDEV_QOS_NUM_RATE_LIMIT_TYPES , sizeof (struct spdk_bdev_qos_limit ));
9951
9956
if (remove_bdev_list != NULL ) {
0 commit comments