Skip to content

Commit 38da32e

Browse files
committed
Merge tag 'pull-bd_inode-1' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull bdev bd_inode updates from Al Viro: "Replacement of bdev->bd_inode with sane(r) set of primitives by me and Yu Kuai" * tag 'pull-bd_inode-1' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: RIP ->bd_inode dasd_format(): killing the last remaining user of ->bd_inode nilfs_attach_log_writer(): use ->bd_mapping->host instead of ->bd_inode block/bdev.c: use the knowledge of inode/bdev coallocation gfs2: more obvious initializations of mapping->host fs/buffer.c: massage the remaining users of ->bd_inode to ->bd_mapping blk_ioctl_{discard,zeroout}(): we only want ->bd_inode->i_mapping here... grow_dev_folio(): we only want ->bd_inode->i_mapping there use ->bd_mapping instead of ->bd_inode->i_mapping block_device: add a pointer to struct address_space (page cache of bdev) missing helpers: bdev_unhash(), bdev_drop() block: move two helpers into bdev.c block2mtd: prevent direct access of bd_inode dm-vdo: use bdev_nr_bytes(bdev) instead of i_size_read(bdev->bd_inode) blkdev_write_iter(): saner way to get inode and bdev bcachefs: remove dead function bdev_sectors() ext4: remove block_device_ejected() erofs_buf: store address_space instead of inode erofs: switch erofs_bread() to passing offset instead of block number
2 parents 5ad8b6a + 203c1ce commit 38da32e

File tree

37 files changed

+145
-157
lines changed

37 files changed

+145
-157
lines changed

block/bdev.c

Lines changed: 47 additions & 19 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);
@@ -76,7 +81,7 @@ static void bdev_write_inode(struct block_device *bdev)
7681
/* Kill _all_ buffers and pagecache , dirty or not.. */
7782
static void kill_bdev(struct block_device *bdev)
7883
{
79-
struct address_space *mapping = bdev->bd_inode->i_mapping;
84+
struct address_space *mapping = bdev->bd_mapping;
8085

8186
if (mapping_empty(mapping))
8287
return;
@@ -88,7 +93,7 @@ static void kill_bdev(struct block_device *bdev)
8893
/* Invalidate clean unused buffers and pagecache. */
8994
void invalidate_bdev(struct block_device *bdev)
9095
{
91-
struct address_space *mapping = bdev->bd_inode->i_mapping;
96+
struct address_space *mapping = bdev->bd_mapping;
9297

9398
if (mapping->nrpages) {
9499
invalidate_bh_lrus();
@@ -116,7 +121,7 @@ int truncate_bdev_range(struct block_device *bdev, blk_mode_t mode,
116121
goto invalidate;
117122
}
118123

119-
truncate_inode_pages_range(bdev->bd_inode->i_mapping, lstart, lend);
124+
truncate_inode_pages_range(bdev->bd_mapping, lstart, lend);
120125
if (!(mode & BLK_OPEN_EXCL))
121126
bd_abort_claiming(bdev, truncate_bdev_range);
122127
return 0;
@@ -126,22 +131,22 @@ int truncate_bdev_range(struct block_device *bdev, blk_mode_t mode,
126131
* Someone else has handle exclusively open. Try invalidating instead.
127132
* The 'end' argument is inclusive so the rounding is safe.
128133
*/
129-
return invalidate_inode_pages2_range(bdev->bd_inode->i_mapping,
134+
return invalidate_inode_pages2_range(bdev->bd_mapping,
130135
lstart >> PAGE_SHIFT,
131136
lend >> PAGE_SHIFT);
132137
}
133138

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)
@@ -198,7 +203,7 @@ int sync_blockdev_nowait(struct block_device *bdev)
198203
{
199204
if (!bdev)
200205
return 0;
201-
return filemap_flush(bdev->bd_inode->i_mapping);
206+
return filemap_flush(bdev->bd_mapping);
202207
}
203208
EXPORT_SYMBOL_GPL(sync_blockdev_nowait);
204209

@@ -210,13 +215,13 @@ int sync_blockdev(struct block_device *bdev)
210215
{
211216
if (!bdev)
212217
return 0;
213-
return filemap_write_and_wait(bdev->bd_inode->i_mapping);
218+
return filemap_write_and_wait(bdev->bd_mapping);
214219
}
215220
EXPORT_SYMBOL(sync_blockdev);
216221

217222
int sync_blockdev_range(struct block_device *bdev, loff_t lstart, loff_t lend)
218223
{
219-
return filemap_write_and_wait_range(bdev->bd_inode->i_mapping,
224+
return filemap_write_and_wait_range(bdev->bd_mapping,
220225
lstart, lend);
221226
}
222227
EXPORT_SYMBOL(sync_blockdev_range);
@@ -418,7 +423,7 @@ struct block_device *bdev_alloc(struct gendisk *disk, u8 partno)
418423
spin_lock_init(&bdev->bd_size_lock);
419424
mutex_init(&bdev->bd_holder_lock);
420425
bdev->bd_partno = partno;
421-
bdev->bd_inode = inode;
426+
bdev->bd_mapping = &inode->i_data;
422427
bdev->bd_queue = disk->queue;
423428
if (partno)
424429
bdev->bd_has_submit_bio = disk->part0->bd_has_submit_bio;
@@ -436,19 +441,30 @@ struct block_device *bdev_alloc(struct gendisk *disk, u8 partno)
436441
void bdev_set_nr_sectors(struct block_device *bdev, sector_t sectors)
437442
{
438443
spin_lock(&bdev->bd_size_lock);
439-
i_size_write(bdev->bd_inode, (loff_t)sectors << SECTOR_SHIFT);
444+
i_size_write(BD_INODE(bdev), (loff_t)sectors << SECTOR_SHIFT);
440445
bdev->bd_nr_sectors = sectors;
441446
spin_unlock(&bdev->bd_size_lock);
442447
}
443448

444449
void bdev_add(struct block_device *bdev, dev_t dev)
445450
{
451+
struct inode *inode = BD_INODE(bdev);
446452
if (bdev_stable_writes(bdev))
447-
mapping_set_stable_writes(bdev->bd_inode->i_mapping);
453+
mapping_set_stable_writes(bdev->bd_mapping);
448454
bdev->bd_dev = dev;
449-
bdev->bd_inode->i_rdev = dev;
450-
bdev->bd_inode->i_ino = dev;
451-
insert_inode_hash(bdev->bd_inode);
455+
inode->i_rdev = dev;
456+
inode->i_ino = dev;
457+
insert_inode_hash(inode);
458+
}
459+
460+
void bdev_unhash(struct block_device *bdev)
461+
{
462+
remove_inode_hash(BD_INODE(bdev));
463+
}
464+
465+
void bdev_drop(struct block_device *bdev)
466+
{
467+
iput(BD_INODE(bdev));
452468
}
453469

454470
long nr_blockdev_pages(void)
@@ -923,7 +939,7 @@ int bdev_open(struct block_device *bdev, blk_mode_t mode, void *holder,
923939
bdev_file->f_mode |= FMODE_NOWAIT;
924940
if (mode & BLK_OPEN_RESTRICT_WRITES)
925941
bdev_file->f_mode |= FMODE_WRITE_RESTRICTED;
926-
bdev_file->f_mapping = bdev->bd_inode->i_mapping;
942+
bdev_file->f_mapping = bdev->bd_mapping;
927943
bdev_file->f_wb_err = filemap_sample_wb_err(bdev_file->f_mapping);
928944
bdev_file->private_data = holder;
929945

@@ -985,13 +1001,13 @@ struct file *bdev_file_open_by_dev(dev_t dev, blk_mode_t mode, void *holder,
9851001
return ERR_PTR(-ENXIO);
9861002

9871003
flags = blk_to_file_flags(mode);
988-
bdev_file = alloc_file_pseudo_noaccount(bdev->bd_inode,
1004+
bdev_file = alloc_file_pseudo_noaccount(BD_INODE(bdev),
9891005
blockdev_mnt, "", flags | O_LARGEFILE, &def_blk_fops);
9901006
if (IS_ERR(bdev_file)) {
9911007
blkdev_put_no_open(bdev);
9921008
return bdev_file;
9931009
}
994-
ihold(bdev->bd_inode);
1010+
ihold(BD_INODE(bdev));
9951011

9961012
ret = bdev_open(bdev, mode, holder, hops, bdev_file);
9971013
if (ret) {
@@ -1266,6 +1282,18 @@ void bdev_statx_dioalign(struct inode *inode, struct kstat *stat)
12661282
blkdev_put_no_open(bdev);
12671283
}
12681284

1285+
bool disk_live(struct gendisk *disk)
1286+
{
1287+
return !inode_unhashed(BD_INODE(disk->part0));
1288+
}
1289+
EXPORT_SYMBOL_GPL(disk_live);
1290+
1291+
unsigned int block_size(struct block_device *bdev)
1292+
{
1293+
return 1 << BD_INODE(bdev)->i_blkbits;
1294+
}
1295+
EXPORT_SYMBOL_GPL(block_size);
1296+
12691297
static int __init setup_bdev_allow_write_mounted(char *str)
12701298
{
12711299
if (kstrtobool(str, &bdev_allow_write_mounted))

block/blk-zoned.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, blk_mode_t mode,
416416
op = REQ_OP_ZONE_RESET;
417417

418418
/* Invalidate the page cache, including dirty pages. */
419-
filemap_invalidate_lock(bdev->bd_inode->i_mapping);
419+
filemap_invalidate_lock(bdev->bd_mapping);
420420
ret = blkdev_truncate_zone_range(bdev, mode, &zrange);
421421
if (ret)
422422
goto fail;
@@ -438,7 +438,7 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, blk_mode_t mode,
438438

439439
fail:
440440
if (cmd == BLKRESETZONE)
441-
filemap_invalidate_unlock(bdev->bd_inode->i_mapping);
441+
filemap_invalidate_unlock(bdev->bd_mapping);
442442

443443
return ret;
444444
}

block/blk.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,8 @@ static inline int blkdev_zone_mgmt_ioctl(struct block_device *bdev,
499499

500500
struct block_device *bdev_alloc(struct gendisk *disk, u8 partno);
501501
void bdev_add(struct block_device *bdev, dev_t dev);
502+
void bdev_unhash(struct block_device *bdev);
503+
void bdev_drop(struct block_device *bdev);
502504

503505
int blk_alloc_ext_minor(void);
504506
void blk_free_ext_minor(unsigned int minor);

block/fops.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -663,8 +663,8 @@ static ssize_t blkdev_buffered_write(struct kiocb *iocb, struct iov_iter *from)
663663
static ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
664664
{
665665
struct file *file = iocb->ki_filp;
666-
struct block_device *bdev = I_BDEV(file->f_mapping->host);
667-
struct inode *bd_inode = bdev->bd_inode;
666+
struct inode *bd_inode = bdev_file_inode(file);
667+
struct block_device *bdev = I_BDEV(bd_inode);
668668
loff_t size = bdev_nr_bytes(bdev);
669669
size_t shorted = 0;
670670
ssize_t ret;

block/genhd.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,7 @@ void del_gendisk(struct gendisk *disk)
653653
*/
654654
mutex_lock(&disk->open_mutex);
655655
xa_for_each(&disk->part_tbl, idx, part)
656-
remove_inode_hash(part->bd_inode);
656+
bdev_unhash(part);
657657
mutex_unlock(&disk->open_mutex);
658658

659659
/*
@@ -742,7 +742,7 @@ void invalidate_disk(struct gendisk *disk)
742742
struct block_device *bdev = disk->part0;
743743

744744
invalidate_bdev(bdev);
745-
bdev->bd_inode->i_mapping->wb_err = 0;
745+
bdev->bd_mapping->wb_err = 0;
746746
set_capacity(disk, 0);
747747
}
748748
EXPORT_SYMBOL(invalidate_disk);
@@ -1191,7 +1191,7 @@ static void disk_release(struct device *dev)
11911191
if (test_bit(GD_ADDED, &disk->state) && disk->fops->free_disk)
11921192
disk->fops->free_disk(disk);
11931193

1194-
iput(disk->part0->bd_inode); /* frees the disk */
1194+
bdev_drop(disk->part0); /* frees the disk */
11951195
}
11961196

11971197
static int block_uevent(const struct device *dev, struct kobj_uevent_env *env)
@@ -1379,7 +1379,7 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
13791379
out_destroy_part_tbl:
13801380
xa_destroy(&disk->part_tbl);
13811381
disk->part0->bd_disk = NULL;
1382-
iput(disk->part0->bd_inode);
1382+
bdev_drop(disk->part0);
13831383
out_free_bdi:
13841384
bdi_put(disk->bdi);
13851385
out_free_bioset:

block/ioctl.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
9696
unsigned long arg)
9797
{
9898
unsigned int bs_mask = bdev_logical_block_size(bdev) - 1;
99-
struct inode *inode = bdev->bd_inode;
10099
uint64_t range[2], start, len, end;
101100
struct bio *prev = NULL, *bio;
102101
sector_t sector, nr_sects;
@@ -126,7 +125,7 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
126125
end > bdev_nr_bytes(bdev))
127126
return -EINVAL;
128127

129-
filemap_invalidate_lock(inode->i_mapping);
128+
filemap_invalidate_lock(bdev->bd_mapping);
130129
err = truncate_bdev_range(bdev, mode, start, start + len - 1);
131130
if (err)
132131
goto fail;
@@ -157,7 +156,7 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
157156
out_unplug:
158157
blk_finish_plug(&plug);
159158
fail:
160-
filemap_invalidate_unlock(inode->i_mapping);
159+
filemap_invalidate_unlock(bdev->bd_mapping);
161160
return err;
162161
}
163162

@@ -182,12 +181,12 @@ static int blk_ioctl_secure_erase(struct block_device *bdev, blk_mode_t mode,
182181
if (start + len > bdev_nr_bytes(bdev))
183182
return -EINVAL;
184183

185-
filemap_invalidate_lock(bdev->bd_inode->i_mapping);
184+
filemap_invalidate_lock(bdev->bd_mapping);
186185
err = truncate_bdev_range(bdev, mode, start, start + len - 1);
187186
if (!err)
188187
err = blkdev_issue_secure_erase(bdev, start >> 9, len >> 9,
189188
GFP_KERNEL);
190-
filemap_invalidate_unlock(bdev->bd_inode->i_mapping);
189+
filemap_invalidate_unlock(bdev->bd_mapping);
191190
return err;
192191
}
193192

@@ -197,7 +196,6 @@ static int blk_ioctl_zeroout(struct block_device *bdev, blk_mode_t mode,
197196
{
198197
uint64_t range[2];
199198
uint64_t start, end, len;
200-
struct inode *inode = bdev->bd_inode;
201199
int err;
202200

203201
if (!(mode & BLK_OPEN_WRITE))
@@ -220,7 +218,7 @@ static int blk_ioctl_zeroout(struct block_device *bdev, blk_mode_t mode,
220218
return -EINVAL;
221219

222220
/* Invalidate the page cache, including dirty pages */
223-
filemap_invalidate_lock(inode->i_mapping);
221+
filemap_invalidate_lock(bdev->bd_mapping);
224222
err = truncate_bdev_range(bdev, mode, start, end);
225223
if (err)
226224
goto fail;
@@ -229,7 +227,7 @@ static int blk_ioctl_zeroout(struct block_device *bdev, blk_mode_t mode,
229227
BLKDEV_ZERO_NOUNMAP);
230228

231229
fail:
232-
filemap_invalidate_unlock(inode->i_mapping);
230+
filemap_invalidate_unlock(bdev->bd_mapping);
233231
return err;
234232
}
235233

block/partitions/core.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ static const struct attribute_group *part_attr_groups[] = {
243243
static void part_release(struct device *dev)
244244
{
245245
put_disk(dev_to_bdev(dev)->bd_disk);
246-
iput(dev_to_bdev(dev)->bd_inode);
246+
bdev_drop(dev_to_bdev(dev));
247247
}
248248

249249
static int part_uevent(const struct device *dev, struct kobj_uevent_env *env)
@@ -469,7 +469,7 @@ int bdev_del_partition(struct gendisk *disk, int partno)
469469
* Just delete the partition and invalidate it.
470470
*/
471471

472-
remove_inode_hash(part->bd_inode);
472+
bdev_unhash(part);
473473
invalidate_bdev(part);
474474
drop_partition(part);
475475
ret = 0;
@@ -652,7 +652,7 @@ int bdev_disk_changed(struct gendisk *disk, bool invalidate)
652652
* it cannot be looked up any more even when openers
653653
* still hold references.
654654
*/
655-
remove_inode_hash(part->bd_inode);
655+
bdev_unhash(part);
656656

657657
/*
658658
* If @disk->open_partitions isn't elevated but there's
@@ -701,7 +701,7 @@ EXPORT_SYMBOL_GPL(bdev_disk_changed);
701701

702702
void *read_part_sector(struct parsed_partitions *state, sector_t n, Sector *p)
703703
{
704-
struct address_space *mapping = state->disk->part0->bd_inode->i_mapping;
704+
struct address_space *mapping = state->disk->part0->bd_mapping;
705705
struct folio *folio;
706706

707707
if (n >= get_capacity(state->disk)) {

drivers/md/bcache/super.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ static const char *read_super(struct cache_sb *sb, struct block_device *bdev,
171171
struct page *page;
172172
unsigned int i;
173173

174-
page = read_cache_page_gfp(bdev->bd_inode->i_mapping,
174+
page = read_cache_page_gfp(bdev->bd_mapping,
175175
SB_OFFSET >> PAGE_SHIFT, GFP_KERNEL);
176176
if (IS_ERR(page))
177177
return "IO error";

drivers/md/dm-vdo/dm-vdo-target.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -878,7 +878,7 @@ static int parse_device_config(int argc, char **argv, struct dm_target *ti,
878878
}
879879

880880
if (config->version == 0) {
881-
u64 device_size = i_size_read(config->owned_device->bdev->bd_inode);
881+
u64 device_size = bdev_nr_bytes(config->owned_device->bdev);
882882

883883
config->physical_blocks = device_size / VDO_BLOCK_SIZE;
884884
}
@@ -1011,7 +1011,7 @@ static void vdo_status(struct dm_target *ti, status_type_t status_type,
10111011

10121012
static block_count_t __must_check get_underlying_device_block_count(const struct vdo *vdo)
10131013
{
1014-
return i_size_read(vdo_get_backing_device(vdo)->bd_inode) / VDO_BLOCK_SIZE;
1014+
return bdev_nr_bytes(vdo_get_backing_device(vdo)) / VDO_BLOCK_SIZE;
10151015
}
10161016

10171017
static int __must_check process_vdo_message_locked(struct vdo *vdo, unsigned int argc,

0 commit comments

Comments
 (0)