aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSarang Radke <sarang.radke@qlogic.com>2011-12-06 05:34:10 -0500
committerJames Bottomley <JBottomley@Parallels.com>2011-12-15 01:57:41 -0500
commit8a288960192591c405767d98ebe372f66df1a6c6 (patch)
tree946f615f5fd90e5c6fe77252dd3ce3643e7b537b
parent9acf753393cde200e9d25574c6d7d2cf57636001 (diff)
[SCSI] qla4xxx: fix call trace on rmmod with ql4xdontresethba=1
abort all active commands from eh_host_reset in-case of ql4xdontresethba=1 Fix following call trace:- Nov 21 14:50:47 172.17.140.111 qla4xxx 0000:13:00.4: qla4_8xxx_disable_msix: qla4xxx (rsp_q) Nov 21 14:50:47 172.17.140.111 qla4xxx 0000:13:00.4: PCI INT A disabled Nov 21 14:50:47 172.17.140.111 slab error in kmem_cache_destroy(): cache `qla4xxx_srbs': Can't free all objects Nov 21 14:50:47 172.17.140.111 Pid: 9154, comm: rmmod Tainted: G O 3.2.0-rc2+ #2 Nov 21 14:50:47 172.17.140.111 Call Trace: Nov 21 14:50:47 172.17.140.111 [<c051231a>] ? kmem_cache_destroy+0x9a/0xb0 Nov 21 14:50:47 172.17.140.111 [<c0489c4a>] ? sys_delete_module+0x14a/0x210 Nov 21 14:50:47 172.17.140.111 [<c04fd552>] ? do_munmap+0x202/0x280 Nov 21 14:50:47 172.17.140.111 [<c04a6d4e>] ? audit_syscall_entry+0x1ae/0x1d0 Nov 21 14:50:47 172.17.140.111 [<c083019f>] ? sysenter_do_call+0x12/0x28 Nov 21 14:51:50 172.17.140.111 SLAB: cache with size 64 has lost its name Nov 21 14:51:50 172.17.140.111 iscsi: registered transport (qla4xxx) Nov 21 14:51:50 172.17.140.111 qla4xxx 0000:13:00.4: PCI INT A -> GSI 28 (level, low) -> IRQ 28 Signed-off-by: Sarang Radke <sarang.radke@qlogic.com> Signed-off-by: Vikas Chaudhary <vikas.chaudhary@qlogic.com> Reviewed-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
-rw-r--r--drivers/scsi/qla4xxx/ql4_os.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
index 4169c8baa112..dde539ca4b3d 100644
--- a/drivers/scsi/qla4xxx/ql4_os.c
+++ b/drivers/scsi/qla4xxx/ql4_os.c
@@ -2806,6 +2806,7 @@ dpc_post_reset_ha:
2806 **/ 2806 **/
2807static void qla4xxx_free_adapter(struct scsi_qla_host *ha) 2807static void qla4xxx_free_adapter(struct scsi_qla_host *ha)
2808{ 2808{
2809 qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16);
2809 2810
2810 if (test_bit(AF_INTERRUPTS_ON, &ha->flags)) { 2811 if (test_bit(AF_INTERRUPTS_ON, &ha->flags)) {
2811 /* Turn-off interrupts on the card. */ 2812 /* Turn-off interrupts on the card. */
@@ -4816,6 +4817,20 @@ static int qla4xxx_eh_target_reset(struct scsi_cmnd *cmd)
4816} 4817}
4817 4818
4818/** 4819/**
4820 * qla4xxx_is_eh_active - check if error handler is running
4821 * @shost: Pointer to SCSI Host struct
4822 *
4823 * This routine finds that if reset host is called in EH
4824 * scenario or from some application like sg_reset
4825 **/
4826static int qla4xxx_is_eh_active(struct Scsi_Host *shost)
4827{
4828 if (shost->shost_state == SHOST_RECOVERY)
4829 return 1;
4830 return 0;
4831}
4832
4833/**
4819 * qla4xxx_eh_host_reset - kernel callback 4834 * qla4xxx_eh_host_reset - kernel callback
4820 * @cmd: Pointer to Linux's SCSI command structure 4835 * @cmd: Pointer to Linux's SCSI command structure
4821 * 4836 *
@@ -4832,6 +4847,11 @@ static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd)
4832 if (ql4xdontresethba) { 4847 if (ql4xdontresethba) {
4833 DEBUG2(printk("scsi%ld: %s: Don't Reset HBA\n", 4848 DEBUG2(printk("scsi%ld: %s: Don't Reset HBA\n",
4834 ha->host_no, __func__)); 4849 ha->host_no, __func__));
4850
4851 /* Clear outstanding srb in queues */
4852 if (qla4xxx_is_eh_active(cmd->device->host))
4853 qla4xxx_abort_active_cmds(ha, DID_ABORT << 16);
4854
4835 return FAILED; 4855 return FAILED;
4836 } 4856 }
4837 4857