Skip to content

Commit

Permalink
block: look up holders by bdev
Browse files Browse the repository at this point in the history
Invert they way the holder relations are tracked.  This very
slightly reduces the memory overhead for partitioned devices.

Signed-off-by: Christoph Hellwig <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
Christoph Hellwig authored and axboe committed Aug 9, 2021
1 parent fbd9a39 commit 0dbcfe2
Show file tree
Hide file tree
Showing 5 changed files with 15 additions and 17 deletions.
4 changes: 3 additions & 1 deletion block/genhd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
18 changes: 9 additions & 9 deletions block/holder.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

struct bd_holder_disk {
struct list_head list;
struct gendisk *disk;
struct block_device *bdev;
int refcnt;
};

Expand All @@ -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;
}
Expand Down Expand Up @@ -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);

Expand All @@ -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));
Expand All @@ -93,15 +93,15 @@ 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:
del_symlink(disk->slave_dir, bdev_kobj(bdev));
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);
Expand All @@ -120,14 +120,14 @@ 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));
del_symlink(bdev->bd_holder_dir, &disk_to_dev(disk)->kobj);
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);
3 changes: 0 additions & 3 deletions fs/block_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
3 changes: 0 additions & 3 deletions include/linux/blk_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
4 changes: 3 additions & 1 deletion include/linux/genhd.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 0dbcfe2

Please sign in to comment.