Commit 0468c532 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarMing Lei <ming.lei@redhat.com>
Link: https://lore.kernel.org/r/20210722075402.983367-5-hch@lst.de


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent d7a66574
Loading
Loading
Loading
Loading
+7 −10
Original line number Diff line number Diff line
@@ -356,13 +356,6 @@ static struct block_device *add_partition(struct gendisk *disk, int partno,
	bdev->bd_start_sect = start;
	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;
	dname = dev_name(ddev);
	if (isdigit(dname[strlen(dname) - 1]))
@@ -386,6 +379,13 @@ static struct block_device *add_partition(struct gendisk *disk, int partno,
	}
	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 */
	dev_set_uevent_suppress(pdev, 1);
	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);
	return bdev;

out_bdput:
	bdput(bdev);
	return ERR_PTR(err);
out_del:
	kobject_put(bdev->bd_holder_dir);
	device_del(pdev);