mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-29 09:13:38 +00:00
missing helpers: bdev_unhash(), bdev_drop()
bdev_unhash(): make block device invisible to lookups by device number bdev_drop(): drop reference to associated inode. Both are internal, for use by genhd and partition-related code - similar to bdev_add(). The logics in there (especially the lifetime-related parts of it) ought to be cleaned up, but that's a separate story; here we just encapsulate getting to associated inode. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
186ddac207
commit
2638c20876
10
block/bdev.c
10
block/bdev.c
@ -451,6 +451,16 @@ void bdev_add(struct block_device *bdev, dev_t dev)
|
||||
insert_inode_hash(bdev->bd_inode);
|
||||
}
|
||||
|
||||
void bdev_unhash(struct block_device *bdev)
|
||||
{
|
||||
remove_inode_hash(bdev->bd_inode);
|
||||
}
|
||||
|
||||
void bdev_drop(struct block_device *bdev)
|
||||
{
|
||||
iput(bdev->bd_inode);
|
||||
}
|
||||
|
||||
long nr_blockdev_pages(void)
|
||||
{
|
||||
struct inode *inode;
|
||||
|
@ -428,6 +428,8 @@ static inline int blkdev_zone_mgmt_ioctl(struct block_device *bdev,
|
||||
|
||||
struct block_device *bdev_alloc(struct gendisk *disk, u8 partno);
|
||||
void bdev_add(struct block_device *bdev, dev_t dev);
|
||||
void bdev_unhash(struct block_device *bdev);
|
||||
void bdev_drop(struct block_device *bdev);
|
||||
|
||||
int blk_alloc_ext_minor(void);
|
||||
void blk_free_ext_minor(unsigned int minor);
|
||||
|
@ -656,7 +656,7 @@ void del_gendisk(struct gendisk *disk)
|
||||
*/
|
||||
mutex_lock(&disk->open_mutex);
|
||||
xa_for_each(&disk->part_tbl, idx, part)
|
||||
remove_inode_hash(part->bd_inode);
|
||||
bdev_unhash(part);
|
||||
mutex_unlock(&disk->open_mutex);
|
||||
|
||||
/*
|
||||
@ -1191,7 +1191,7 @@ static void disk_release(struct device *dev)
|
||||
if (test_bit(GD_ADDED, &disk->state) && disk->fops->free_disk)
|
||||
disk->fops->free_disk(disk);
|
||||
|
||||
iput(disk->part0->bd_inode); /* frees the disk */
|
||||
bdev_drop(disk->part0); /* frees the disk */
|
||||
}
|
||||
|
||||
static int block_uevent(const struct device *dev, struct kobj_uevent_env *env)
|
||||
@ -1381,7 +1381,7 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
|
||||
out_destroy_part_tbl:
|
||||
xa_destroy(&disk->part_tbl);
|
||||
disk->part0->bd_disk = NULL;
|
||||
iput(disk->part0->bd_inode);
|
||||
bdev_drop(disk->part0);
|
||||
out_free_bdi:
|
||||
bdi_put(disk->bdi);
|
||||
out_free_bioset:
|
||||
|
@ -243,7 +243,7 @@ static const struct attribute_group *part_attr_groups[] = {
|
||||
static void part_release(struct device *dev)
|
||||
{
|
||||
put_disk(dev_to_bdev(dev)->bd_disk);
|
||||
iput(dev_to_bdev(dev)->bd_inode);
|
||||
bdev_drop(dev_to_bdev(dev));
|
||||
}
|
||||
|
||||
static int part_uevent(const struct device *dev, struct kobj_uevent_env *env)
|
||||
@ -469,7 +469,7 @@ int bdev_del_partition(struct gendisk *disk, int partno)
|
||||
* Just delete the partition and invalidate it.
|
||||
*/
|
||||
|
||||
remove_inode_hash(part->bd_inode);
|
||||
bdev_unhash(part);
|
||||
invalidate_bdev(part);
|
||||
drop_partition(part);
|
||||
ret = 0;
|
||||
@ -655,7 +655,7 @@ int bdev_disk_changed(struct gendisk *disk, bool invalidate)
|
||||
* it cannot be looked up any more even when openers
|
||||
* still hold references.
|
||||
*/
|
||||
remove_inode_hash(part->bd_inode);
|
||||
bdev_unhash(part);
|
||||
|
||||
/*
|
||||
* If @disk->open_partitions isn't elevated but there's
|
||||
|
Loading…
Reference in New Issue
Block a user