]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
blk-zoned: Move code from disk_zone_wplug_add_bio() into its caller
authorBart Van Assche <bvanassche@acm.org>
Tue, 11 Nov 2025 23:29:02 +0000 (15:29 -0800)
committerJens Axboe <axboe@kernel.dk>
Wed, 12 Nov 2025 21:05:23 +0000 (14:05 -0700)
Move the following code into the only caller of disk_zone_wplug_add_bio():
 - The code for clearing the REQ_NOWAIT flag.
 - The code that sets the BLK_ZONE_WPLUG_PLUGGED flag.
 - The disk_zone_wplug_schedule_bio_work() call.

This patch moves all code that is related to REQ_NOWAIT or to bio
scheduling into a single function. Additionally, the 'schedule_bio_work'
variable is removed. No functionality has been changed.

Cc: Damien Le Moal <dlemoal@kernel.org>
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Damien Le Moal <dlmoal@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-zoned.c

index 5487d5eb26508688a945dd0251bad389cc8de48b..85de45c3f6be1605059b1f884cdd1a081830a52c 100644 (file)
@@ -1204,8 +1204,6 @@ static inline void disk_zone_wplug_add_bio(struct gendisk *disk,
                                struct blk_zone_wplug *zwplug,
                                struct bio *bio, unsigned int nr_segs)
 {
-       bool schedule_bio_work = false;
-
        /*
         * Grab an extra reference on the BIO request queue usage counter.
         * This reference will be reused to submit a request for the BIO for
@@ -1221,16 +1219,6 @@ static inline void disk_zone_wplug_add_bio(struct gendisk *disk,
         */
        bio_clear_polled(bio);
 
-       /*
-        * REQ_NOWAIT BIOs are always handled using the zone write plug BIO
-        * work, which can block. So clear the REQ_NOWAIT flag and schedule the
-        * work if this is the first BIO we are plugging.
-        */
-       if (bio->bi_opf & REQ_NOWAIT) {
-               schedule_bio_work = !(zwplug->flags & BLK_ZONE_WPLUG_PLUGGED);
-               bio->bi_opf &= ~REQ_NOWAIT;
-       }
-
        /*
         * Reuse the poll cookie field to store the number of segments when
         * split to the hardware limits.
@@ -1246,11 +1234,6 @@ static inline void disk_zone_wplug_add_bio(struct gendisk *disk,
        bio_list_add(&zwplug->bio_list, bio);
        trace_disk_zone_wplug_add_bio(zwplug->disk->queue, zwplug->zone_no,
                                      bio->bi_iter.bi_sector, bio_sectors(bio));
-
-       zwplug->flags |= BLK_ZONE_WPLUG_PLUGGED;
-
-       if (schedule_bio_work)
-               disk_zone_wplug_schedule_bio_work(disk, zwplug);
 }
 
 /*
@@ -1461,14 +1444,17 @@ static bool blk_zone_wplug_handle_write(struct bio *bio, unsigned int nr_segs)
        bio_set_flag(bio, BIO_ZONE_WRITE_PLUGGING);
 
        /*
-        * If the zone is already plugged, add the BIO to the plug BIO list.
-        * Do the same for REQ_NOWAIT BIOs to ensure that we will not see a
-        * BLK_STS_AGAIN failure if we let the BIO execute.
-        * Otherwise, plug and let the BIO execute.
+        * Add REQ_NOWAIT BIOs to the plug list to ensure that we will not see a
+        * BLK_STS_AGAIN failure if we let the caller submit the BIO.
         */
-       if ((zwplug->flags & BLK_ZONE_WPLUG_PLUGGED) ||
-           (bio->bi_opf & REQ_NOWAIT))
-               goto plug;
+       if (bio->bi_opf & REQ_NOWAIT) {
+               bio->bi_opf &= ~REQ_NOWAIT;
+               goto queue_bio;
+       }
+
+       /* If the zone is already plugged, add the BIO to the BIO plug list. */
+       if (zwplug->flags & BLK_ZONE_WPLUG_PLUGGED)
+               goto queue_bio;
 
        if (!blk_zone_wplug_prepare_bio(zwplug, bio)) {
                spin_unlock_irqrestore(&zwplug->lock, flags);
@@ -1476,15 +1462,21 @@ static bool blk_zone_wplug_handle_write(struct bio *bio, unsigned int nr_segs)
                return true;
        }
 
+       /* Otherwise, plug and let the caller submit the BIO. */
        zwplug->flags |= BLK_ZONE_WPLUG_PLUGGED;
 
        spin_unlock_irqrestore(&zwplug->lock, flags);
 
        return false;
 
-plug:
+queue_bio:
        disk_zone_wplug_add_bio(disk, zwplug, bio, nr_segs);
 
+       if (!(zwplug->flags & BLK_ZONE_WPLUG_PLUGGED)) {
+               zwplug->flags |= BLK_ZONE_WPLUG_PLUGGED;
+               disk_zone_wplug_schedule_bio_work(disk, zwplug);
+       }
+
        spin_unlock_irqrestore(&zwplug->lock, flags);
 
        return true;