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

block: remove delayed holder registration



Now that dm has been fixed to track of holder registrations before
add_disk, the somewhat buggy block layer code can be safely removed.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
Link: https://lore.kernel.org/r/20221115141054.1051801-8-yukuai1@huaweicloud.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 1a581b72
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -478,10 +478,6 @@ int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
		goto out_put_holder_dir;
	}

	ret = bd_register_pending_holders(disk);
	if (ret < 0)
		goto out_put_slave_dir;

	ret = blk_register_queue(disk);
	if (ret)
		goto out_put_slave_dir;
+21 −51
Original line number Diff line number Diff line
@@ -29,19 +29,6 @@ static void del_symlink(struct kobject *from, struct kobject *to)
	sysfs_remove_link(from, kobject_name(to));
}

static int __link_disk_holder(struct block_device *bdev, struct gendisk *disk)
{
	int ret;

	ret = add_symlink(disk->slave_dir, bdev_kobj(bdev));
	if (ret)
		return ret;
	ret = add_symlink(bdev->bd_holder_dir, &disk_to_dev(disk)->kobj);
	if (ret)
		del_symlink(disk->slave_dir, bdev_kobj(bdev));
	return ret;
}

/**
 * bd_link_disk_holder - create symlinks between holding disk and slave bdev
 * @bdev: the claimed slave bdev
@@ -75,6 +62,9 @@ int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk)
	struct bd_holder_disk *holder;
	int ret = 0;

	if (WARN_ON_ONCE(!disk->slave_dir))
		return -EINVAL;

	mutex_lock(&disk->open_mutex);

	WARN_ON_ONCE(!bdev->bd_holder);
@@ -94,34 +84,32 @@ int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk)
	INIT_LIST_HEAD(&holder->list);
	holder->bdev = bdev;
	holder->refcnt = 1;
	if (disk->slave_dir) {
		ret = __link_disk_holder(bdev, disk);
		if (ret) {
			kfree(holder);
			goto out_unlock;
		}
	}

	ret = add_symlink(disk->slave_dir, bdev_kobj(bdev));
	if (ret)
		goto out_free_holder;
	ret = add_symlink(bdev->bd_holder_dir, &disk_to_dev(disk)->kobj);
	if (ret)
		goto out_del_symlink;
	list_add(&holder->list, &disk->slave_bdevs);

	/*
	 * del_gendisk drops the initial reference to bd_holder_dir, so we need
	 * to keep our own here to allow for cleanup past that point.
	 */
	kobject_get(bdev->bd_holder_dir);
	mutex_unlock(&disk->open_mutex);
	return 0;

out_del_symlink:
	del_symlink(disk->slave_dir, bdev_kobj(bdev));
out_free_holder:
	kfree(holder);
out_unlock:
	mutex_unlock(&disk->open_mutex);
	return ret;
}
EXPORT_SYMBOL_GPL(bd_link_disk_holder);

static void __unlink_disk_holder(struct block_device *bdev,
		struct gendisk *disk)
{
	del_symlink(disk->slave_dir, bdev_kobj(bdev));
	del_symlink(bdev->bd_holder_dir, &disk_to_dev(disk)->kobj);
}

/**
 * bd_unlink_disk_holder - destroy symlinks created by bd_link_disk_holder()
 * @bdev: the calimed slave bdev
@@ -136,11 +124,14 @@ void bd_unlink_disk_holder(struct block_device *bdev, struct gendisk *disk)
{
	struct bd_holder_disk *holder;

	if (WARN_ON_ONCE(!disk->slave_dir))
		return;

	mutex_lock(&disk->open_mutex);
	holder = bd_find_holder_disk(bdev, disk);
	if (!WARN_ON_ONCE(holder == NULL) && !--holder->refcnt) {
		if (disk->slave_dir)
			__unlink_disk_holder(bdev, disk);
		del_symlink(disk->slave_dir, bdev_kobj(bdev));
		del_symlink(bdev->bd_holder_dir, &disk_to_dev(disk)->kobj);
		kobject_put(bdev->bd_holder_dir);
		list_del_init(&holder->list);
		kfree(holder);
@@ -148,24 +139,3 @@ void bd_unlink_disk_holder(struct block_device *bdev, struct gendisk *disk)
	mutex_unlock(&disk->open_mutex);
}
EXPORT_SYMBOL_GPL(bd_unlink_disk_holder);

int bd_register_pending_holders(struct gendisk *disk)
{
	struct bd_holder_disk *holder;
	int ret;

	mutex_lock(&disk->open_mutex);
	list_for_each_entry(holder, &disk->slave_bdevs, list) {
		ret = __link_disk_holder(holder->bdev, disk);
		if (ret)
			goto out_undo;
	}
	mutex_unlock(&disk->open_mutex);
	return 0;

out_undo:
	list_for_each_entry_continue_reverse(holder, &disk->slave_bdevs, list)
		__unlink_disk_holder(holder->bdev, disk);
	mutex_unlock(&disk->open_mutex);
	return ret;
}
+0 −5
Original line number Diff line number Diff line
@@ -833,7 +833,6 @@ void set_capacity(struct gendisk *disk, sector_t size);
#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk);
void bd_unlink_disk_holder(struct block_device *bdev, struct gendisk *disk);
int bd_register_pending_holders(struct gendisk *disk);
#else
static inline int bd_link_disk_holder(struct block_device *bdev,
				      struct gendisk *disk)
@@ -844,10 +843,6 @@ static inline void bd_unlink_disk_holder(struct block_device *bdev,
					 struct gendisk *disk)
{
}
static inline int bd_register_pending_holders(struct gendisk *disk)
{
	return 0;
}
#endif /* CONFIG_BLOCK_HOLDER_DEPRECATED */

dev_t part_devt(struct gendisk *disk, u8 partno);