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

block: use queue_limits_commit_update in queue_discard_max_store



Convert queue_discard_max_store to use queue_limits_commit_update to
check and update the max_discard_sectors limit and freeze the queue
before doing so to ensure we don't have requests in flight while
changing the limits.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarKeith Busch <kbusch@kernel.org>
Reviewed-by: default avatarChaitanya Kulkarni <kch@nvidia.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 avatarHannes Reinecke <hare@suse.de>
Link: https://lore.kernel.org/r/20240213073425.1621680-8-hch@lst.de


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 4f563a64
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -175,7 +175,9 @@ static ssize_t queue_discard_max_store(struct request_queue *q,
				       const char *page, size_t count)
{
	unsigned long max_discard_bytes;
	struct queue_limits lim;
	ssize_t ret;
	int err;

	ret = queue_var_store(&max_discard_bytes, page, count);
	if (ret < 0)
@@ -187,9 +189,14 @@ static ssize_t queue_discard_max_store(struct request_queue *q,
	if ((max_discard_bytes >> SECTOR_SHIFT) > UINT_MAX)
		return -EINVAL;

	q->limits.max_user_discard_sectors = max_discard_bytes >> SECTOR_SHIFT;
	q->limits.max_discard_sectors = min(q->limits.max_hw_discard_sectors,
					    q->limits.max_user_discard_sectors);
	blk_mq_freeze_queue(q);
	lim = queue_limits_start_update(q);
	lim.max_user_discard_sectors = max_discard_bytes >> SECTOR_SHIFT;
	err = queue_limits_commit_update(q, &lim);
	blk_mq_unfreeze_queue(q);

	if (err)
		return err;
	return ret;
}