Skip to content

Commit

Permalink
block: call submit_bio_checks under q_usage_counter
Browse files Browse the repository at this point in the history
Ensure all bios check the current values of the queue under freeze
protection, i.e. to make sure the zero capacity set by del_gendisk
is actually seen before dispatching to the driver.

Signed-off-by: Christoph Hellwig <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Tested-by: Yi Zhang <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
Christoph Hellwig authored and axboe committed Oct 16, 2021
1 parent baa0ab2 commit cc9c884
Showing 1 changed file with 12 additions and 22 deletions.
34 changes: 12 additions & 22 deletions block/blk-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -899,11 +899,18 @@ static blk_qc_t __submit_bio(struct bio *bio)
struct gendisk *disk = bio->bi_bdev->bd_disk;
blk_qc_t ret = BLK_QC_T_NONE;

if (blk_crypto_bio_prep(&bio)) {
if (!disk->fops->submit_bio)
return blk_mq_submit_bio(bio);
if (unlikely(bio_queue_enter(bio) != 0))
return BLK_QC_T_NONE;

if (!submit_bio_checks(bio) || !blk_crypto_bio_prep(&bio))
goto queue_exit;
if (disk->fops->submit_bio) {
ret = disk->fops->submit_bio(bio);
goto queue_exit;
}
return blk_mq_submit_bio(bio);

queue_exit:
blk_queue_exit(disk->queue);
return ret;
}
Expand Down Expand Up @@ -941,9 +948,6 @@ static blk_qc_t __submit_bio_noacct(struct bio *bio)
struct request_queue *q = bio->bi_bdev->bd_disk->queue;
struct bio_list lower, same;

if (unlikely(bio_queue_enter(bio) != 0))
continue;

/*
* Create a fresh bio_list for all subordinate requests.
*/
Expand Down Expand Up @@ -979,23 +983,12 @@ static blk_qc_t __submit_bio_noacct(struct bio *bio)
static blk_qc_t __submit_bio_noacct_mq(struct bio *bio)
{
struct bio_list bio_list[2] = { };
blk_qc_t ret = BLK_QC_T_NONE;
blk_qc_t ret;

current->bio_list = bio_list;

do {
struct gendisk *disk = bio->bi_bdev->bd_disk;

if (unlikely(bio_queue_enter(bio) != 0))
continue;

if (!blk_crypto_bio_prep(&bio)) {
blk_queue_exit(disk->queue);
ret = BLK_QC_T_NONE;
continue;
}

ret = blk_mq_submit_bio(bio);
ret = __submit_bio(bio);
} while ((bio = bio_list_pop(&bio_list[0])));

current->bio_list = NULL;
Expand All @@ -1013,9 +1006,6 @@ static blk_qc_t __submit_bio_noacct_mq(struct bio *bio)
*/
blk_qc_t submit_bio_noacct(struct bio *bio)
{
if (!submit_bio_checks(bio))
return BLK_QC_T_NONE;

/*
* We only want one ->submit_bio to be active at a time, else stack
* usage with stacked devices could be a problem. Use current->bio_list
Expand Down

0 comments on commit cc9c884

Please sign in to comment.