@@ -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+
4651struct block_device * I_BDEV (struct inode * inode )
4752{
4853 return & BDEV_I (inode )-> bdev ;
@@ -57,7 +62,7 @@ EXPORT_SYMBOL(file_bdev);
5762
5863static 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.. */
7782static 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. */
8994void 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
134139static 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
147152int 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}
203208EXPORT_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}
215220EXPORT_SYMBOL (sync_blockdev );
216221
217222int 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}
222227EXPORT_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)
436441void 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
444449void 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
454470long 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+
12691297static int __init setup_bdev_allow_write_mounted (char * str )
12701298{
12711299 if (kstrtobool (str , & bdev_allow_write_mounted ))
0 commit comments