missing helpers: bdev_unhash(), bdev_drop()
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 28 Apr 2024 23:01:39 +0000 (19:01 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 3 May 2024 06:36:21 +0000 (02:36 -0400)
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>
block/bdev.c
block/blk.h
block/genhd.c
block/partitions/core.c

index 536233ac3e99e9ae31f906e0304f48c0450bcaf5..28e6f0423857dc580f25432613cf49c503d08cb1 100644 (file)
@@ -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;
index d9f584984bc44b8280436a6ddfa044d909c626ad..e3347e1030d523a2796ca52af744091ce489df1d 100644 (file)
@@ -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);
index bb29a68e1d67662533653d8e74742554ae09b39a..93f5118b7d41622f90f4dd2a204966ba1908c27f 100644 (file)
@@ -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 @@ out_erase_part0:
 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:
index b11e88c82c8cfa9e179b05a6633f0b1294d818da..2b75e325c63b1cec620b37e7f401755892402b9b 100644 (file)
@@ -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 @@ rescan:
                 * 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