Lines Matching refs:bdev

34 	struct block_device bdev;  member
45 return &BDEV_I(inode)->bdev; in I_BDEV()
49 static void bdev_write_inode(struct block_device *bdev) in bdev_write_inode() argument
51 struct inode *inode = bdev->bd_inode; in bdev_write_inode()
61 bdev, ret); in bdev_write_inode()
68 static void kill_bdev(struct block_device *bdev) in kill_bdev() argument
70 struct address_space *mapping = bdev->bd_inode->i_mapping; in kill_bdev()
80 void invalidate_bdev(struct block_device *bdev) in invalidate_bdev() argument
82 struct address_space *mapping = bdev->bd_inode->i_mapping; in invalidate_bdev()
96 int truncate_bdev_range(struct block_device *bdev, fmode_t mode, in truncate_bdev_range() argument
105 int err = bd_prepare_to_claim(bdev, truncate_bdev_range); in truncate_bdev_range()
110 truncate_inode_pages_range(bdev->bd_inode->i_mapping, lstart, lend); in truncate_bdev_range()
112 bd_abort_claiming(bdev, truncate_bdev_range); in truncate_bdev_range()
120 return invalidate_inode_pages2_range(bdev->bd_inode->i_mapping, in truncate_bdev_range()
125 static void set_init_blocksize(struct block_device *bdev) in set_init_blocksize() argument
127 unsigned int bsize = bdev_logical_block_size(bdev); in set_init_blocksize()
128 loff_t size = i_size_read(bdev->bd_inode); in set_init_blocksize()
135 bdev->bd_inode->i_blkbits = blksize_bits(bsize); in set_init_blocksize()
138 int set_blocksize(struct block_device *bdev, int size) in set_blocksize() argument
145 if (size < bdev_logical_block_size(bdev)) in set_blocksize()
149 if (bdev->bd_inode->i_blkbits != blksize_bits(size)) { in set_blocksize()
150 sync_blockdev(bdev); in set_blocksize()
151 bdev->bd_inode->i_blkbits = blksize_bits(size); in set_blocksize()
152 kill_bdev(bdev); in set_blocksize()
182 int sync_blockdev_nowait(struct block_device *bdev) in sync_blockdev_nowait() argument
184 if (!bdev) in sync_blockdev_nowait()
186 return filemap_flush(bdev->bd_inode->i_mapping); in sync_blockdev_nowait()
194 int sync_blockdev(struct block_device *bdev) in sync_blockdev() argument
196 if (!bdev) in sync_blockdev()
198 return filemap_write_and_wait(bdev->bd_inode->i_mapping); in sync_blockdev()
202 int sync_blockdev_range(struct block_device *bdev, loff_t lstart, loff_t lend) in sync_blockdev_range() argument
204 return filemap_write_and_wait_range(bdev->bd_inode->i_mapping, in sync_blockdev_range()
214 int fsync_bdev(struct block_device *bdev) in fsync_bdev() argument
216 struct super_block *sb = get_super(bdev); in fsync_bdev()
222 return sync_blockdev(bdev); in fsync_bdev()
238 int freeze_bdev(struct block_device *bdev) in freeze_bdev() argument
243 mutex_lock(&bdev->bd_fsfreeze_mutex); in freeze_bdev()
244 if (++bdev->bd_fsfreeze_count > 1) in freeze_bdev()
247 sb = get_active_super(bdev); in freeze_bdev()
257 bdev->bd_fsfreeze_count--; in freeze_bdev()
260 bdev->bd_fsfreeze_sb = sb; in freeze_bdev()
263 sync_blockdev(bdev); in freeze_bdev()
265 mutex_unlock(&bdev->bd_fsfreeze_mutex); in freeze_bdev()
276 int thaw_bdev(struct block_device *bdev) in thaw_bdev() argument
281 mutex_lock(&bdev->bd_fsfreeze_mutex); in thaw_bdev()
282 if (!bdev->bd_fsfreeze_count) in thaw_bdev()
286 if (--bdev->bd_fsfreeze_count > 0) in thaw_bdev()
289 sb = bdev->bd_fsfreeze_sb; in thaw_bdev()
298 bdev->bd_fsfreeze_count++; in thaw_bdev()
300 bdev->bd_fsfreeze_sb = NULL; in thaw_bdev()
302 mutex_unlock(&bdev->bd_fsfreeze_mutex); in thaw_bdev()
320 memset(&ei->bdev, 0, sizeof(ei->bdev)); in bdev_alloc_inode()
326 struct block_device *bdev = I_BDEV(inode); in bdev_free_inode() local
328 free_percpu(bdev->bd_stats); in bdev_free_inode()
329 kfree(bdev->bd_meta_info); in bdev_free_inode()
331 if (!bdev_is_partition(bdev)) { in bdev_free_inode()
332 if (bdev->bd_disk && bdev->bd_disk->bdi) in bdev_free_inode()
333 bdi_put(bdev->bd_disk->bdi); in bdev_free_inode()
334 kfree(bdev->bd_disk); in bdev_free_inode()
337 if (MAJOR(bdev->bd_dev) == BLOCK_EXT_MAJOR) in bdev_free_inode()
338 blk_free_ext_minor(MINOR(bdev->bd_dev)); in bdev_free_inode()
404 struct block_device *bdev; in bdev_alloc() local
415 bdev = I_BDEV(inode); in bdev_alloc()
416 mutex_init(&bdev->bd_fsfreeze_mutex); in bdev_alloc()
417 spin_lock_init(&bdev->bd_size_lock); in bdev_alloc()
418 bdev->bd_partno = partno; in bdev_alloc()
419 bdev->bd_inode = inode; in bdev_alloc()
420 bdev->bd_queue = disk->queue; in bdev_alloc()
421 bdev->bd_stats = alloc_percpu(struct disk_stats); in bdev_alloc()
422 if (!bdev->bd_stats) { in bdev_alloc()
426 bdev->bd_disk = disk; in bdev_alloc()
427 return bdev; in bdev_alloc()
430 void bdev_add(struct block_device *bdev, dev_t dev) in bdev_add() argument
432 bdev->bd_dev = dev; in bdev_add()
433 bdev->bd_inode->i_rdev = dev; in bdev_add()
434 bdev->bd_inode->i_ino = dev; in bdev_add()
435 insert_inode_hash(bdev->bd_inode); in bdev_add()
465 static bool bd_may_claim(struct block_device *bdev, struct block_device *whole, in bd_may_claim() argument
468 if (bdev->bd_holder == holder) in bd_may_claim()
470 else if (bdev->bd_holder != NULL) in bd_may_claim()
472 else if (whole == bdev) in bd_may_claim()
495 int bd_prepare_to_claim(struct block_device *bdev, void *holder) in bd_prepare_to_claim() argument
497 struct block_device *whole = bdev_whole(bdev); in bd_prepare_to_claim()
504 if (!bd_may_claim(bdev, whole, holder)) { in bd_prepare_to_claim()
545 static void bd_finish_claiming(struct block_device *bdev, void *holder) in bd_finish_claiming() argument
547 struct block_device *whole = bdev_whole(bdev); in bd_finish_claiming()
550 BUG_ON(!bd_may_claim(bdev, whole, holder)); in bd_finish_claiming()
557 bdev->bd_holders++; in bd_finish_claiming()
558 bdev->bd_holder = holder; in bd_finish_claiming()
572 void bd_abort_claiming(struct block_device *bdev, void *holder) in bd_abort_claiming() argument
575 bd_clear_claiming(bdev_whole(bdev), holder); in bd_abort_claiming()
580 static void blkdev_flush_mapping(struct block_device *bdev) in blkdev_flush_mapping() argument
582 WARN_ON_ONCE(bdev->bd_holders); in blkdev_flush_mapping()
583 sync_blockdev(bdev); in blkdev_flush_mapping()
584 kill_bdev(bdev); in blkdev_flush_mapping()
585 bdev_write_inode(bdev); in blkdev_flush_mapping()
588 static int blkdev_get_whole(struct block_device *bdev, fmode_t mode) in blkdev_get_whole() argument
590 struct gendisk *disk = bdev->bd_disk; in blkdev_get_whole()
594 ret = disk->fops->open(bdev, mode); in blkdev_get_whole()
604 if (!atomic_read(&bdev->bd_openers)) in blkdev_get_whole()
605 set_init_blocksize(bdev); in blkdev_get_whole()
608 atomic_inc(&bdev->bd_openers); in blkdev_get_whole()
612 static void blkdev_put_whole(struct block_device *bdev, fmode_t mode) in blkdev_put_whole() argument
614 if (atomic_dec_and_test(&bdev->bd_openers)) in blkdev_put_whole()
615 blkdev_flush_mapping(bdev); in blkdev_put_whole()
616 if (bdev->bd_disk->fops->release) in blkdev_put_whole()
617 bdev->bd_disk->fops->release(bdev->bd_disk, mode); in blkdev_put_whole()
660 struct block_device *bdev; in blkdev_get_no_open() local
675 bdev = &BDEV_I(inode)->bdev; in blkdev_get_no_open()
676 if (!kobject_get_unless_zero(&bdev->bd_device.kobj)) in blkdev_get_no_open()
677 bdev = NULL; in blkdev_get_no_open()
679 return bdev; in blkdev_get_no_open()
682 void blkdev_put_no_open(struct block_device *bdev) in blkdev_put_no_open() argument
684 put_device(&bdev->bd_device); in blkdev_put_no_open()
711 struct block_device *bdev; in blkdev_get_by_dev() local
722 bdev = blkdev_get_no_open(dev); in blkdev_get_by_dev()
723 if (!bdev) in blkdev_get_by_dev()
725 disk = bdev->bd_disk; in blkdev_get_by_dev()
728 ret = bd_prepare_to_claim(bdev, holder); in blkdev_get_by_dev()
741 if (bdev_is_partition(bdev)) in blkdev_get_by_dev()
742 ret = blkdev_get_part(bdev, mode); in blkdev_get_by_dev()
744 ret = blkdev_get_whole(bdev, mode); in blkdev_get_by_dev()
748 bd_finish_claiming(bdev, holder); in blkdev_get_by_dev()
757 if ((mode & FMODE_WRITE) && !bdev->bd_write_holder && in blkdev_get_by_dev()
759 bdev->bd_write_holder = true; in blkdev_get_by_dev()
767 return bdev; in blkdev_get_by_dev()
772 bd_abort_claiming(bdev, holder); in blkdev_get_by_dev()
776 blkdev_put_no_open(bdev); in blkdev_get_by_dev()
801 struct block_device *bdev; in blkdev_get_by_path() local
809 bdev = blkdev_get_by_dev(dev, mode, holder); in blkdev_get_by_path()
810 if (!IS_ERR(bdev) && (mode & FMODE_WRITE) && bdev_read_only(bdev)) { in blkdev_get_by_path()
811 blkdev_put(bdev, mode); in blkdev_get_by_path()
815 return bdev; in blkdev_get_by_path()
819 void blkdev_put(struct block_device *bdev, fmode_t mode) in blkdev_put() argument
821 struct gendisk *disk = bdev->bd_disk; in blkdev_put()
830 if (atomic_read(&bdev->bd_openers) == 1) in blkdev_put()
831 sync_blockdev(bdev); in blkdev_put()
835 struct block_device *whole = bdev_whole(bdev); in blkdev_put()
845 WARN_ON_ONCE(--bdev->bd_holders < 0); in blkdev_put()
848 if ((bdev_free = !bdev->bd_holders)) in blkdev_put()
849 bdev->bd_holder = NULL; in blkdev_put()
859 if (bdev_free && bdev->bd_write_holder) { in blkdev_put()
861 bdev->bd_write_holder = false; in blkdev_put()
872 if (bdev_is_partition(bdev)) in blkdev_put()
873 blkdev_put_part(bdev, mode); in blkdev_put()
875 blkdev_put_whole(bdev, mode); in blkdev_put()
879 blkdev_put_no_open(bdev); in blkdev_put()
923 int __invalidate_device(struct block_device *bdev, bool kill_dirty) in __invalidate_device() argument
925 struct super_block *sb = get_super(bdev); in __invalidate_device()
939 invalidate_bdev(bdev); in __invalidate_device()
951 struct block_device *bdev; in sync_bdevs() local
972 bdev = I_BDEV(inode); in sync_bdevs()
974 mutex_lock(&bdev->bd_disk->open_mutex); in sync_bdevs()
975 if (!atomic_read(&bdev->bd_openers)) { in sync_bdevs()
988 mutex_unlock(&bdev->bd_disk->open_mutex); in sync_bdevs()
1005 struct block_device *bdev; in bdev_statx_dioalign() local
1007 bdev = blkdev_get_no_open(inode->i_rdev); in bdev_statx_dioalign()
1008 if (!bdev) in bdev_statx_dioalign()
1011 stat->dio_mem_align = bdev_dma_alignment(bdev) + 1; in bdev_statx_dioalign()
1012 stat->dio_offset_align = bdev_logical_block_size(bdev); in bdev_statx_dioalign()
1015 blkdev_put_no_open(bdev); in bdev_statx_dioalign()