aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libiscsi.c
diff options
context:
space:
mode:
authorMike Christie <michaelc@cs.wisc.edu>2009-05-13 18:57:47 -0400
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2009-05-23 16:44:12 -0400
commit301e0f7e4d78e956c58b66888e134dbdb44ea28e (patch)
tree89e346f0cc6613629a08ef0f9385071e3d56449f /drivers/scsi/libiscsi.c
parent3bbaaad95fd38dedb7c66a601f14825b4e0c5a59 (diff)
[SCSI] libiscsi: don't let io sit in queue when session has failed
If the session is failed, but we have not yet fully transitioned to the recovery stage we were still queueuing IO. The idea is that for some failures we can recvover at the command level and still continue to execute other IO. Well, we never have added the recovery within a command code, so queueing up IO here just creates the possibility that it might time time out so this just has us requeue the IO the scsi layer for now. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/libiscsi.c')
-rw-r--r--drivers/scsi/libiscsi.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index a9d7e520e551..57eb3af40e96 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -1390,13 +1390,7 @@ int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
1390 goto fault; 1390 goto fault;
1391 } 1391 }
1392 1392
1393 /* 1393 if (session->state != ISCSI_STATE_LOGGED_IN) {
1394 * ISCSI_STATE_FAILED is a temp. state. The recovery
1395 * code will decide what is best to do with command queued
1396 * during this time
1397 */
1398 if (session->state != ISCSI_STATE_LOGGED_IN &&
1399 session->state != ISCSI_STATE_FAILED) {
1400 /* 1394 /*
1401 * to handle the race between when we set the recovery state 1395 * to handle the race between when we set the recovery state
1402 * and block the session we requeue here (commands could 1396 * and block the session we requeue here (commands could
@@ -1404,12 +1398,15 @@ int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
1404 * up because the block code is not locked) 1398 * up because the block code is not locked)
1405 */ 1399 */
1406 switch (session->state) { 1400 switch (session->state) {
1401 case ISCSI_STATE_FAILED:
1407 case ISCSI_STATE_IN_RECOVERY: 1402 case ISCSI_STATE_IN_RECOVERY:
1408 reason = FAILURE_SESSION_IN_RECOVERY; 1403 reason = FAILURE_SESSION_IN_RECOVERY;
1409 goto reject; 1404 sc->result = DID_IMM_RETRY << 16;
1405 break;
1410 case ISCSI_STATE_LOGGING_OUT: 1406 case ISCSI_STATE_LOGGING_OUT:
1411 reason = FAILURE_SESSION_LOGGING_OUT; 1407 reason = FAILURE_SESSION_LOGGING_OUT;
1412 goto reject; 1408 sc->result = DID_IMM_RETRY << 16;
1409 break;
1413 case ISCSI_STATE_RECOVERY_FAILED: 1410 case ISCSI_STATE_RECOVERY_FAILED:
1414 reason = FAILURE_SESSION_RECOVERY_TIMEOUT; 1411 reason = FAILURE_SESSION_RECOVERY_TIMEOUT;
1415 sc->result = DID_TRANSPORT_FAILFAST << 16; 1412 sc->result = DID_TRANSPORT_FAILFAST << 16;