Always use the deferred kobject_put from mddev_put to clean up a mddev. To make sure that happens properly clear the hold_active on error, and clear the ->gendisk field and put the disk manually when ->add_disk fails to avoid a double free. Fixes: 5e55e2f5fc95 ("[PATCH] md: convert compile time warnings into runtime warnings") Fixes: 9be68dd7ac0e ("md: add error handling support for add_disk()") Signed-off-by: Christoph Hellwig <hch@xxxxxx> --- drivers/md/md.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 076255ec9ba18..861d6a9481b2e 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -5703,23 +5703,23 @@ static int md_alloc(dev_t dev, char *name) disk->events |= DISK_EVENT_MEDIA_CHANGE; mddev->gendisk = disk; error = add_disk(disk); - if (error) - goto out_cleanup_disk; + if (error) { + mddev->gendisk = NULL; + put_disk(disk); + goto out_unlock_disks_mutex; + } error = kobject_add(&mddev->kobj, &disk_to_dev(disk)->kobj, "%s", "md"); if (error) - goto out_del_gendisk; + goto out_unlock_disks_mutex; kobject_uevent(&mddev->kobj, KOBJ_ADD); mddev->sysfs_state = sysfs_get_dirent_safe(mddev->kobj.sd, "array_state"); mddev->sysfs_level = sysfs_get_dirent_safe(mddev->kobj.sd, "level"); - goto out_unlock_disks_mutex; -out_del_gendisk: - del_gendisk(disk); -out_cleanup_disk: - put_disk(disk); out_unlock_disks_mutex: + if (error) + mddev->hold_active = 0; mutex_unlock(&disks_mutex); mddev_put(mddev); return error; -- 2.30.2