Skip to content

Commit

Permalink
[SCSI] qla4xxx: fix recovery timer and session unblock race
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Mike Christie authored and James Bottomley committed Feb 8, 2008
1 parent bd976f6 commit 568d303
Showing 1 changed file with 11 additions and 8 deletions.
19 changes: 11 additions & 8 deletions drivers/scsi/qla4xxx/ql4_os.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,16 +124,19 @@ static void qla4xxx_recovery_timedout(struct iscsi_cls_session *session)
struct ddb_entry *ddb_entry = session->dd_data;
struct scsi_qla_host *ha = ddb_entry->ha;

DEBUG2(printk("scsi%ld: %s: index [%d] port down retry count of (%d) "
"secs exhausted, marking device DEAD.\n", ha->host_no,
__func__, ddb_entry->fw_ddb_index,
ha->port_down_retry_count));
if (atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE) {
atomic_set(&ddb_entry->state, DDB_STATE_DEAD);

atomic_set(&ddb_entry->state, DDB_STATE_DEAD);
DEBUG2(printk("scsi%ld: %s: index [%d] port down retry count "
"of (%d) secs exhausted, marking device DEAD.\n",
ha->host_no, __func__, ddb_entry->fw_ddb_index,
ha->port_down_retry_count));

DEBUG2(printk("scsi%ld: %s: scheduling dpc routine - dpc flags = "
"0x%lx\n", ha->host_no, __func__, ha->dpc_flags));
queue_work(ha->dpc_thread, &ha->dpc_work);
DEBUG2(printk("scsi%ld: %s: scheduling dpc routine - dpc "
"flags = 0x%lx\n",
ha->host_no, __func__, ha->dpc_flags));
queue_work(ha->dpc_thread, &ha->dpc_work);
}
}

static int qla4xxx_host_get_param(struct Scsi_Host *shost,
Expand Down

0 comments on commit 568d303

Please sign in to comment.