mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
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: 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>
This commit is contained in:
committed by
Jens Axboe
parent
fbd9a39542
commit
0dbcfe247f
@@ -1289,7 +1289,9 @@ struct gendisk *__alloc_disk_node(int minors, int node_id)
|
|||||||
disk_to_dev(disk)->type = &disk_type;
|
disk_to_dev(disk)->type = &disk_type;
|
||||||
device_initialize(disk_to_dev(disk));
|
device_initialize(disk_to_dev(disk));
|
||||||
inc_diskseq(disk);
|
inc_diskseq(disk);
|
||||||
|
#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
|
||||||
|
INIT_LIST_HEAD(&disk->slave_bdevs);
|
||||||
|
#endif
|
||||||
return disk;
|
return disk;
|
||||||
|
|
||||||
out_destroy_part_tbl:
|
out_destroy_part_tbl:
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
struct bd_holder_disk {
|
struct bd_holder_disk {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
struct gendisk *disk;
|
struct block_device *bdev;
|
||||||
int refcnt;
|
int refcnt;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -12,8 +12,8 @@ static struct bd_holder_disk *bd_find_holder_disk(struct block_device *bdev,
|
|||||||
{
|
{
|
||||||
struct bd_holder_disk *holder;
|
struct bd_holder_disk *holder;
|
||||||
|
|
||||||
list_for_each_entry(holder, &bdev->bd_holder_disks, list)
|
list_for_each_entry(holder, &disk->slave_bdevs, list)
|
||||||
if (holder->disk == disk)
|
if (holder->bdev == bdev)
|
||||||
return holder;
|
return holder;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -61,7 +61,7 @@ int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk)
|
|||||||
struct bd_holder_disk *holder;
|
struct bd_holder_disk *holder;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
mutex_lock(&bdev->bd_disk->open_mutex);
|
mutex_lock(&disk->open_mutex);
|
||||||
|
|
||||||
WARN_ON_ONCE(!bdev->bd_holder);
|
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);
|
INIT_LIST_HEAD(&holder->list);
|
||||||
holder->disk = disk;
|
holder->bdev = bdev;
|
||||||
holder->refcnt = 1;
|
holder->refcnt = 1;
|
||||||
|
|
||||||
ret = add_symlink(disk->slave_dir, bdev_kobj(bdev));
|
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)
|
if (ret)
|
||||||
goto out_del;
|
goto out_del;
|
||||||
|
|
||||||
list_add(&holder->list, &bdev->bd_holder_disks);
|
list_add(&holder->list, &disk->slave_bdevs);
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
out_del:
|
out_del:
|
||||||
@@ -101,7 +101,7 @@ out_del:
|
|||||||
out_free:
|
out_free:
|
||||||
kfree(holder);
|
kfree(holder);
|
||||||
out_unlock:
|
out_unlock:
|
||||||
mutex_unlock(&bdev->bd_disk->open_mutex);
|
mutex_unlock(&disk->open_mutex);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(bd_link_disk_holder);
|
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;
|
struct bd_holder_disk *holder;
|
||||||
|
|
||||||
mutex_lock(&bdev->bd_disk->open_mutex);
|
mutex_lock(&disk->open_mutex);
|
||||||
holder = bd_find_holder_disk(bdev, disk);
|
holder = bd_find_holder_disk(bdev, disk);
|
||||||
if (!WARN_ON_ONCE(holder == NULL) && !--holder->refcnt) {
|
if (!WARN_ON_ONCE(holder == NULL) && !--holder->refcnt) {
|
||||||
del_symlink(disk->slave_dir, bdev_kobj(bdev));
|
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);
|
list_del_init(&holder->list);
|
||||||
kfree(holder);
|
kfree(holder);
|
||||||
}
|
}
|
||||||
mutex_unlock(&bdev->bd_disk->open_mutex);
|
mutex_unlock(&disk->open_mutex);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(bd_unlink_disk_holder);
|
EXPORT_SYMBOL_GPL(bd_unlink_disk_holder);
|
||||||
|
@@ -902,9 +902,6 @@ struct block_device *bdev_alloc(struct gendisk *disk, u8 partno)
|
|||||||
bdev->bd_disk = disk;
|
bdev->bd_disk = disk;
|
||||||
bdev->bd_partno = partno;
|
bdev->bd_partno = partno;
|
||||||
bdev->bd_inode = inode;
|
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);
|
bdev->bd_stats = alloc_percpu(struct disk_stats);
|
||||||
if (!bdev->bd_stats) {
|
if (!bdev->bd_stats) {
|
||||||
iput(inode);
|
iput(inode);
|
||||||
|
@@ -34,9 +34,6 @@ struct block_device {
|
|||||||
void * bd_holder;
|
void * bd_holder;
|
||||||
int bd_holders;
|
int bd_holders;
|
||||||
bool bd_write_holder;
|
bool bd_write_holder;
|
||||||
#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
|
|
||||||
struct list_head bd_holder_disks;
|
|
||||||
#endif
|
|
||||||
struct kobject *bd_holder_dir;
|
struct kobject *bd_holder_dir;
|
||||||
u8 bd_partno;
|
u8 bd_partno;
|
||||||
spinlock_t bd_size_lock; /* for bd_inode->i_size updates */
|
spinlock_t bd_size_lock; /* for bd_inode->i_size updates */
|
||||||
|
@@ -159,7 +159,9 @@ struct gendisk {
|
|||||||
unsigned open_partitions; /* number of open partitions */
|
unsigned open_partitions; /* number of open partitions */
|
||||||
|
|
||||||
struct kobject *slave_dir;
|
struct kobject *slave_dir;
|
||||||
|
#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
|
||||||
|
struct list_head slave_bdevs;
|
||||||
|
#endif
|
||||||
struct timer_rand_state *random;
|
struct timer_rand_state *random;
|
||||||
atomic_t sync_io; /* RAID */
|
atomic_t sync_io; /* RAID */
|
||||||
struct disk_events *ev;
|
struct disk_events *ev;
|
||||||
|
Reference in New Issue
Block a user