Commit aa427d7b authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

block: add a queue_limits_commit_update_frozen helper



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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarJohn Garry <john.g.garry@oracle.com>
Reviewed-by: default avatarMing Lei <ming.lei@redhat.com>
Reviewed-by: default avatarDamien Le Moal <dlemoal@kernel.org>
Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: default avatarNilay Shroff <nilay@linux.ibm.com>
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Link: https://lore.kernel.org/r/20250110054726.1499538-3-hch@lst.de


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 9c96821b
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -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;
+24 −0
Original line number Diff line number Diff line
@@ -444,6 +444,30 @@ int queue_limits_commit_update(struct request_queue *q,
}
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
+1 −6
Original line number Diff line number Diff line
@@ -1444,7 +1444,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;
@@ -1495,11 +1494,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,
+1 −3
Original line number Diff line number Diff line
@@ -1105,9 +1105,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;
+5 −12
Original line number Diff line number Diff line
@@ -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;

Loading