mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-22 07:53:11 -05:00
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: 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>
This commit is contained in:
parent
9c96821b44
commit
aa427d7b73
7 changed files with 35 additions and 28 deletions
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -952,6 +952,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);
|
||||
|
|
Loading…
Reference in a new issue