Commit 8235b5c1 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe

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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Link: https://lore.kernel.org/r/20210818144542.19305-4-hch@lst.deSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 52b85909
...@@ -466,29 +466,14 @@ void device_add_disk(struct device *parent, struct gendisk *disk, ...@@ -466,29 +466,14 @@ void device_add_disk(struct device *parent, struct gendisk *disk,
disk_alloc_events(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 */ /* delay uevents, until we scanned partition table */
dev_set_uevent_suppress(ddev, 1); dev_set_uevent_suppress(ddev, 1);
ddev->parent = parent; ddev->parent = parent;
ddev->groups = groups; ddev->groups = groups;
dev_set_name(ddev, "%s", disk->disk_name); 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)) if (device_add(ddev))
return; return;
if (!sysfs_deprecated) { if (!sysfs_deprecated) {
...@@ -521,12 +506,25 @@ void device_add_disk(struct device *parent, struct gendisk *disk, ...@@ -521,12 +506,25 @@ void device_add_disk(struct device *parent, struct gendisk *disk,
disk->slave_dir = NULL; 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); disk_scan_partitions(disk);
/* /*
* Announce the disk and partitions after all partitions are * Announce the disk and partitions after all partitions are
* created. * created. (for hidden disks uevents remain suppressed forever)
*/ */
dev_set_uevent_suppress(ddev, 0); dev_set_uevent_suppress(ddev, 0);
disk_uevent(disk, KOBJ_ADD); disk_uevent(disk, KOBJ_ADD);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment