aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/block/genhd.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2021-08-09 16:17:43 +0200
committerJens Axboe <axboe@kernel.dk>2021-08-09 11:53:23 -0600
commitedb0872f44ec9976ea6d052cb4b93cd2d23ac2ba (patch)
tree077c52abab520da5223f99729c41dc0119f73b4b /block/genhd.c
parentblock: add a queue_has_disk helper (diff)
downloadwireguard-linux-edb0872f44ec9976ea6d052cb4b93cd2d23ac2ba.tar.xz
wireguard-linux-edb0872f44ec9976ea6d052cb4b93cd2d23ac2ba.zip
block: move the bdi from the request_queue to the gendisk
The backing device information only makes sense for file system I/O, and thus belongs into the gendisk and not the lower level request_queue structure. Move it there. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Link: https://lore.kernel.org/r/20210809141744.1203023-5-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/genhd.c')
-rw-r--r--block/genhd.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/block/genhd.c b/block/genhd.c
index b0b6e0caa389..f8def1129501 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -466,10 +466,9 @@ static void register_disk(struct device *parent, struct gendisk *disk,
dev_set_uevent_suppress(ddev, 0);
disk_uevent(disk, KOBJ_ADD);
- if (disk->queue->backing_dev_info->dev) {
- err = sysfs_create_link(&ddev->kobj,
- &disk->queue->backing_dev_info->dev->kobj,
- "bdi");
+ if (disk->bdi->dev) {
+ err = sysfs_create_link(&ddev->kobj, &disk->bdi->dev->kobj,
+ "bdi");
WARN_ON(err);
}
}
@@ -540,15 +539,14 @@ void device_add_disk(struct device *parent, struct gendisk *disk,
disk->flags |= GENHD_FL_SUPPRESS_PARTITION_INFO;
disk->flags |= GENHD_FL_NO_PART_SCAN;
} else {
- struct backing_dev_info *bdi = disk->queue->backing_dev_info;
struct device *dev = disk_to_dev(disk);
/* Register BDI before referencing it from bdev */
dev->devt = MKDEV(disk->major, disk->first_minor);
- ret = bdi_register(bdi, "%u:%u",
+ ret = bdi_register(disk->bdi, "%u:%u",
disk->major, disk->first_minor);
WARN_ON(ret);
- bdi_set_owner(bdi, dev);
+ bdi_set_owner(disk->bdi, dev);
bdev_add(disk->part0, dev->devt);
}
register_disk(parent, disk, groups);
@@ -615,7 +613,7 @@ void del_gendisk(struct gendisk *disk)
* Unregister bdi before releasing device numbers (as they can
* get reused and we'd get clashes in sysfs).
*/
- bdi_unregister(disk->queue->backing_dev_info);
+ bdi_unregister(disk->bdi);
}
blk_unregister_queue(disk);
@@ -1088,6 +1086,7 @@ static void disk_release(struct device *dev)
might_sleep();
+ bdi_put(disk->bdi);
if (MAJOR(dev->devt) == BLOCK_EXT_MAJOR)
blk_free_ext_minor(MINOR(dev->devt));
disk_release_events(disk);
@@ -1268,9 +1267,13 @@ struct gendisk *__alloc_disk_node(int minors, int node_id)
if (!disk)
return NULL;
+ disk->bdi = bdi_alloc(node_id);
+ if (!disk->bdi)
+ goto out_free_disk;
+
disk->part0 = bdev_alloc(disk, 0);
if (!disk->part0)
- goto out_free_disk;
+ goto out_free_bdi;
disk->node_id = node_id;
mutex_init(&disk->open_mutex);
@@ -1292,6 +1295,8 @@ struct gendisk *__alloc_disk_node(int minors, int node_id)
out_destroy_part_tbl:
xa_destroy(&disk->part_tbl);
iput(disk->part0->bd_inode);
+out_free_bdi:
+ bdi_put(disk->bdi);
out_free_disk:
kfree(disk);
return NULL;