Commit a7a28504 authored by Andrew Vasquez's avatar Andrew Vasquez Committed by James Bottomley

[SCSI] qla2xxx: Correct vport-state management issues during ISP-ABORT.

* Use correct 'ha' to mark a device lost from ISR.
  I/Os will always be returned on the physical-HA.
  qla2x00_mark_device_lost() should be called with the HA bound
  to the fcport.
* Mark *all* devices lost during ISP-ABORT (bighammer).

These fixes correct issues discovered locally where during
link-perturbation and heavy vport-I/O fcport/rport states would
stray and an rport's scsi-target lost (timed-out).
Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 6390d1f3
...@@ -3251,6 +3251,7 @@ qla2x00_abort_isp(scsi_qla_host_t *ha) ...@@ -3251,6 +3251,7 @@ qla2x00_abort_isp(scsi_qla_host_t *ha)
{ {
int rval; int rval;
uint8_t status = 0; uint8_t status = 0;
scsi_qla_host_t *vha;
if (ha->flags.online) { if (ha->flags.online) {
ha->flags.online = 0; ha->flags.online = 0;
...@@ -3265,6 +3266,8 @@ qla2x00_abort_isp(scsi_qla_host_t *ha) ...@@ -3265,6 +3266,8 @@ qla2x00_abort_isp(scsi_qla_host_t *ha)
if (atomic_read(&ha->loop_state) != LOOP_DOWN) { if (atomic_read(&ha->loop_state) != LOOP_DOWN) {
atomic_set(&ha->loop_state, LOOP_DOWN); atomic_set(&ha->loop_state, LOOP_DOWN);
qla2x00_mark_all_devices_lost(ha, 0); qla2x00_mark_all_devices_lost(ha, 0);
list_for_each_entry(vha, &ha->vp_list, vp_list)
qla2x00_mark_all_devices_lost(vha, 0);
} else { } else {
if (!atomic_read(&ha->loop_down_timer)) if (!atomic_read(&ha->loop_down_timer))
atomic_set(&ha->loop_down_timer, atomic_set(&ha->loop_down_timer,
......
...@@ -1184,9 +1184,8 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) ...@@ -1184,9 +1184,8 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
atomic_read(&fcport->state))); atomic_read(&fcport->state)));
cp->result = DID_BUS_BUSY << 16; cp->result = DID_BUS_BUSY << 16;
if (atomic_read(&fcport->state) == FCS_ONLINE) { if (atomic_read(&fcport->state) == FCS_ONLINE)
qla2x00_mark_device_lost(ha, fcport, 1, 1); qla2x00_mark_device_lost(fcport->ha, fcport, 1, 1);
}
break; break;
case CS_RESET: case CS_RESET:
...@@ -1229,7 +1228,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) ...@@ -1229,7 +1228,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
/* Check to see if logout occurred. */ /* Check to see if logout occurred. */
if ((le16_to_cpu(sts->status_flags) & SF_LOGOUT_SENT)) if ((le16_to_cpu(sts->status_flags) & SF_LOGOUT_SENT))
qla2x00_mark_device_lost(ha, fcport, 1, 1); qla2x00_mark_device_lost(fcport->ha, fcport, 1, 1);
break; break;
default: default:
......
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