block: fix leaking minors of hidden disks
authorChristoph Hellwig <hch@lst.de>
Mon, 10 Oct 2022 13:18:57 +0000 (15:18 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 10 Oct 2022 14:48:59 +0000 (08:48 -0600)
The major/minor of a hidden gendisk is not propagated to the block
device because it is never registered using bdev_add.  But the lack of
bd_dev also causes the dynamic major minor number not to be freed.
Assign bd_dev manually to ensure the dynamic major minor gets freed.

Based on a patch by Keith Busch.

Fixes: 8ddcd653257c ("block: introduce GENHD_FL_HIDDEN")
Reported-by: Daniel Wagner <dwagner@suse.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Tested-by: Daniel Wagner <dwagner@suse.de>
Reviewed-by: Keith Busch <kbusch@kernel.org>
Link: https://lore.kernel.org/r/20221010131857.748129-1-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/genhd.c

index d6a21803a57e2bb563f4047a456f555bd0caada9..dc9b61dfb6920bfe1f7e7f6c33312e215f3136e6 100644 (file)
@@ -507,6 +507,13 @@ int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
                 */
                dev_set_uevent_suppress(ddev, 0);
                disk_uevent(disk, KOBJ_ADD);
+       } else {
+               /*
+                * Even if the block_device for a hidden gendisk is not
+                * registered, it needs to have a valid bd_dev so that the
+                * freeing of the dynamic major works.
+                */
+               disk->part0->bd_dev = MKDEV(disk->major, disk->first_minor);
        }
 
        disk_update_readahead(disk);