Skip to content

Commit

Permalink
[SCSI] qla2xxx: return SCSI_MLQUEUE_TARGET_BUSY when driver has detec…
Browse files Browse the repository at this point in the history
…ted rport error or race

If the fcport is not online then we do not want to block IO to all ports on
the host. We just want to stop IO on port not online, so we should be using
the SCSI_MLQUEUE_TARGET_BUSY return value.

For the case where we race with the rport memset initialization
we do not want the queuecommand to be called again so we can just use
SCSI_MLQUEUE_TARGET_BUSY for this.

Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Acked-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
  • Loading branch information
Mike Christie authored and James Bottomley committed Oct 13, 2008
1 parent c5e98e9 commit 7b59413
Showing 1 changed file with 12 additions and 14 deletions.
26 changes: 12 additions & 14 deletions drivers/scsi/qla2xxx/qla_os.c
Original file line number Diff line number Diff line change
Expand Up @@ -394,18 +394,16 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
}

/* Close window on fcport/rport state-transitioning. */
if (fcport->drport) {
cmd->result = DID_IMM_RETRY << 16;
goto qc_fail_command;
}
if (fcport->drport)
goto qc_target_busy;

if (atomic_read(&fcport->state) != FCS_ONLINE) {
if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD ||
atomic_read(&ha->loop_state) == LOOP_DEAD) {
cmd->result = DID_NO_CONNECT << 16;
goto qc_fail_command;
}
goto qc_host_busy;
goto qc_target_busy;
}

spin_unlock_irq(ha->host->host_lock);
Expand All @@ -428,10 +426,11 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))

qc_host_busy_lock:
spin_lock_irq(ha->host->host_lock);

qc_host_busy:
return SCSI_MLQUEUE_HOST_BUSY;

qc_target_busy:
return SCSI_MLQUEUE_TARGET_BUSY;

qc_fail_command:
done(cmd);

Expand Down Expand Up @@ -461,18 +460,16 @@ qla24xx_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
}

/* Close window on fcport/rport state-transitioning. */
if (fcport->drport) {
cmd->result = DID_IMM_RETRY << 16;
goto qc24_fail_command;
}
if (fcport->drport)
goto qc24_target_busy;

if (atomic_read(&fcport->state) != FCS_ONLINE) {
if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD ||
atomic_read(&pha->loop_state) == LOOP_DEAD) {
cmd->result = DID_NO_CONNECT << 16;
goto qc24_fail_command;
}
goto qc24_host_busy;
goto qc24_target_busy;
}

spin_unlock_irq(ha->host->host_lock);
Expand All @@ -495,10 +492,11 @@ qla24xx_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))

qc24_host_busy_lock:
spin_lock_irq(ha->host->host_lock);

qc24_host_busy:
return SCSI_MLQUEUE_HOST_BUSY;

qc24_target_busy:
return SCSI_MLQUEUE_TARGET_BUSY;

qc24_fail_command:
done(cmd);

Expand Down

0 comments on commit 7b59413

Please sign in to comment.