block: look up holders by bdev
authorChristoph Hellwig <hch@lst.de>
Wed, 4 Aug 2021 09:41:42 +0000 (11:41 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 9 Aug 2021 17:50:42 +0000 (11:50 -0600)
Invert they way the holder relations are tracked.  This very
slightly reduces the memory overhead for partitioned devices.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20210804094147.459763-4-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/genhd.c
block/holder.c
fs/block_dev.c
include/linux/blk_types.h
include/linux/genhd.h

index a4817e4..cd4eab7 100644 (file)
@@ -1289,7 +1289,9 @@ struct gendisk *__alloc_disk_node(int minors, int node_id)
        disk_to_dev(disk)->type = &disk_type;
        device_initialize(disk_to_dev(disk));
        inc_diskseq(disk);
-
+#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
+       INIT_LIST_HEAD(&disk->slave_bdevs);
+#endif
        return disk;
 
 out_destroy_part_tbl:
index 960654a..11e65d9 100644 (file)
@@ -3,7 +3,7 @@
 
 struct bd_holder_disk {
        struct list_head        list;
-       struct gendisk          *disk;
+       struct block_device     *bdev;
        int                     refcnt;
 };
 
@@ -12,8 +12,8 @@ static struct bd_holder_disk *bd_find_holder_disk(struct block_device *bdev,
 {
        struct bd_holder_disk *holder;
 
-       list_for_each_entry(holder, &bdev->bd_holder_disks, list)
-               if (holder->disk == disk)
+       list_for_each_entry(holder, &disk->slave_bdevs, list)
+               if (holder->bdev == bdev)
                        return holder;
        return NULL;
 }
@@ -61,7 +61,7 @@ int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk)
        struct bd_holder_disk *holder;
        int ret = 0;
 
-       mutex_lock(&bdev->bd_disk->open_mutex);
+       mutex_lock(&disk->open_mutex);
 
        WARN_ON_ONCE(!bdev->bd_holder);
 
@@ -82,7 +82,7 @@ int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk)
        }
 
        INIT_LIST_HEAD(&holder->list);
-       holder->disk = disk;
+       holder->bdev = bdev;
        holder->refcnt = 1;
 
        ret = add_symlink(disk->slave_dir, bdev_kobj(bdev));
@@ -93,7 +93,7 @@ int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk)
        if (ret)
                goto out_del;
 
-       list_add(&holder->list, &bdev->bd_holder_disks);
+       list_add(&holder->list, &disk->slave_bdevs);
        goto out_unlock;
 
 out_del:
@@ -101,7 +101,7 @@ out_del:
 out_free:
        kfree(holder);
 out_unlock:
-       mutex_unlock(&bdev->bd_disk->open_mutex);
+       mutex_unlock(&disk->open_mutex);
        return ret;
 }
 EXPORT_SYMBOL_GPL(bd_link_disk_holder);
@@ -120,7 +120,7 @@ void bd_unlink_disk_holder(struct block_device *bdev, struct gendisk *disk)
 {
        struct bd_holder_disk *holder;
 
-       mutex_lock(&bdev->bd_disk->open_mutex);
+       mutex_lock(&disk->open_mutex);
        holder = bd_find_holder_disk(bdev, disk);
        if (!WARN_ON_ONCE(holder == NULL) && !--holder->refcnt) {
                del_symlink(disk->slave_dir, bdev_kobj(bdev));
@@ -128,6 +128,6 @@ void bd_unlink_disk_holder(struct block_device *bdev, struct gendisk *disk)
                list_del_init(&holder->list);
                kfree(holder);
        }
-       mutex_unlock(&bdev->bd_disk->open_mutex);
+       mutex_unlock(&disk->open_mutex);
 }
 EXPORT_SYMBOL_GPL(bd_unlink_disk_holder);
index ae9651c..cc80176 100644 (file)
@@ -902,9 +902,6 @@ struct block_device *bdev_alloc(struct gendisk *disk, u8 partno)
        bdev->bd_disk = disk;
        bdev->bd_partno = partno;
        bdev->bd_inode = inode;
-#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
-       INIT_LIST_HEAD(&bdev->bd_holder_disks);
-#endif
        bdev->bd_stats = alloc_percpu(struct disk_stats);
        if (!bdev->bd_stats) {
                iput(inode);
index 7a4e139..e927356 100644 (file)
@@ -34,9 +34,6 @@ struct block_device {
        void *                  bd_holder;
        int                     bd_holders;
        bool                    bd_write_holder;
-#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
-       struct list_head        bd_holder_disks;
-#endif
        struct kobject          *bd_holder_dir;
        u8                      bd_partno;
        spinlock_t              bd_size_lock; /* for bd_inode->i_size updates */
index e21a91c..0721807 100644 (file)
@@ -159,7 +159,9 @@ struct gendisk {
        unsigned open_partitions;       /* number of open partitions */
 
        struct kobject *slave_dir;
-
+#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
+       struct list_head slave_bdevs;
+#endif
        struct timer_rand_state *random;
        atomic_t sync_io;               /* RAID */
        struct disk_events *ev;