mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-15 23:14:31 +08:00
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:
parent
2c26348c4d
commit
c794d24ec9
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user