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);
|
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)
|
long nr_blockdev_pages(void)
|
||||||
{
|
{
|
||||||
struct inode *inode;
|
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);
|
struct block_device *bdev_alloc(struct gendisk *disk, u8 partno);
|
||||||
void bdev_add(struct block_device *bdev, dev_t dev);
|
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);
|
int blk_alloc_ext_minor(void);
|
||||||
void blk_free_ext_minor(unsigned int minor);
|
void blk_free_ext_minor(unsigned int minor);
|
||||||
|
@ -656,7 +656,7 @@ void del_gendisk(struct gendisk *disk)
|
|||||||
*/
|
*/
|
||||||
mutex_lock(&disk->open_mutex);
|
mutex_lock(&disk->open_mutex);
|
||||||
xa_for_each(&disk->part_tbl, idx, part)
|
xa_for_each(&disk->part_tbl, idx, part)
|
||||||
remove_inode_hash(part->bd_inode);
|
bdev_unhash(part);
|
||||||
mutex_unlock(&disk->open_mutex);
|
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)
|
if (test_bit(GD_ADDED, &disk->state) && disk->fops->free_disk)
|
||||||
disk->fops->free_disk(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)
|
static int block_uevent(const struct device *dev, struct kobj_uevent_env *env)
|
||||||
@ -1381,7 +1381,7 @@ out_erase_part0:
|
|||||||
out_destroy_part_tbl:
|
out_destroy_part_tbl:
|
||||||
xa_destroy(&disk->part_tbl);
|
xa_destroy(&disk->part_tbl);
|
||||||
disk->part0->bd_disk = NULL;
|
disk->part0->bd_disk = NULL;
|
||||||
iput(disk->part0->bd_inode);
|
bdev_drop(disk->part0);
|
||||||
out_free_bdi:
|
out_free_bdi:
|
||||||
bdi_put(disk->bdi);
|
bdi_put(disk->bdi);
|
||||||
out_free_bioset:
|
out_free_bioset:
|
||||||
|
@ -243,7 +243,7 @@ static const struct attribute_group *part_attr_groups[] = {
|
|||||||
static void part_release(struct device *dev)
|
static void part_release(struct device *dev)
|
||||||
{
|
{
|
||||||
put_disk(dev_to_bdev(dev)->bd_disk);
|
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)
|
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.
|
* Just delete the partition and invalidate it.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
remove_inode_hash(part->bd_inode);
|
bdev_unhash(part);
|
||||||
invalidate_bdev(part);
|
invalidate_bdev(part);
|
||||||
drop_partition(part);
|
drop_partition(part);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -655,7 +655,7 @@ rescan:
|
|||||||
* it cannot be looked up any more even when openers
|
* it cannot be looked up any more even when openers
|
||||||
* still hold references.
|
* still hold references.
|
||||||
*/
|
*/
|
||||||
remove_inode_hash(part->bd_inode);
|
bdev_unhash(part);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If @disk->open_partitions isn't elevated but there's
|
* If @disk->open_partitions isn't elevated but there's
|
||||||
|
Loading…
Reference in New Issue
Block a user