.max_segment_size = 0x400000,
};
int rv = 0, wait_for_rebuild = 0;
+ bool disk_added = false;
sector_t capacity;
unsigned int index = 0;
dev_err(&dd->pdev->dev,
"Unable to allocate request queue\n");
rv = -ENOMEM;
+ dd->disk = NULL;
goto block_queue_alloc_init_error;
}
dd->queue = dd->disk->queue;
rv = device_add_disk(&dd->pdev->dev, dd->disk, mtip_disk_attr_groups);
if (rv)
goto read_capacity_error;
+ disk_added = true;
if (dd->mtip_svc_handler) {
set_bit(MTIP_DDF_INIT_DONE_BIT, &dd->dd_flag);
dev_err(&dd->pdev->dev, "service thread failed to start\n");
dd->mtip_svc_handler = NULL;
rv = -EFAULT;
- goto kthread_run_error;
+ if (disk_added)
+ goto kthread_run_error;
+ goto read_capacity_error;
}
wake_up_process(dd->mtip_svc_handler);
if (wait_for_rebuild == MTIP_FTL_REBUILD_MAGIC)
kthread_run_error:
/* Delete our gendisk. This also removes the device from /dev */
del_gendisk(dd->disk);
+ mtip_hw_debugfs_exit(dd);
+ blk_mq_free_tag_set(&dd->tags);
+ mtip_hw_exit(dd);
+ return rv;
read_capacity_error:
init_hw_cmds_error:
mtip_hw_debugfs_exit(dd);
ida_free(&rssd_index_ida, index);
ida_get_error:
put_disk(dd->disk);
+ dd->disk = NULL;
block_queue_alloc_init_error:
blk_mq_free_tag_set(&dd->tags);
block_queue_alloc_tag_error:
}
iomap_err:
- kfree(dd);
+ if (dd->disk)
+ put_disk(dd->disk);
+ else
+ kfree(dd);
pci_set_drvdata(pdev, NULL);
return rv;
done: