]> git.baikalelectronics.ru Git - kernel.git/commitdiff
block: call bdev_add later in device_add_disk
authorChristoph Hellwig <hch@lst.de>
Wed, 18 Aug 2021 14:45:34 +0000 (16:45 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 23 Aug 2021 18:55:45 +0000 (12:55 -0600)
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>
block/genhd.c

index ec4be5889fbf2d350ddc8d20428ee47b6b8e2756..ab455f110be2b9b76770d96e55e3165ca1716b8d 100644 (file)
@@ -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);