@@ -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;
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@lst.de> --- drivers/md/md.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)