]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
block: Fix an error path in disk_update_zone_resources()
authorBart Van Assche <bvanassche@acm.org>
Wed, 14 Jan 2026 19:28:02 +0000 (11:28 -0800)
committerJens Axboe <axboe@kernel.dk>
Mon, 19 Jan 2026 18:04:06 +0000 (11:04 -0700)
Any queue_limits_start_update() call must be followed either by a
queue_limits_commit_update() call or by a queue_limits_cancel_update()
call. Make sure that the error path near the start of
disk_update_zone_resources() follows this requirement. Remove the
"goto unfreeze" statement from that error path to make the code easier
to verify.

This was detected by annotating the queue_limits_*() calls with Clang
thread-safety attributes and by building the kernel with thread-safety
checking enabled. Without this patch and with thread-safety checking
enabled, the following error is reported:

block/blk-zoned.c:2020:1: error: mutex 'disk->queue->limits_lock' is not held on every path through here [-Werror,-Wthread-safety-analysis]
 2020 | }
      | ^
block/blk-zoned.c:1959:8: note: mutex acquired here
 1959 |         lim = queue_limits_start_update(q);
      |               ^

Cc: Damien Le Moal <dlemoal@kernel.org>
Cc: Christoph Hellwig <hch@lst.de>
Fixes: bba4322e3f30 ("block: freeze queue when updating zone resources")
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20260114192803.4171847-3-bvanassche@acm.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-zoned.c

index 1c54678fae6b97b793c93dac5d39f009a53de14e..8000c94690ee20d9606968e54e8442f46dda1fd7 100644 (file)
@@ -1957,6 +1957,7 @@ static int disk_update_zone_resources(struct gendisk *disk,
 
        disk->nr_zones = args->nr_zones;
        if (args->nr_conv_zones >= disk->nr_zones) {
+               queue_limits_cancel_update(q);
                pr_warn("%s: Invalid number of conventional zones %u / %u\n",
                        disk->disk_name, args->nr_conv_zones, disk->nr_zones);
                ret = -ENODEV;