aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorMike Christie <michaelc@cs.wisc.edu>2008-01-31 14:36:47 -0500
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-02-07 19:02:35 -0500
commit568d303b5b3f0f6432ae8f56ecdb0beb2341288e (patch)
treee3f2b4220c121e1e6b0a168923a7419cb5010f82 /drivers/scsi
parentbd976f62cd6c6dda1ce57bf3e84447e94844868a (diff)
[SCSI] qla4xxx: fix recovery timer and session unblock race
If qla4xxx is resetting up a session and the recovery timer fires we do not want to just set it to dead, because the dpc thread could have just set it to online and is in the middle of resetting it up. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Cc: David Somayajulu <david.somayajulu@qlogic.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/qla4xxx/ql4_os.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
index 437d169a9814..d4dd149b466f 100644
--- a/drivers/scsi/qla4xxx/ql4_os.c
+++ b/drivers/scsi/qla4xxx/ql4_os.c
@@ -124,16 +124,19 @@ static void qla4xxx_recovery_timedout(struct iscsi_cls_session *session)
124 struct ddb_entry *ddb_entry = session->dd_data; 124 struct ddb_entry *ddb_entry = session->dd_data;
125 struct scsi_qla_host *ha = ddb_entry->ha; 125 struct scsi_qla_host *ha = ddb_entry->ha;
126 126
127 DEBUG2(printk("scsi%ld: %s: index [%d] port down retry count of (%d) " 127 if (atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE) {
128 "secs exhausted, marking device DEAD.\n", ha->host_no, 128 atomic_set(&ddb_entry->state, DDB_STATE_DEAD);
129 __func__, ddb_entry->fw_ddb_index,
130 ha->port_down_retry_count));
131 129
132 atomic_set(&ddb_entry->state, DDB_STATE_DEAD); 130 DEBUG2(printk("scsi%ld: %s: index [%d] port down retry count "
131 "of (%d) secs exhausted, marking device DEAD.\n",
132 ha->host_no, __func__, ddb_entry->fw_ddb_index,
133 ha->port_down_retry_count));
133 134
134 DEBUG2(printk("scsi%ld: %s: scheduling dpc routine - dpc flags = " 135 DEBUG2(printk("scsi%ld: %s: scheduling dpc routine - dpc "
135 "0x%lx\n", ha->host_no, __func__, ha->dpc_flags)); 136 "flags = 0x%lx\n",
136 queue_work(ha->dpc_thread, &ha->dpc_work); 137 ha->host_no, __func__, ha->dpc_flags));
138 queue_work(ha->dpc_thread, &ha->dpc_work);
139 }
137} 140}
138 141
139static int qla4xxx_host_get_param(struct Scsi_Host *shost, 142static int qla4xxx_host_get_param(struct Scsi_Host *shost,