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

block: simplify disk_set_independent_access_ranges



Lift setting disk->ia_ranges from disk_register_independent_access_ranges
into disk_set_independent_access_ranges, and make the behavior the same
for the registered vs non-registered queue cases.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
Tested-by: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
Link: https://lore.kernel.org/r/20220629062013.1331068-3-hch@lst.de


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 6a27d28c
Loading
Loading
Loading
Loading
+16 −41
Original line number Diff line number Diff line
@@ -102,31 +102,18 @@ static struct kobj_type blk_ia_ranges_ktype = {
 * disk_register_independent_access_ranges - register with sysfs a set of
 *		independent access ranges
 * @disk:	Target disk
 * @new_iars:	New set of independent access ranges
 *
 * Register with sysfs a set of independent access ranges for @disk.
 * If @new_iars is not NULL, this set of ranges is registered and the old set
 * specified by disk->ia_ranges is unregistered. Otherwise, disk->ia_ranges is
 * registered if it is not already.
 */
int disk_register_independent_access_ranges(struct gendisk *disk,
				struct blk_independent_access_ranges *new_iars)
int disk_register_independent_access_ranges(struct gendisk *disk)
{
	struct blk_independent_access_ranges *iars = disk->ia_ranges;
	struct request_queue *q = disk->queue;
	struct blk_independent_access_ranges *iars;
	int i, ret;

	lockdep_assert_held(&q->sysfs_dir_lock);
	lockdep_assert_held(&q->sysfs_lock);

	/* If a new range set is specified, unregister the old one */
	if (new_iars) {
		if (disk->ia_ranges)
			disk_unregister_independent_access_ranges(disk);
		disk->ia_ranges = new_iars;
	}

	iars = disk->ia_ranges;
	if (!iars)
		return 0;

@@ -210,6 +197,9 @@ static bool disk_check_ia_ranges(struct gendisk *disk,
	sector_t sector = 0;
	int i;

	if (WARN_ON_ONCE(!iars->nr_ia_ranges))
		return false;

	/*
	 * While sorting the ranges in increasing LBA order, check that the
	 * ranges do not overlap, that there are no sector holes and that all
@@ -298,43 +288,28 @@ void disk_set_independent_access_ranges(struct gendisk *disk,
{
	struct request_queue *q = disk->queue;

	if (WARN_ON_ONCE(iars && !iars->nr_ia_ranges)) {
		kfree(iars);
		iars = NULL;
	}

	mutex_lock(&q->sysfs_dir_lock);
	mutex_lock(&q->sysfs_lock);

	if (iars) {
		if (!disk_check_ia_ranges(disk, iars)) {
	if (iars && !disk_check_ia_ranges(disk, iars)) {
		kfree(iars);
		iars = NULL;
			goto reg;
	}

		if (!disk_ia_ranges_changed(disk, iars)) {
	if (iars && !disk_ia_ranges_changed(disk, iars)) {
		kfree(iars);
		goto unlock;
	}
	}

	/*
	 * This may be called for a registered queue. E.g. during a device
	 * revalidation. If that is the case, we need to unregister the old
	 * set of independent access ranges and register the new set. If the
	 * queue is not registered, registration of the device request queue
	 * will register the independent access ranges, so only swap in the
	 * new set and free the old one.
	 * will register the independent access ranges.
	 */
reg:
	if (blk_queue_registered(q)) {
		disk_register_independent_access_ranges(disk, iars);
	} else {
		swap(disk->ia_ranges, iars);
		kfree(iars);
	}

	disk_unregister_independent_access_ranges(disk);
	disk->ia_ranges = iars;
	if (blk_queue_registered(q))
		disk_register_independent_access_ranges(disk);
unlock:
	mutex_unlock(&q->sysfs_lock);
	mutex_unlock(&q->sysfs_dir_lock);
+1 −1
Original line number Diff line number Diff line
@@ -832,7 +832,7 @@ int blk_register_queue(struct gendisk *disk)
		blk_mq_debugfs_register(q);
	mutex_unlock(&q->debugfs_mutex);

	ret = disk_register_independent_access_ranges(disk, NULL);
	ret = disk_register_independent_access_ranges(disk);
	if (ret)
		goto put_dev;

+1 −2
Original line number Diff line number Diff line
@@ -459,8 +459,7 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg);

extern const struct address_space_operations def_blk_aops;

int disk_register_independent_access_ranges(struct gendisk *disk,
				struct blk_independent_access_ranges *new_iars);
int disk_register_independent_access_ranges(struct gendisk *disk);
void disk_unregister_independent_access_ranges(struct gendisk *disk);

#ifdef CONFIG_FAIL_MAKE_REQUEST