summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2021-08-18 16:45:34 +0200
committerJens Axboe <axboe@kernel.dk>2021-08-23 12:55:45 -0600
commit8235b5c1e8c1c0537f03a21a2e380098bed25248 (patch)
tree1441fe77e9a9d00e1c8db65513cff5297e3843b0
parent52b85909f85d06efa69aaf4210e72467f1f58d2b (diff)
downloadlinux-8235b5c1e8c1c0537f03a21a2e380098bed25248.tar.bz2
block: call bdev_add later in device_add_disk
Once bdev_add is called userspace can open the block device. Ensure that the struct device, which is used for refcounting of the disk besides various other things, is fully setup at that point. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.de> Link: https://lore.kernel.org/r/20210818144542.19305-4-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--block/genhd.c36
1 files changed, 17 insertions, 19 deletions
diff --git a/block/genhd.c b/block/genhd.c
index ec4be5889fbf..ab455f110be2 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -466,29 +466,14 @@ void device_add_disk(struct device *parent, struct gendisk *disk,
disk_alloc_events(disk);
- if (disk->flags & GENHD_FL_HIDDEN) {
- /*
- * Don't let hidden disks show up in /proc/partitions,
- * and don't bother scanning for partitions either.
- */
- disk->flags |= GENHD_FL_SUPPRESS_PARTITION_INFO;
- disk->flags |= GENHD_FL_NO_PART_SCAN;
- } else {
- /* Register BDI before referencing it from bdev */
- ddev->devt = MKDEV(disk->major, disk->first_minor);
- ret = bdi_register(disk->bdi, "%u:%u",
- disk->major, disk->first_minor);
- WARN_ON(ret);
- bdi_set_owner(disk->bdi, ddev);
- bdev_add(disk->part0, ddev->devt);
- }
-
/* delay uevents, until we scanned partition table */
dev_set_uevent_suppress(ddev, 1);
ddev->parent = parent;
ddev->groups = groups;
dev_set_name(ddev, "%s", disk->disk_name);
+ if (!(disk->flags & GENHD_FL_HIDDEN))
+ ddev->devt = MKDEV(disk->major, disk->first_minor);
if (device_add(ddev))
return;
if (!sysfs_deprecated) {
@@ -521,12 +506,25 @@ void device_add_disk(struct device *parent, struct gendisk *disk,
disk->slave_dir = NULL;
}
- if (!(disk->flags & GENHD_FL_HIDDEN)) {
+ if (disk->flags & GENHD_FL_HIDDEN) {
+ /*
+ * Don't let hidden disks show up in /proc/partitions,
+ * and don't bother scanning for partitions either.
+ */
+ disk->flags |= GENHD_FL_SUPPRESS_PARTITION_INFO;
+ disk->flags |= GENHD_FL_NO_PART_SCAN;
+ } else {
+ ret = bdi_register(disk->bdi, "%u:%u",
+ disk->major, disk->first_minor);
+ WARN_ON(ret);
+ bdi_set_owner(disk->bdi, ddev);
+ bdev_add(disk->part0, ddev->devt);
+
disk_scan_partitions(disk);
/*
* Announce the disk and partitions after all partitions are
- * created.
+ * created. (for hidden disks uevents remain suppressed forever)
*/
dev_set_uevent_suppress(ddev, 0);
disk_uevent(disk, KOBJ_ADD);