block: grab a device refcount in disk_uevent
authorChristoph Hellwig <hch@lst.de>
Thu, 1 Jul 2021 08:16:37 +0000 (10:16 +0200)
committerJens Axboe <axboe@kernel.dk>
Thu, 1 Jul 2021 16:21:24 +0000 (10:21 -0600)
Sending uevents requires the struct device to be alive.  To
ensure that grab the device refcount instead of just an inode
reference.

Fixes: bc359d03c7ec ("block: add a disk_uevent helper")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20210701081638.246552-2-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/genhd.c

index 79aa40b..af4d2ab 100644 (file)
@@ -365,12 +365,12 @@ void disk_uevent(struct gendisk *disk, enum kobject_action action)
        xa_for_each(&disk->part_tbl, idx, part) {
                if (bdev_is_partition(part) && !bdev_nr_sectors(part))
                        continue;
-               if (!bdgrab(part))
+               if (!kobject_get_unless_zero(&part->bd_device.kobj))
                        continue;
 
                rcu_read_unlock();
                kobject_uevent(bdev_kobj(part), action);
-               bdput(part);
+               put_device(&part->bd_device);
                rcu_read_lock();
        }
        rcu_read_unlock();