OSDN Git Service

block: fold bdev_unhash_inode into invalidate_partition
authorChristoph Hellwig <hch@lst.de>
Tue, 14 Apr 2020 07:29:02 +0000 (09:29 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 20 Apr 2020 17:33:00 +0000 (11:33 -0600)
invalidate_partition and bdev_unhash_inode are always paired, and
invalidate_partition already does an icache lookup for the block device
inode.  Piggy back on that to remove the inode from the hash.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/genhd.c
fs/block_dev.c
include/linux/fs.h

index 980a460..c05d509 100644 (file)
@@ -888,6 +888,12 @@ static void invalidate_partition(struct gendisk *disk, int partno)
 
        fsync_bdev(bdev);
        __invalidate_device(bdev, true);
+
+       /*
+        * Unhash the bdev inode for this device so that it gets evicted as soon
+        * as last inode reference is dropped.
+        */
+       remove_inode_hash(bdev->bd_inode);
        bdput(bdev);
 }
 
@@ -909,13 +915,11 @@ void del_gendisk(struct gendisk *disk)
                             DISK_PITER_INCL_EMPTY | DISK_PITER_REVERSE);
        while ((part = disk_part_iter_next(&piter))) {
                invalidate_partition(disk, part->partno);
-               bdev_unhash_inode(part_devt(part));
                delete_partition(disk, part);
        }
        disk_part_iter_exit(&piter);
 
        invalidate_partition(disk, 0);
-       bdev_unhash_inode(disk_devt(disk));
        set_capacity(disk, 0);
        disk->flags &= ~GENHD_FL_UP;
        up_write(&disk->lookup_sem);
index 9c8de54..9988201 100644 (file)
@@ -883,21 +883,6 @@ static int bdev_set(struct inode *inode, void *data)
 
 static LIST_HEAD(all_bdevs);
 
-/*
- * If there is a bdev inode for this device, unhash it so that it gets evicted
- * as soon as last inode reference is dropped.
- */
-void bdev_unhash_inode(dev_t dev)
-{
-       struct inode *inode;
-
-       inode = ilookup5(blockdev_superblock, hash(dev), bdev_test, &dev);
-       if (inode) {
-               remove_inode_hash(inode);
-               iput(inode);
-       }
-}
-
 struct block_device *bdget(dev_t dev)
 {
        struct block_device *bdev;
index 2b4e9f8..1a95e51 100644 (file)
@@ -2581,7 +2581,6 @@ extern struct kmem_cache *names_cachep;
 #ifdef CONFIG_BLOCK
 extern int register_blkdev(unsigned int, const char *);
 extern void unregister_blkdev(unsigned int, const char *);
-extern void bdev_unhash_inode(dev_t dev);
 extern struct block_device *bdget(dev_t);
 extern struct block_device *bdgrab(struct block_device *bdev);
 extern void bd_set_size(struct block_device *, loff_t size);