Skip to content

Commit df65f16

Browse files
author
Al Viro
committed
block/bdev.c: use the knowledge of inode/bdev coallocation
Here we know that bdevfs inodes are coallocated with struct block_device and we can get to ->bd_inode value without any dereferencing. Introduce an inlined helper (static, *not* exported, purely internal for bdev.c) that gets an associated inode by block_device - BD_INODE(bdev). NOTE: leave it static; nobody outside of block/bdev.c has any business playing with that. Signed-off-by: Al Viro <[email protected]>
1 parent 2d0026a commit df65f16

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

block/bdev.c

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ static inline struct bdev_inode *BDEV_I(struct inode *inode)
4343
return container_of(inode, struct bdev_inode, vfs_inode);
4444
}
4545

46+
static inline struct inode *BD_INODE(struct block_device *bdev)
47+
{
48+
return &container_of(bdev, struct bdev_inode, bdev)->vfs_inode;
49+
}
50+
4651
struct block_device *I_BDEV(struct inode *inode)
4752
{
4853
return &BDEV_I(inode)->bdev;
@@ -57,7 +62,7 @@ EXPORT_SYMBOL(file_bdev);
5762

5863
static void bdev_write_inode(struct block_device *bdev)
5964
{
60-
struct inode *inode = bdev->bd_inode;
65+
struct inode *inode = BD_INODE(bdev);
6166
int ret;
6267

6368
spin_lock(&inode->i_lock);
@@ -134,14 +139,14 @@ int truncate_bdev_range(struct block_device *bdev, blk_mode_t mode,
134139
static void set_init_blocksize(struct block_device *bdev)
135140
{
136141
unsigned int bsize = bdev_logical_block_size(bdev);
137-
loff_t size = i_size_read(bdev->bd_inode);
142+
loff_t size = i_size_read(BD_INODE(bdev));
138143

139144
while (bsize < PAGE_SIZE) {
140145
if (size & bsize)
141146
break;
142147
bsize <<= 1;
143148
}
144-
bdev->bd_inode->i_blkbits = blksize_bits(bsize);
149+
BD_INODE(bdev)->i_blkbits = blksize_bits(bsize);
145150
}
146151

147152
int set_blocksize(struct file *file, int size)
@@ -437,29 +442,30 @@ struct block_device *bdev_alloc(struct gendisk *disk, u8 partno)
437442
void bdev_set_nr_sectors(struct block_device *bdev, sector_t sectors)
438443
{
439444
spin_lock(&bdev->bd_size_lock);
440-
i_size_write(bdev->bd_inode, (loff_t)sectors << SECTOR_SHIFT);
445+
i_size_write(BD_INODE(bdev), (loff_t)sectors << SECTOR_SHIFT);
441446
bdev->bd_nr_sectors = sectors;
442447
spin_unlock(&bdev->bd_size_lock);
443448
}
444449

445450
void bdev_add(struct block_device *bdev, dev_t dev)
446451
{
452+
struct inode *inode = BD_INODE(bdev);
447453
if (bdev_stable_writes(bdev))
448454
mapping_set_stable_writes(bdev->bd_mapping);
449455
bdev->bd_dev = dev;
450-
bdev->bd_inode->i_rdev = dev;
451-
bdev->bd_inode->i_ino = dev;
452-
insert_inode_hash(bdev->bd_inode);
456+
inode->i_rdev = dev;
457+
inode->i_ino = dev;
458+
insert_inode_hash(inode);
453459
}
454460

455461
void bdev_unhash(struct block_device *bdev)
456462
{
457-
remove_inode_hash(bdev->bd_inode);
463+
remove_inode_hash(BD_INODE(bdev));
458464
}
459465

460466
void bdev_drop(struct block_device *bdev)
461467
{
462-
iput(bdev->bd_inode);
468+
iput(BD_INODE(bdev));
463469
}
464470

465471
long nr_blockdev_pages(void)
@@ -987,13 +993,13 @@ struct file *bdev_file_open_by_dev(dev_t dev, blk_mode_t mode, void *holder,
987993
return ERR_PTR(-ENXIO);
988994

989995
flags = blk_to_file_flags(mode);
990-
bdev_file = alloc_file_pseudo_noaccount(bdev->bd_inode,
996+
bdev_file = alloc_file_pseudo_noaccount(BD_INODE(bdev),
991997
blockdev_mnt, "", flags | O_LARGEFILE, &def_blk_fops);
992998
if (IS_ERR(bdev_file)) {
993999
blkdev_put_no_open(bdev);
9941000
return bdev_file;
9951001
}
996-
ihold(bdev->bd_inode);
1002+
ihold(BD_INODE(bdev));
9971003

9981004
ret = bdev_open(bdev, mode, holder, hops, bdev_file);
9991005
if (ret) {
@@ -1270,13 +1276,13 @@ void bdev_statx_dioalign(struct inode *inode, struct kstat *stat)
12701276

12711277
bool disk_live(struct gendisk *disk)
12721278
{
1273-
return !inode_unhashed(disk->part0->bd_inode);
1279+
return !inode_unhashed(BD_INODE(disk->part0));
12741280
}
12751281
EXPORT_SYMBOL_GPL(disk_live);
12761282

12771283
unsigned int block_size(struct block_device *bdev)
12781284
{
1279-
return 1 << bdev->bd_inode->i_blkbits;
1285+
return 1 << BD_INODE(bdev)->i_blkbits;
12801286
}
12811287
EXPORT_SYMBOL_GPL(block_size);
12821288

0 commit comments

Comments
 (0)