Commit 0dbcfe24 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

block: look up holders by bdev



Invert they way the holder relations are tracked.  This very
slightly reduces the memory overhead for partitioned devices.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20210804094147.459763-4-hch@lst.de


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent fbd9a395
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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:
+9 −9
Original line number Diff line number Diff line
@@ -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 @@ int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk)
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);
+0 −3
Original line number Diff line number Diff line
@@ -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);
+0 −3
Original line number Diff line number Diff line
@@ -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 */
+3 −1
Original line number Diff line number Diff line
@@ -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;