Commit 4c5d2df4 authored by Andrew Vasquez's avatar Andrew Vasquez Committed by James Bottomley

[PATCH] PATCH [6/15] qla2xxx: Track error-state of SBRs

Consistenly track the error-state of a failed SRB.
parent ae33fa86
...@@ -265,6 +265,10 @@ typedef struct srb { ...@@ -265,6 +265,10 @@ typedef struct srb {
/* Raw completion info for use by failover ? */ /* Raw completion info for use by failover ? */
uint8_t fo_retry_cnt; /* Retry count this request */ uint8_t fo_retry_cnt; /* Retry count this request */
uint8_t err_id; /* error id */ uint8_t err_id; /* error id */
#define SRB_ERR_PORT 1 /* Request failed -- "port down" */
#define SRB_ERR_LOOP 2 /* Request failed -- "loop down" */
#define SRB_ERR_DEVICE 3 /* Request failed -- "device error" */
#define SRB_ERR_OTHER 4
/* Segment/entries counts */ /* Segment/entries counts */
uint16_t req_cnt; /* !0 indicates counts determined */ uint16_t req_cnt; /* !0 indicates counts determined */
......
...@@ -1139,6 +1139,10 @@ qla2x00_status_entry(scsi_qla_host_t *ha, sts_entry_t *pkt) ...@@ -1139,6 +1139,10 @@ qla2x00_status_entry(scsi_qla_host_t *ha, sts_entry_t *pkt)
if ((sp->flags & SRB_IOCTL) || if ((sp->flags & SRB_IOCTL) ||
atomic_read(&fcport->state) == FCS_DEVICE_DEAD) { atomic_read(&fcport->state) == FCS_DEVICE_DEAD) {
cp->result = DID_NO_CONNECT << 16; cp->result = DID_NO_CONNECT << 16;
if (atomic_read(&ha->loop_state) == LOOP_DOWN)
sp->err_id = SRB_ERR_LOOP;
else
sp->err_id = SRB_ERR_PORT;
add_to_done_queue(ha, sp); add_to_done_queue(ha, sp);
} else { } else {
qla2x00_extend_timeout(cp, EXTEND_CMD_TIMEOUT); qla2x00_extend_timeout(cp, EXTEND_CMD_TIMEOUT);
......
...@@ -736,6 +736,7 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*fn)(struct scsi_cmnd *)) ...@@ -736,6 +736,7 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*fn)(struct scsi_cmnd *))
} }
sp->fo_retry_cnt = 0; sp->fo_retry_cnt = 0;
sp->err_id = 0;
/* Generate LU queue on bus, target, LUN */ /* Generate LU queue on bus, target, LUN */
b = cmd->device->channel; b = cmd->device->channel;
...@@ -755,6 +756,7 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*fn)(struct scsi_cmnd *)) ...@@ -755,6 +756,7 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*fn)(struct scsi_cmnd *))
if (l >= ha->max_luns) { if (l >= ha->max_luns) {
cmd->result = DID_NO_CONNECT << 16; cmd->result = DID_NO_CONNECT << 16;
sp->err_id = SRB_ERR_PORT;
spin_lock_irq(ha->host->host_lock); spin_lock_irq(ha->host->host_lock);
...@@ -801,6 +803,7 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*fn)(struct scsi_cmnd *)) ...@@ -801,6 +803,7 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*fn)(struct scsi_cmnd *))
ha->host_no,t,l)); ha->host_no,t,l));
cmd->result = DID_NO_CONNECT << 16; cmd->result = DID_NO_CONNECT << 16;
sp->err_id = SRB_ERR_PORT;
spin_lock_irq(ha->host->host_lock); spin_lock_irq(ha->host->host_lock);
...@@ -846,6 +849,11 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*fn)(struct scsi_cmnd *)) ...@@ -846,6 +849,11 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*fn)(struct scsi_cmnd *))
* processing * processing
*/ */
cmd->result = DID_NO_CONNECT << 16; cmd->result = DID_NO_CONNECT << 16;
if (atomic_read(&ha2->loop_state) == LOOP_DOWN)
sp->err_id = SRB_ERR_LOOP;
else
sp->err_id = SRB_ERR_PORT;
add_to_done_queue(ha, sp); add_to_done_queue(ha, sp);
if (!list_empty(&ha->done_queue)) if (!list_empty(&ha->done_queue))
qla2x00_done(ha); qla2x00_done(ha);
...@@ -3253,6 +3261,11 @@ qla2x00_do_dpc(void *data) ...@@ -3253,6 +3261,11 @@ qla2x00_do_dpc(void *data)
__del_from_retry_queue(ha, sp); __del_from_retry_queue(ha, sp);
sp->cmd->result = DID_NO_CONNECT << 16; sp->cmd->result = DID_NO_CONNECT << 16;
if (atomic_read(&fcport->ha->loop_state) ==
LOOP_DOWN)
sp->err_id = SRB_ERR_LOOP;
else
sp->err_id = SRB_ERR_PORT;
sp->cmd->host_scribble = sp->cmd->host_scribble =
(unsigned char *) NULL; (unsigned char *) NULL;
__add_to_done_queue(ha, sp); __add_to_done_queue(ha, sp);
...@@ -3940,6 +3953,10 @@ qla2x00_cmd_timeout(srb_t *sp) ...@@ -3940,6 +3953,10 @@ qla2x00_cmd_timeout(srb_t *sp)
if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD || if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD ||
atomic_read(&vis_ha->loop_state) == LOOP_DEAD) { atomic_read(&vis_ha->loop_state) == LOOP_DEAD) {
cmd->result = DID_NO_CONNECT << 16; cmd->result = DID_NO_CONNECT << 16;
if (atomic_read(&fcport->ha->loop_state) == LOOP_DOWN)
sp->err_id = SRB_ERR_LOOP;
else
sp->err_id = SRB_ERR_PORT;
} else { } else {
cmd->result = DID_BUS_BUSY << 16; cmd->result = DID_BUS_BUSY << 16;
} }
...@@ -3978,6 +3995,10 @@ qla2x00_cmd_timeout(srb_t *sp) ...@@ -3978,6 +3995,10 @@ qla2x00_cmd_timeout(srb_t *sp)
atomic_read(&dest_ha->loop_state) == LOOP_DEAD) { atomic_read(&dest_ha->loop_state) == LOOP_DEAD) {
qla2x00_extend_timeout(cmd, EXTEND_CMD_TIMEOUT); qla2x00_extend_timeout(cmd, EXTEND_CMD_TIMEOUT);
cmd->result = DID_NO_CONNECT << 16; cmd->result = DID_NO_CONNECT << 16;
if (atomic_read(&dest_ha->loop_state) == LOOP_DOWN)
sp->err_id = SRB_ERR_LOOP;
else
sp->err_id = SRB_ERR_PORT;
} else { } else {
cmd->result = DID_BUS_BUSY << 16; cmd->result = DID_BUS_BUSY << 16;
} }
...@@ -4237,20 +4258,16 @@ qla2x00_next(scsi_qla_host_t *vis_ha) ...@@ -4237,20 +4258,16 @@ qla2x00_next(scsi_qla_host_t *vis_ha)
/* If device is dead then send request back to OS */ /* If device is dead then send request back to OS */
if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD) { if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD) {
sp->cmd->result = DID_NO_CONNECT << 16; sp->cmd->result = DID_NO_CONNECT << 16;
if (atomic_read(&dest_ha->loop_state) == LOOP_DOWN)
if (!atomic_read(&dest_ha->loop_down_timer) && sp->err_id = SRB_ERR_LOOP;
atomic_read(&dest_ha->loop_state) == LOOP_DOWN) { else
sp->err_id = 2; sp->err_id = SRB_ERR_PORT;
} else {
sp->err_id = 1; DEBUG3(printk("scsi(%ld): loop/port is down - pid=%ld, "
} "sp=%p err_id=%d loopid=0x%x queued to dest HBA "
DEBUG3(printk("scsi(%ld): loop/port is down - " "scsi%ld.\n", dest_ha->host_no,
"pid=%ld, sp=%p loopid=0x%x queued to dest HBA " sp->cmd->serial_number, sp, sp->err_id,
"scsi%ld.\n",
dest_ha->host_no,
sp->cmd->serial_number, sp,
fcport->loop_id, dest_ha->host_no)); fcport->loop_id, dest_ha->host_no));
/* /*
* Initiate a failover - done routine will initiate. * Initiate a failover - done routine will initiate.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment