提交 faf2662e 编写于 作者: Y Yu Kuai 提交者: Yongqiang Liu

block: fix that part scan is disabled in device_add_disk()

hulk inclusion
category: bugfix
bugzilla: 187190, https://gitee.com/src-openeuler/kernel/issues/I5GWOV
CVE: NA

--------------------------------

Commit f20a726b ("block: Fix warning in bd_link_disk_holder()")
moves the setting of flag 'GENHD_FL_UP' behind blkdev_get, which will
disabled part scan:

devcie_add_disk
 register_disk
  blkdev_get
   __blkdev_get
    bdev_get_gendisk
     get_gendisk -> failed because 'GENHD_FL_UP' is not set

And this will cause tests block/017, block/018 and scsi/004 to fail.

Fix the problem by moving part scan as well.

Fixes: f20a726b ("block: Fix warning in bd_link_disk_holder()")
Signed-off-by: NYu Kuai <yukuai3@huawei.com>
Reviewed-by: NJason Yan <yanaijie@huawei.com>
Signed-off-by: NYongqiang Liu <liuyongqiang13@huawei.com>
上级 13879644
...@@ -884,6 +884,42 @@ struct kobj_type blk_queue_ktype = { ...@@ -884,6 +884,42 @@ struct kobj_type blk_queue_ktype = {
.release = blk_release_queue, .release = blk_release_queue,
}; };
static void disk_init_partition(struct gendisk *disk)
{
struct device *ddev = disk_to_dev(disk);
struct block_device *bdev;
struct disk_part_iter piter;
struct hd_struct *part;
/* No minors to use for partitions */
if (!disk_part_scan_enabled(disk))
goto exit;
/* No such device (e.g., media were just removed) */
if (!get_capacity(disk))
goto exit;
bdev = bdget_disk(disk, 0);
if (!bdev)
goto exit;
bdev->bd_invalidated = 1;
if (blkdev_get(bdev, FMODE_READ, NULL))
goto exit;
blkdev_put(bdev, FMODE_READ);
exit:
/* announce disk after possible partitions are created */
dev_set_uevent_suppress(ddev, 0);
kobject_uevent(&ddev->kobj, KOBJ_ADD);
/* announce possible partitions */
disk_part_iter_init(&piter, disk, 0);
while ((part = disk_part_iter_next(&piter)))
kobject_uevent(&part_to_dev(part)->kobj, KOBJ_ADD);
disk_part_iter_exit(&piter);
}
/** /**
* blk_register_queue - register a block layer queue with sysfs * blk_register_queue - register a block layer queue with sysfs
* @disk: Disk of which the request queue should be registered with sysfs. * @disk: Disk of which the request queue should be registered with sysfs.
...@@ -944,6 +980,7 @@ int blk_register_queue(struct gendisk *disk) ...@@ -944,6 +980,7 @@ int blk_register_queue(struct gendisk *disk)
* before it's registration is done. * before it's registration is done.
*/ */
disk->flags |= GENHD_FL_UP; disk->flags |= GENHD_FL_UP;
disk_init_partition(disk);
ret = 0; ret = 0;
unlock: unlock:
mutex_unlock(&q->sysfs_lock); mutex_unlock(&q->sysfs_lock);
......
...@@ -598,9 +598,6 @@ static int exact_lock(dev_t devt, void *data) ...@@ -598,9 +598,6 @@ static int exact_lock(dev_t devt, void *data)
static void register_disk(struct device *parent, struct gendisk *disk) static void register_disk(struct device *parent, struct gendisk *disk)
{ {
struct device *ddev = disk_to_dev(disk); struct device *ddev = disk_to_dev(disk);
struct block_device *bdev;
struct disk_part_iter piter;
struct hd_struct *part;
int err; int err;
ddev->parent = parent; ddev->parent = parent;
...@@ -634,35 +631,6 @@ static void register_disk(struct device *parent, struct gendisk *disk) ...@@ -634,35 +631,6 @@ static void register_disk(struct device *parent, struct gendisk *disk)
if (disk->flags & GENHD_FL_HIDDEN) if (disk->flags & GENHD_FL_HIDDEN)
return; return;
/* No minors to use for partitions */
if (!disk_part_scan_enabled(disk))
goto exit;
/* No such device (e.g., media were just removed) */
if (!get_capacity(disk))
goto exit;
bdev = bdget_disk(disk, 0);
if (!bdev)
goto exit;
bdev->bd_invalidated = 1;
err = blkdev_get(bdev, FMODE_READ, NULL);
if (err < 0)
goto exit;
blkdev_put(bdev, FMODE_READ);
exit:
/* announce disk after possible partitions are created */
dev_set_uevent_suppress(ddev, 0);
kobject_uevent(&ddev->kobj, KOBJ_ADD);
/* announce possible partitions */
disk_part_iter_init(&piter, disk, 0);
while ((part = disk_part_iter_next(&piter)))
kobject_uevent(&part_to_dev(part)->kobj, KOBJ_ADD);
disk_part_iter_exit(&piter);
if (disk->queue->backing_dev_info->dev) { if (disk->queue->backing_dev_info->dev) {
err = sysfs_create_link(&ddev->kobj, err = sysfs_create_link(&ddev->kobj,
&disk->queue->backing_dev_info->dev->kobj, &disk->queue->backing_dev_info->dev->kobj,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册