Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

blk-mq: pass along blk_mq_alloc_tag_set return values

Two of the blk-mq based drivers do not pass back the return value
from blk_mq_alloc_tag_set, instead just returning -ENOMEM.

blk_mq_alloc_tag_set returns -EINVAL if the number of queues or
queue depth is bad. -ENOMEM implies that retrying after freeing some
memory might be more successful, but that won't ever change
in the -EINVAL cases.

Change the null_blk and mtip32xx drivers to pass along
the return value.

Signed-off-by: Robert Elliott <elliott@hp.com>
Signed-off-by: Jens Axboe <axboe@fb.com>

authored by

Robert Elliott and committed by
Jens Axboe
dc501dc0 07388549

+21 -9
-1
drivers/block/mtip32xx/mtip32xx.c
··· 3918 3918 if (rv) { 3919 3919 dev_err(&dd->pdev->dev, 3920 3920 "Unable to allocate request queue\n"); 3921 - rv = -ENOMEM; 3922 3921 goto block_queue_alloc_init_error; 3923 3922 } 3924 3923
+21 -8
drivers/block/null_blk.c
··· 462 462 struct gendisk *disk; 463 463 struct nullb *nullb; 464 464 sector_t size; 465 + int rv; 465 466 466 467 nullb = kzalloc_node(sizeof(*nullb), GFP_KERNEL, home_node); 467 - if (!nullb) 468 + if (!nullb) { 469 + rv = -ENOMEM; 468 470 goto out; 471 + } 469 472 470 473 spin_lock_init(&nullb->lock); 471 474 472 475 if (queue_mode == NULL_Q_MQ && use_per_node_hctx) 473 476 submit_queues = nr_online_nodes; 474 477 475 - if (setup_queues(nullb)) 478 + rv = setup_queues(nullb); 479 + if (rv) 476 480 goto out_free_nullb; 477 481 478 482 if (queue_mode == NULL_Q_MQ) { ··· 488 484 nullb->tag_set.flags = BLK_MQ_F_SHOULD_MERGE; 489 485 nullb->tag_set.driver_data = nullb; 490 486 491 - if (blk_mq_alloc_tag_set(&nullb->tag_set)) 487 + rv = blk_mq_alloc_tag_set(&nullb->tag_set); 488 + if (rv) 492 489 goto out_cleanup_queues; 493 490 494 491 nullb->q = blk_mq_init_queue(&nullb->tag_set); 495 - if (!nullb->q) 492 + if (!nullb->q) { 493 + rv = -ENOMEM; 496 494 goto out_cleanup_tags; 495 + } 497 496 } else if (queue_mode == NULL_Q_BIO) { 498 497 nullb->q = blk_alloc_queue_node(GFP_KERNEL, home_node); 499 - if (!nullb->q) 498 + if (!nullb->q) { 499 + rv = -ENOMEM; 500 500 goto out_cleanup_queues; 501 + } 501 502 blk_queue_make_request(nullb->q, null_queue_bio); 502 503 init_driver_queues(nullb); 503 504 } else { 504 505 nullb->q = blk_init_queue_node(null_request_fn, &nullb->lock, home_node); 505 - if (!nullb->q) 506 + if (!nullb->q) { 507 + rv = -ENOMEM; 506 508 goto out_cleanup_queues; 509 + } 507 510 blk_queue_prep_rq(nullb->q, null_rq_prep_fn); 508 511 blk_queue_softirq_done(nullb->q, null_softirq_done_fn); 509 512 init_driver_queues(nullb); ··· 520 509 queue_flag_set_unlocked(QUEUE_FLAG_NONROT, nullb->q); 521 510 522 511 disk = nullb->disk = alloc_disk_node(1, home_node); 523 - if (!disk) 512 + if (!disk) { 513 + rv = -ENOMEM; 524 514 goto out_cleanup_blk_queue; 515 + } 525 516 526 517 mutex_lock(&lock); 527 518 list_add_tail(&nullb->list, &nullb_list); ··· 557 544 out_free_nullb: 558 545 kfree(nullb); 559 546 out: 560 - return -ENOMEM; 547 + return rv; 561 548 } 562 549 563 550 static int __init null_init(void)