mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-29 09:12:07 +00:00
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: Christoph Hellwig <hch@lst.de> Signed-off-by: Yu Kuai <yukuai3@huawei.com> Link: https://lore.kernel.org/r/20221115141054.1051801-8-yukuai1@huaweicloud.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
1a581b7216
commit
7abc077788
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user