Commit 07db5183 authored by Andrew Vasquez's avatar Andrew Vasquez Committed by James Bottomley

[SCSI] qla2xxx: Stall mid-layer error handlers while rport is blocked.

Stall error handler if attempting recovery while an rport is
blocked.  This avoids device offline scenarios due to errors in
the error handler.

Reference implementation from lpfc/mptfc.
Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent bb8ee499
...@@ -589,6 +589,23 @@ qla2x00_wait_for_loop_ready(scsi_qla_host_t *ha) ...@@ -589,6 +589,23 @@ qla2x00_wait_for_loop_ready(scsi_qla_host_t *ha)
return (return_status); return (return_status);
} }
static void
qla2x00_block_error_handler(struct scsi_cmnd *cmnd)
{
struct Scsi_Host *shost = cmnd->device->host;
struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device));
unsigned long flags;
spin_lock_irqsave(shost->host_lock, flags);
while (rport->port_state == FC_PORTSTATE_BLOCKED) {
spin_unlock_irqrestore(shost->host_lock, flags);
msleep(1000);
spin_lock_irqsave(shost->host_lock, flags);
}
spin_unlock_irqrestore(shost->host_lock, flags);
return;
}
/************************************************************************** /**************************************************************************
* qla2xxx_eh_abort * qla2xxx_eh_abort
* *
...@@ -615,6 +632,8 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) ...@@ -615,6 +632,8 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
unsigned long flags; unsigned long flags;
int wait = 0; int wait = 0;
qla2x00_block_error_handler(cmd);
if (!CMD_SP(cmd)) if (!CMD_SP(cmd))
return SUCCESS; return SUCCESS;
...@@ -748,6 +767,8 @@ qla2xxx_eh_device_reset(struct scsi_cmnd *cmd) ...@@ -748,6 +767,8 @@ qla2xxx_eh_device_reset(struct scsi_cmnd *cmd)
unsigned int id, lun; unsigned int id, lun;
unsigned long serial; unsigned long serial;
qla2x00_block_error_handler(cmd);
ret = FAILED; ret = FAILED;
id = cmd->device->id; id = cmd->device->id;
...@@ -877,6 +898,8 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) ...@@ -877,6 +898,8 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd)
unsigned int id, lun; unsigned int id, lun;
unsigned long serial; unsigned long serial;
qla2x00_block_error_handler(cmd);
ret = FAILED; ret = FAILED;
id = cmd->device->id; id = cmd->device->id;
...@@ -936,6 +959,8 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd) ...@@ -936,6 +959,8 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd)
unsigned int id, lun; unsigned int id, lun;
unsigned long serial; unsigned long serial;
qla2x00_block_error_handler(cmd);
ret = FAILED; ret = FAILED;
id = cmd->device->id; id = cmd->device->id;
......
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