]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
block: add a queue_limits_commit_update_frozen helper
authorChristoph Hellwig <hch@lst.de>
Fri, 10 Jan 2025 05:47:10 +0000 (06:47 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 9 Sep 2025 16:58:24 +0000 (18:58 +0200)
[ Upstream commit aa427d7b73b196f657d6d2cf0e94eff6b883fdef ]

Add a helper that freezes the queue, updates the queue limits and
unfreezes the queue and convert all open coded versions of that to the
new helper.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: John Garry <john.g.garry@oracle.com>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Nilay Shroff <nilay@linux.ibm.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Link: https://lore.kernel.org/r/20250110054726.1499538-3-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Stable-dep-of: 708e2371f77a ("scsi: sr: Reinstate rotational media flag")
Signed-off-by: Sasha Levin <sashal@kernel.org>
block/blk-integrity.c
block/blk-settings.c
block/blk-zoned.c
drivers/block/virtio_blk.c
drivers/scsi/sd.c
drivers/scsi/sr.c
include/linux/blkdev.h

index 83b696ba0cac3142878668fbde8a603c03853604..3fe0681399f6e5a403b116e6ad1ea15f15ecc290 100644 (file)
@@ -218,9 +218,7 @@ static ssize_t flag_store(struct device *dev, const char *page, size_t count,
        else
                lim.integrity.flags |= flag;
 
-       blk_mq_freeze_queue(q);
-       err = queue_limits_commit_update(q, &lim);
-       blk_mq_unfreeze_queue(q);
+       err = queue_limits_commit_update_frozen(q, &lim);
        if (err)
                return err;
        return count;
index 9ae3eee4b5ae5f4000117f5f0a20b7a75b907bd9..f24fffdb6c294cc46f28c9891764d0d8335ba613 100644 (file)
@@ -444,6 +444,30 @@ out_unlock:
 }
 EXPORT_SYMBOL_GPL(queue_limits_commit_update);
 
+/**
+ * queue_limits_commit_update_frozen - commit an atomic update of queue limits
+ * @q:         queue to update
+ * @lim:       limits to apply
+ *
+ * Apply the limits in @lim that were obtained from queue_limits_start_update()
+ * and updated with the new values by the caller to @q.  Freezes the queue
+ * before the update and unfreezes it after.
+ *
+ * Returns 0 if successful, else a negative error code.
+ */
+int queue_limits_commit_update_frozen(struct request_queue *q,
+               struct queue_limits *lim)
+{
+       int ret;
+
+       blk_mq_freeze_queue(q);
+       ret = queue_limits_commit_update(q, lim);
+       blk_mq_unfreeze_queue(q);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(queue_limits_commit_update_frozen);
+
 /**
  * queue_limits_set - apply queue limits to queue
  * @q:         queue to update
index 5915fb98ffdcea1d5177e992a896a9ce7e8f0407..f1160cc2cf85d913596babda4c2512c7401896cf 100644 (file)
@@ -1510,7 +1510,6 @@ static int disk_update_zone_resources(struct gendisk *disk,
        unsigned int nr_seq_zones, nr_conv_zones;
        unsigned int pool_size;
        struct queue_limits lim;
-       int ret;
 
        disk->nr_zones = args->nr_zones;
        disk->zone_capacity = args->zone_capacity;
@@ -1561,11 +1560,7 @@ static int disk_update_zone_resources(struct gendisk *disk,
        }
 
 commit:
-       blk_mq_freeze_queue(q);
-       ret = queue_limits_commit_update(q, &lim);
-       blk_mq_unfreeze_queue(q);
-
-       return ret;
+       return queue_limits_commit_update_frozen(q, &lim);
 }
 
 static int blk_revalidate_conv_zone(struct blk_zone *zone, unsigned int idx,
index fd6c565f8a507c02e49818b9877a7e7990b40908..4bedcb49a73a700450d415f18ef4db7529edb81d 100644 (file)
@@ -1106,9 +1106,7 @@ cache_type_store(struct device *dev, struct device_attribute *attr,
                lim.features |= BLK_FEAT_WRITE_CACHE;
        else
                lim.features &= ~BLK_FEAT_WRITE_CACHE;
-       blk_mq_freeze_queue(disk->queue);
-       i = queue_limits_commit_update(disk->queue, &lim);
-       blk_mq_unfreeze_queue(disk->queue);
+       i = queue_limits_commit_update_frozen(disk->queue, &lim);
        if (i)
                return i;
        return count;
index e1b06f803a94b1c455494e241f0b53a6812f38a6..ee1d5dec3bc60591cb9c719a39a2d71c0dbb155f 100644 (file)
@@ -177,9 +177,8 @@ cache_type_store(struct device *dev, struct device_attribute *attr,
 
                lim = queue_limits_start_update(sdkp->disk->queue);
                sd_set_flush_flag(sdkp, &lim);
-               blk_mq_freeze_queue(sdkp->disk->queue);
-               ret = queue_limits_commit_update(sdkp->disk->queue, &lim);
-               blk_mq_unfreeze_queue(sdkp->disk->queue);
+               ret = queue_limits_commit_update_frozen(sdkp->disk->queue,
+                               &lim);
                if (ret)
                        return ret;
                return count;
@@ -483,9 +482,7 @@ provisioning_mode_store(struct device *dev, struct device_attribute *attr,
 
        lim = queue_limits_start_update(sdkp->disk->queue);
        sd_config_discard(sdkp, &lim, mode);
-       blk_mq_freeze_queue(sdkp->disk->queue);
-       err = queue_limits_commit_update(sdkp->disk->queue, &lim);
-       blk_mq_unfreeze_queue(sdkp->disk->queue);
+       err = queue_limits_commit_update_frozen(sdkp->disk->queue, &lim);
        if (err)
                return err;
        return count;
@@ -594,9 +591,7 @@ max_write_same_blocks_store(struct device *dev, struct device_attribute *attr,
 
        lim = queue_limits_start_update(sdkp->disk->queue);
        sd_config_write_same(sdkp, &lim);
-       blk_mq_freeze_queue(sdkp->disk->queue);
-       err = queue_limits_commit_update(sdkp->disk->queue, &lim);
-       blk_mq_unfreeze_queue(sdkp->disk->queue);
+       err = queue_limits_commit_update_frozen(sdkp->disk->queue, &lim);
        if (err)
                return err;
        return count;
@@ -3803,9 +3798,7 @@ static int sd_revalidate_disk(struct gendisk *disk)
        sd_config_write_same(sdkp, &lim);
        kfree(buffer);
 
-       blk_mq_freeze_queue(sdkp->disk->queue);
-       err = queue_limits_commit_update(sdkp->disk->queue, &lim);
-       blk_mq_unfreeze_queue(sdkp->disk->queue);
+       err = queue_limits_commit_update_frozen(sdkp->disk->queue, &lim);
        if (err)
                return err;
 
index 198bec87bb8e7c95da96cc992f7c148782eebc61..b17796d5ee665265efd79ced98cb98edd0eb2c91 100644 (file)
@@ -797,10 +797,7 @@ static int get_sectorsize(struct scsi_cd *cd)
 
        lim = queue_limits_start_update(q);
        lim.logical_block_size = sector_size;
-       blk_mq_freeze_queue(q);
-       err = queue_limits_commit_update(q, &lim);
-       blk_mq_unfreeze_queue(q);
-       return err;
+       return queue_limits_commit_update_frozen(q, &lim);
 }
 
 static int get_capabilities(struct scsi_cd *cd)
index a901aed77141f022bdae7c033039ae09cdd72b51..cd9c97f6f9484ba42a8f19410101bef49a553e66 100644 (file)
@@ -990,6 +990,8 @@ queue_limits_start_update(struct request_queue *q)
        mutex_lock(&q->limits_lock);
        return q->limits;
 }
+int queue_limits_commit_update_frozen(struct request_queue *q,
+               struct queue_limits *lim);
 int queue_limits_commit_update(struct request_queue *q,
                struct queue_limits *lim);
 int queue_limits_set(struct request_queue *q, struct queue_limits *lim);