mirror of https://gitee.com/openkylin/linux.git
block: allocate bd_meta_info later in add_partitions
Move the allocation of bd_meta_info after initializing the struct device to avoid the special bdput error handling path. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Ming Lei <ming.lei@redhat.com> Link: https://lore.kernel.org/r/20210722075402.983367-5-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
d7a66574b3
commit
0468c53234
|
@ -356,13 +356,6 @@ static struct block_device *add_partition(struct gendisk *disk, int partno,
|
||||||
bdev->bd_start_sect = start;
|
bdev->bd_start_sect = start;
|
||||||
bdev_set_nr_sectors(bdev, len);
|
bdev_set_nr_sectors(bdev, len);
|
||||||
|
|
||||||
if (info) {
|
|
||||||
err = -ENOMEM;
|
|
||||||
bdev->bd_meta_info = kmemdup(info, sizeof(*info), GFP_KERNEL);
|
|
||||||
if (!bdev->bd_meta_info)
|
|
||||||
goto out_bdput;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdev = &bdev->bd_device;
|
pdev = &bdev->bd_device;
|
||||||
dname = dev_name(ddev);
|
dname = dev_name(ddev);
|
||||||
if (isdigit(dname[strlen(dname) - 1]))
|
if (isdigit(dname[strlen(dname) - 1]))
|
||||||
|
@ -386,6 +379,13 @@ static struct block_device *add_partition(struct gendisk *disk, int partno,
|
||||||
}
|
}
|
||||||
pdev->devt = devt;
|
pdev->devt = devt;
|
||||||
|
|
||||||
|
if (info) {
|
||||||
|
err = -ENOMEM;
|
||||||
|
bdev->bd_meta_info = kmemdup(info, sizeof(*info), GFP_KERNEL);
|
||||||
|
if (!bdev->bd_meta_info)
|
||||||
|
goto out_put;
|
||||||
|
}
|
||||||
|
|
||||||
/* delay uevent until 'holders' subdir is created */
|
/* delay uevent until 'holders' subdir is created */
|
||||||
dev_set_uevent_suppress(pdev, 1);
|
dev_set_uevent_suppress(pdev, 1);
|
||||||
err = device_add(pdev);
|
err = device_add(pdev);
|
||||||
|
@ -415,9 +415,6 @@ static struct block_device *add_partition(struct gendisk *disk, int partno,
|
||||||
kobject_uevent(&pdev->kobj, KOBJ_ADD);
|
kobject_uevent(&pdev->kobj, KOBJ_ADD);
|
||||||
return bdev;
|
return bdev;
|
||||||
|
|
||||||
out_bdput:
|
|
||||||
bdput(bdev);
|
|
||||||
return ERR_PTR(err);
|
|
||||||
out_del:
|
out_del:
|
||||||
kobject_put(bdev->bd_holder_dir);
|
kobject_put(bdev->bd_holder_dir);
|
||||||
device_del(pdev);
|
device_del(pdev);
|
||||||
|
|
Loading…
Reference in New Issue