]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
block: don't use submit_bio_noacct_nocheck in blk_zone_wplug_bio_work
authorChristoph Hellwig <hch@lst.de>
Wed, 11 Jun 2025 04:44:16 +0000 (06:44 +0200)
committerJens Axboe <axboe@kernel.dk>
Wed, 11 Jun 2025 12:42:27 +0000 (06:42 -0600)
Bios queued up in the zone write plug have already gone through all all
preparation in the submit_bio path, including the freeze protection.

Submitting them through submit_bio_noacct_nocheck duplicates the work
and can can cause deadlocks when freezing a queue with pending bio
write plugs.

Go straight to ->submit_bio or blk_mq_submit_bio to bypass the
superfluous extra freeze protection and checks.

Fixes: 9b1ce7f0c6f8 ("block: Implement zone append emulation")
Reported-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Tested-by: Damien Le Moal <dlemoal@kernel.org>
Link: https://lore.kernel.org/r/20250611044416.2351850-1-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-zoned.c

index cee7a0774a9bfc7c9335c5a2e12601dd83ea3f39..351d659280e116c2b6ffa61d4bdda7ce3f253d0e 100644 (file)
@@ -1307,7 +1307,6 @@ again:
        spin_unlock_irqrestore(&zwplug->lock, flags);
 
        bdev = bio->bi_bdev;
-       submit_bio_noacct_nocheck(bio);
 
        /*
         * blk-mq devices will reuse the extra reference on the request queue
@@ -1315,8 +1314,12 @@ again:
         * path for BIO-based devices will not do that. So drop this extra
         * reference here.
         */
-       if (bdev_test_flag(bdev, BD_HAS_SUBMIT_BIO))
+       if (bdev_test_flag(bdev, BD_HAS_SUBMIT_BIO)) {
+               bdev->bd_disk->fops->submit_bio(bio);
                blk_queue_exit(bdev->bd_disk->queue);
+       } else {
+               blk_mq_submit_bio(bio);
+       }
 
 put_zwplug:
        /* Drop the reference we took in disk_zone_wplug_schedule_bio_work(). */