scsi: qla2xxx: Unregister chrdev if module initialization fails

If module initialization fails after the character device has been
registered, unregister the character device. Additionally, avoid
duplicating error path code.

Cc: Himanshu Madhani <hmadhani@marvell.com>
Cc: Giridhar Malavali <giridhar.malavali@qlogic.com>
Fixes: 6a03b4cd78 ("[SCSI] qla2xxx: Add char device to increase driver use count") # v2.6.35.
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Bart Van Assche 2019-04-04 12:44:46 -07:00 committed by Martin K. Petersen
parent 2c26348c4d
commit c794d24ec9

View File

@ -7329,8 +7329,7 @@ qla2x00_module_init(void)
/* Initialize target kmem_cache and mem_pools */ /* Initialize target kmem_cache and mem_pools */
ret = qlt_init(); ret = qlt_init();
if (ret < 0) { if (ret < 0) {
kmem_cache_destroy(srb_cachep); goto destroy_cache;
return ret;
} else if (ret > 0) { } else if (ret > 0) {
/* /*
* If initiator mode is explictly disabled by qlt_init(), * If initiator mode is explictly disabled by qlt_init(),
@ -7354,11 +7353,10 @@ qla2x00_module_init(void)
qla2xxx_transport_template = qla2xxx_transport_template =
fc_attach_transport(&qla2xxx_transport_functions); fc_attach_transport(&qla2xxx_transport_functions);
if (!qla2xxx_transport_template) { if (!qla2xxx_transport_template) {
kmem_cache_destroy(srb_cachep);
ql_log(ql_log_fatal, NULL, 0x0002, ql_log(ql_log_fatal, NULL, 0x0002,
"fc_attach_transport failed...Failing load!.\n"); "fc_attach_transport failed...Failing load!.\n");
qlt_exit(); ret = -ENODEV;
return -ENODEV; goto qlt_exit;
} }
apidev_major = register_chrdev(0, QLA2XXX_APIDEV, &apidev_fops); apidev_major = register_chrdev(0, QLA2XXX_APIDEV, &apidev_fops);
@ -7370,27 +7368,37 @@ qla2x00_module_init(void)
qla2xxx_transport_vport_template = qla2xxx_transport_vport_template =
fc_attach_transport(&qla2xxx_transport_vport_functions); fc_attach_transport(&qla2xxx_transport_vport_functions);
if (!qla2xxx_transport_vport_template) { if (!qla2xxx_transport_vport_template) {
kmem_cache_destroy(srb_cachep);
qlt_exit();
fc_release_transport(qla2xxx_transport_template);
ql_log(ql_log_fatal, NULL, 0x0004, ql_log(ql_log_fatal, NULL, 0x0004,
"fc_attach_transport vport failed...Failing load!.\n"); "fc_attach_transport vport failed...Failing load!.\n");
return -ENODEV; ret = -ENODEV;
goto unreg_chrdev;
} }
ql_log(ql_log_info, NULL, 0x0005, ql_log(ql_log_info, NULL, 0x0005,
"QLogic Fibre Channel HBA Driver: %s.\n", "QLogic Fibre Channel HBA Driver: %s.\n",
qla2x00_version_str); qla2x00_version_str);
ret = pci_register_driver(&qla2xxx_pci_driver); ret = pci_register_driver(&qla2xxx_pci_driver);
if (ret) { if (ret) {
kmem_cache_destroy(srb_cachep);
qlt_exit();
fc_release_transport(qla2xxx_transport_template);
fc_release_transport(qla2xxx_transport_vport_template);
ql_log(ql_log_fatal, NULL, 0x0006, ql_log(ql_log_fatal, NULL, 0x0006,
"pci_register_driver failed...ret=%d Failing load!.\n", "pci_register_driver failed...ret=%d Failing load!.\n",
ret); ret);
goto release_vport_transport;
} }
return ret; return ret;
release_vport_transport:
fc_release_transport(qla2xxx_transport_vport_template);
unreg_chrdev:
if (apidev_major >= 0)
unregister_chrdev(apidev_major, QLA2XXX_APIDEV);
fc_release_transport(qla2xxx_transport_template);
qlt_exit:
qlt_exit();
destroy_cache:
kmem_cache_destroy(srb_cachep);
return ret;
} }
/** /**