mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-15 06:55:13 +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 */
|
||||
ret = qlt_init();
|
||||
if (ret < 0) {
|
||||
kmem_cache_destroy(srb_cachep);
|
||||
return ret;
|
||||
goto destroy_cache;
|
||||
} else if (ret > 0) {
|
||||
/*
|
||||
* If initiator mode is explictly disabled by qlt_init(),
|
||||
@ -7354,11 +7353,10 @@ qla2x00_module_init(void)
|
||||
qla2xxx_transport_template =
|
||||
fc_attach_transport(&qla2xxx_transport_functions);
|
||||
if (!qla2xxx_transport_template) {
|
||||
kmem_cache_destroy(srb_cachep);
|
||||
ql_log(ql_log_fatal, NULL, 0x0002,
|
||||
"fc_attach_transport failed...Failing load!.\n");
|
||||
qlt_exit();
|
||||
return -ENODEV;
|
||||
ret = -ENODEV;
|
||||
goto qlt_exit;
|
||||
}
|
||||
|
||||
apidev_major = register_chrdev(0, QLA2XXX_APIDEV, &apidev_fops);
|
||||
@ -7370,27 +7368,37 @@ qla2x00_module_init(void)
|
||||
qla2xxx_transport_vport_template =
|
||||
fc_attach_transport(&qla2xxx_transport_vport_functions);
|
||||
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,
|
||||
"fc_attach_transport vport failed...Failing load!.\n");
|
||||
return -ENODEV;
|
||||
ret = -ENODEV;
|
||||
goto unreg_chrdev;
|
||||
}
|
||||
ql_log(ql_log_info, NULL, 0x0005,
|
||||
"QLogic Fibre Channel HBA Driver: %s.\n",
|
||||
qla2x00_version_str);
|
||||
ret = pci_register_driver(&qla2xxx_pci_driver);
|
||||
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,
|
||||
"pci_register_driver failed...ret=%d Failing load!.\n",
|
||||
ret);
|
||||
goto release_vport_transport;
|
||||
}
|
||||
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