block: add helper add_disk_final()
authorMing Lei <ming.lei@redhat.com>
Mon, 5 May 2025 14:17:45 +0000 (22:17 +0800)
committerJens Axboe <axboe@kernel.dk>
Tue, 6 May 2025 13:43:42 +0000 (07:43 -0600)
Add helper add_disk_final() for scanning partitions, announcing disk and
handling the last thing for adding disk.

No functional change, and prepare for prevent adding disk from happening
when updating nr_hw_queues.

Signed-off-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Nilay Shroff <nilay@linux.ibm.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20250505141805.2751237-8-ming.lei@redhat.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/genhd.c

index c2bd86cd09dec0ad28b341493b7b7a9bed0a2bd2..50f3deeec5e366d1b5f96db5ce39459cc9f42de1 100644 (file)
@@ -389,6 +389,32 @@ int disk_scan_partitions(struct gendisk *disk, blk_mode_t mode)
        return ret;
 }
 
+static void add_disk_final(struct gendisk *disk)
+{
+       struct device *ddev = disk_to_dev(disk);
+
+       if (!(disk->flags & GENHD_FL_HIDDEN)) {
+               /* Make sure the first partition scan will be proceed */
+               if (get_capacity(disk) && disk_has_partscan(disk))
+                       set_bit(GD_NEED_PART_SCAN, &disk->state);
+
+               bdev_add(disk->part0, ddev->devt);
+               if (get_capacity(disk))
+                       disk_scan_partitions(disk, BLK_OPEN_READ);
+
+               /*
+                * Announce the disk and partitions after all partitions are
+                * created. (for hidden disks uevents remain suppressed forever)
+                */
+               dev_set_uevent_suppress(ddev, 0);
+               disk_uevent(disk, KOBJ_ADD);
+       }
+
+       blk_apply_bdi_limits(disk->bdi, &disk->queue->limits);
+       disk_add_events(disk);
+       set_bit(GD_ADDED, &disk->state);
+}
+
 /**
  * add_disk_fwnode - add disk information to kernel list with fwnode
  * @parent: parent device for the disk
@@ -516,21 +542,6 @@ int __must_check add_disk_fwnode(struct device *parent, struct gendisk *disk,
                                        &disk->bdi->dev->kobj, "bdi");
                if (ret)
                        goto out_unregister_bdi;
-
-               /* Make sure the first partition scan will be proceed */
-               if (get_capacity(disk) && disk_has_partscan(disk))
-                       set_bit(GD_NEED_PART_SCAN, &disk->state);
-
-               bdev_add(disk->part0, ddev->devt);
-               if (get_capacity(disk))
-                       disk_scan_partitions(disk, BLK_OPEN_READ);
-
-               /*
-                * Announce the disk and partitions after all partitions are
-                * created. (for hidden disks uevents remain suppressed forever)
-                */
-               dev_set_uevent_suppress(ddev, 0);
-               disk_uevent(disk, KOBJ_ADD);
        } else {
                /*
                 * Even if the block_device for a hidden gendisk is not
@@ -539,10 +550,7 @@ int __must_check add_disk_fwnode(struct device *parent, struct gendisk *disk,
                 */
                disk->part0->bd_dev = MKDEV(disk->major, disk->first_minor);
        }
-
-       blk_apply_bdi_limits(disk->bdi, &disk->queue->limits);
-       disk_add_events(disk);
-       set_bit(GD_ADDED, &disk->state);
+       add_disk_final(disk);
        return 0;
 
 out_unregister_bdi: