Skip to content

Commit 0dbcfe2

Browse files
Christoph Hellwigaxboe
authored andcommitted
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 <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent fbd9a39 commit 0dbcfe2

File tree

5 files changed

+15
-17
lines changed

5 files changed

+15
-17
lines changed

block/genhd.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1289,7 +1289,9 @@ struct gendisk *__alloc_disk_node(int minors, int node_id)
12891289
disk_to_dev(disk)->type = &disk_type;
12901290
device_initialize(disk_to_dev(disk));
12911291
inc_diskseq(disk);
1292-
1292+
#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
1293+
INIT_LIST_HEAD(&disk->slave_bdevs);
1294+
#endif
12931295
return disk;
12941296

12951297
out_destroy_part_tbl:

block/holder.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
struct bd_holder_disk {
55
struct list_head list;
6-
struct gendisk *disk;
6+
struct block_device *bdev;
77
int refcnt;
88
};
99

@@ -12,8 +12,8 @@ static struct bd_holder_disk *bd_find_holder_disk(struct block_device *bdev,
1212
{
1313
struct bd_holder_disk *holder;
1414

15-
list_for_each_entry(holder, &bdev->bd_holder_disks, list)
16-
if (holder->disk == disk)
15+
list_for_each_entry(holder, &disk->slave_bdevs, list)
16+
if (holder->bdev == bdev)
1717
return holder;
1818
return NULL;
1919
}
@@ -61,7 +61,7 @@ int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk)
6161
struct bd_holder_disk *holder;
6262
int ret = 0;
6363

64-
mutex_lock(&bdev->bd_disk->open_mutex);
64+
mutex_lock(&disk->open_mutex);
6565

6666
WARN_ON_ONCE(!bdev->bd_holder);
6767

@@ -82,7 +82,7 @@ int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk)
8282
}
8383

8484
INIT_LIST_HEAD(&holder->list);
85-
holder->disk = disk;
85+
holder->bdev = bdev;
8686
holder->refcnt = 1;
8787

8888
ret = add_symlink(disk->slave_dir, bdev_kobj(bdev));
@@ -93,15 +93,15 @@ int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk)
9393
if (ret)
9494
goto out_del;
9595

96-
list_add(&holder->list, &bdev->bd_holder_disks);
96+
list_add(&holder->list, &disk->slave_bdevs);
9797
goto out_unlock;
9898

9999
out_del:
100100
del_symlink(disk->slave_dir, bdev_kobj(bdev));
101101
out_free:
102102
kfree(holder);
103103
out_unlock:
104-
mutex_unlock(&bdev->bd_disk->open_mutex);
104+
mutex_unlock(&disk->open_mutex);
105105
return ret;
106106
}
107107
EXPORT_SYMBOL_GPL(bd_link_disk_holder);
@@ -120,14 +120,14 @@ void bd_unlink_disk_holder(struct block_device *bdev, struct gendisk *disk)
120120
{
121121
struct bd_holder_disk *holder;
122122

123-
mutex_lock(&bdev->bd_disk->open_mutex);
123+
mutex_lock(&disk->open_mutex);
124124
holder = bd_find_holder_disk(bdev, disk);
125125
if (!WARN_ON_ONCE(holder == NULL) && !--holder->refcnt) {
126126
del_symlink(disk->slave_dir, bdev_kobj(bdev));
127127
del_symlink(bdev->bd_holder_dir, &disk_to_dev(disk)->kobj);
128128
list_del_init(&holder->list);
129129
kfree(holder);
130130
}
131-
mutex_unlock(&bdev->bd_disk->open_mutex);
131+
mutex_unlock(&disk->open_mutex);
132132
}
133133
EXPORT_SYMBOL_GPL(bd_unlink_disk_holder);

fs/block_dev.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -902,9 +902,6 @@ struct block_device *bdev_alloc(struct gendisk *disk, u8 partno)
902902
bdev->bd_disk = disk;
903903
bdev->bd_partno = partno;
904904
bdev->bd_inode = inode;
905-
#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
906-
INIT_LIST_HEAD(&bdev->bd_holder_disks);
907-
#endif
908905
bdev->bd_stats = alloc_percpu(struct disk_stats);
909906
if (!bdev->bd_stats) {
910907
iput(inode);

include/linux/blk_types.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@ struct block_device {
3434
void * bd_holder;
3535
int bd_holders;
3636
bool bd_write_holder;
37-
#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
38-
struct list_head bd_holder_disks;
39-
#endif
4037
struct kobject *bd_holder_dir;
4138
u8 bd_partno;
4239
spinlock_t bd_size_lock; /* for bd_inode->i_size updates */

include/linux/genhd.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,9 @@ struct gendisk {
159159
unsigned open_partitions; /* number of open partitions */
160160

161161
struct kobject *slave_dir;
162-
162+
#ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
163+
struct list_head slave_bdevs;
164+
#endif
163165
struct timer_rand_state *random;
164166
atomic_t sync_io; /* RAID */
165167
struct disk_events *ev;

0 commit comments

Comments
 (0)