Skip to content

Commit 4e7b567

Browse files
Christoph Hellwigaxboe
authored andcommitted
block: remove i_bdev
Switch the block device lookup interfaces to directly work with a dev_t so that struct block_device references are only acquired by the blkdev_get variants (and the blk-cgroup special case). This means that we now don't need an extra reference in the inode and can generally simplify handling of struct block_device to keep the lookups contained in the core block layer code. Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Jan Kara <[email protected]> Reviewed-by: Hannes Reinecke <[email protected]> Acked-by: Tejun Heo <[email protected]> Acked-by: Coly Li <[email protected]> [bcache] Signed-off-by: Jens Axboe <[email protected]>
1 parent 7918f0f commit 4e7b567

File tree

18 files changed

+121
-252
lines changed

18 files changed

+121
-252
lines changed

block/ioctl.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -590,8 +590,7 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
590590
{
591591
int ret;
592592
void __user *argp = compat_ptr(arg);
593-
struct inode *inode = file->f_mapping->host;
594-
struct block_device *bdev = inode->i_bdev;
593+
struct block_device *bdev = I_BDEV(file->f_mapping->host);
595594
struct gendisk *disk = bdev->bd_disk;
596595
fmode_t mode = file->f_mode;
597596
loff_t size;

drivers/block/loop.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -675,10 +675,10 @@ static int loop_validate_file(struct file *file, struct block_device *bdev)
675675
while (is_loop_device(f)) {
676676
struct loop_device *l;
677677

678-
if (f->f_mapping->host->i_bdev == bdev)
678+
if (f->f_mapping->host->i_rdev == bdev->bd_dev)
679679
return -EBADF;
680680

681-
l = f->f_mapping->host->i_bdev->bd_disk->private_data;
681+
l = I_BDEV(f->f_mapping->host)->bd_disk->private_data;
682682
if (l->lo_state != Lo_bound) {
683683
return -EINVAL;
684684
}
@@ -885,9 +885,7 @@ static void loop_config_discard(struct loop_device *lo)
885885
* file-backed loop devices: discarded regions read back as zero.
886886
*/
887887
if (S_ISBLK(inode->i_mode) && !lo->lo_encrypt_key_size) {
888-
struct request_queue *backingq;
889-
890-
backingq = bdev_get_queue(inode->i_bdev);
888+
struct request_queue *backingq = bdev_get_queue(I_BDEV(inode));
891889

892890
max_discard_sectors = backingq->limits.max_write_zeroes_sectors;
893891
granularity = backingq->limits.discard_granularity ?:

drivers/md/bcache/super.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2380,38 +2380,38 @@ kobj_attribute_write(register, register_bcache);
23802380
kobj_attribute_write(register_quiet, register_bcache);
23812381
kobj_attribute_write(pendings_cleanup, bch_pending_bdevs_cleanup);
23822382

2383-
static bool bch_is_open_backing(struct block_device *bdev)
2383+
static bool bch_is_open_backing(dev_t dev)
23842384
{
23852385
struct cache_set *c, *tc;
23862386
struct cached_dev *dc, *t;
23872387

23882388
list_for_each_entry_safe(c, tc, &bch_cache_sets, list)
23892389
list_for_each_entry_safe(dc, t, &c->cached_devs, list)
2390-
if (dc->bdev == bdev)
2390+
if (dc->bdev->bd_dev == dev)
23912391
return true;
23922392
list_for_each_entry_safe(dc, t, &uncached_devices, list)
2393-
if (dc->bdev == bdev)
2393+
if (dc->bdev->bd_dev == dev)
23942394
return true;
23952395
return false;
23962396
}
23972397

2398-
static bool bch_is_open_cache(struct block_device *bdev)
2398+
static bool bch_is_open_cache(dev_t dev)
23992399
{
24002400
struct cache_set *c, *tc;
24012401

24022402
list_for_each_entry_safe(c, tc, &bch_cache_sets, list) {
24032403
struct cache *ca = c->cache;
24042404

2405-
if (ca->bdev == bdev)
2405+
if (ca->bdev->bd_dev == dev)
24062406
return true;
24072407
}
24082408

24092409
return false;
24102410
}
24112411

2412-
static bool bch_is_open(struct block_device *bdev)
2412+
static bool bch_is_open(dev_t dev)
24132413
{
2414-
return bch_is_open_cache(bdev) || bch_is_open_backing(bdev);
2414+
return bch_is_open_cache(dev) || bch_is_open_backing(dev);
24152415
}
24162416

24172417
struct async_reg_args {
@@ -2535,9 +2535,11 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr,
25352535
sb);
25362536
if (IS_ERR(bdev)) {
25372537
if (bdev == ERR_PTR(-EBUSY)) {
2538-
bdev = lookup_bdev(strim(path));
2538+
dev_t dev;
2539+
25392540
mutex_lock(&bch_register_lock);
2540-
if (!IS_ERR(bdev) && bch_is_open(bdev))
2541+
if (lookup_bdev(strim(path), &dev) == 0 &&
2542+
bch_is_open(dev))
25412543
err = "device already registered";
25422544
else
25432545
err = "device busy";

drivers/md/dm-table.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -348,16 +348,9 @@ static int upgrade_mode(struct dm_dev_internal *dd, fmode_t new_mode,
348348
dev_t dm_get_dev_t(const char *path)
349349
{
350350
dev_t dev;
351-
struct block_device *bdev;
352351

353-
bdev = lookup_bdev(path);
354-
if (IS_ERR(bdev))
352+
if (lookup_bdev(path, &dev))
355353
dev = name_to_dev_t(path);
356-
else {
357-
dev = bdev->bd_dev;
358-
bdput(bdev);
359-
}
360-
361354
return dev;
362355
}
363356
EXPORT_SYMBOL_GPL(dm_get_dev_t);

drivers/mtd/mtdsuper.c

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,8 @@ int get_tree_mtd(struct fs_context *fc,
120120
struct fs_context *fc))
121121
{
122122
#ifdef CONFIG_BLOCK
123-
struct block_device *bdev;
124-
int ret, major;
123+
dev_t dev;
124+
int ret;
125125
#endif
126126
int mtdnr;
127127

@@ -169,20 +169,15 @@ int get_tree_mtd(struct fs_context *fc,
169169
/* try the old way - the hack where we allowed users to mount
170170
* /dev/mtdblock$(n) but didn't actually _use_ the blockdev
171171
*/
172-
bdev = lookup_bdev(fc->source);
173-
if (IS_ERR(bdev)) {
174-
ret = PTR_ERR(bdev);
172+
ret = lookup_bdev(fc->source, &dev);
173+
if (ret) {
175174
errorf(fc, "MTD: Couldn't look up '%s': %d", fc->source, ret);
176175
return ret;
177176
}
178177
pr_debug("MTDSB: lookup_bdev() returned 0\n");
179178

180-
major = MAJOR(bdev->bd_dev);
181-
mtdnr = MINOR(bdev->bd_dev);
182-
bdput(bdev);
183-
184-
if (major == MTD_BLOCK_MAJOR)
185-
return mtd_get_sb_by_nr(fc, mtdnr, fill_super);
179+
if (MAJOR(dev) == MTD_BLOCK_MAJOR)
180+
return mtd_get_sb_by_nr(fc, MINOR(dev), fill_super);
186181

187182
#endif /* CONFIG_BLOCK */
188183

drivers/target/target_core_file.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,10 @@ static int fd_configure_device(struct se_device *dev)
133133
*/
134134
inode = file->f_mapping->host;
135135
if (S_ISBLK(inode->i_mode)) {
136-
struct request_queue *q = bdev_get_queue(inode->i_bdev);
136+
struct request_queue *q = bdev_get_queue(I_BDEV(inode));
137137
unsigned long long dev_size;
138138

139-
fd_dev->fd_block_size = bdev_logical_block_size(inode->i_bdev);
139+
fd_dev->fd_block_size = bdev_logical_block_size(I_BDEV(inode));
140140
/*
141141
* Determine the number of bytes from i_size_read() minus
142142
* one (1) logical sector from underlying struct block_device
@@ -559,7 +559,7 @@ fd_execute_unmap(struct se_cmd *cmd, sector_t lba, sector_t nolb)
559559

560560
if (S_ISBLK(inode->i_mode)) {
561561
/* The backend is block device, use discard */
562-
struct block_device *bdev = inode->i_bdev;
562+
struct block_device *bdev = I_BDEV(inode);
563563
struct se_device *dev = cmd->se_dev;
564564

565565
ret = blkdev_issue_discard(bdev,

drivers/usb/gadget/function/storage_common.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ int fsg_lun_open(struct fsg_lun *curlun, const char *filename)
204204
if (!(filp->f_mode & FMODE_WRITE))
205205
ro = 1;
206206

207-
inode = file_inode(filp);
207+
inode = filp->f_mapping->host;
208208
if ((!S_ISREG(inode->i_mode) && !S_ISBLK(inode->i_mode))) {
209209
LINFO(curlun, "invalid file type: %s\n", filename);
210210
goto out;
@@ -221,7 +221,7 @@ int fsg_lun_open(struct fsg_lun *curlun, const char *filename)
221221
if (!(filp->f_mode & FMODE_CAN_WRITE))
222222
ro = 1;
223223

224-
size = i_size_read(inode->i_mapping->host);
224+
size = i_size_read(inode);
225225
if (size < 0) {
226226
LINFO(curlun, "unable to find file size: %s\n", filename);
227227
rc = (int) size;
@@ -231,8 +231,8 @@ int fsg_lun_open(struct fsg_lun *curlun, const char *filename)
231231
if (curlun->cdrom) {
232232
blksize = 2048;
233233
blkbits = 11;
234-
} else if (inode->i_bdev) {
235-
blksize = bdev_logical_block_size(inode->i_bdev);
234+
} else if (S_ISBLK(inode->i_mode)) {
235+
blksize = bdev_logical_block_size(I_BDEV(inode));
236236
blkbits = blksize_bits(blksize);
237237
} else {
238238
blksize = 512;

0 commit comments

Comments
 (0)