aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libiscsi.c
diff options
context:
space:
mode:
authorMike Christie <michaelc@cs.wisc.edu>2007-12-13 13:43:32 -0500
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-01-11 19:28:38 -0500
commit9000bcd649b26aef4c35d2941f8a65f05bbb9ee1 (patch)
tree083baa69d22c295dfbc76127604efcda0894d871 /drivers/scsi/libiscsi.c
parentbca1088a8194f4fc850b65ea4f324c15d47d3cc3 (diff)
[SCSI] libiscsi: Do not fail commands immediately during logout
If the target requests a logout, then we do not want to fail commands to scsi-ml right away. This patch just fails in pending commands for a requeue immediately, and then lets iscsid handle running commands like normal recovery. 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.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index 96883614ba08..b17081bed128 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -917,7 +917,7 @@ check_mgmt:
917 conn->ctask = list_entry(conn->xmitqueue.next, 917 conn->ctask = list_entry(conn->xmitqueue.next,
918 struct iscsi_cmd_task, running); 918 struct iscsi_cmd_task, running);
919 if (conn->session->state == ISCSI_STATE_LOGGING_OUT) { 919 if (conn->session->state == ISCSI_STATE_LOGGING_OUT) {
920 fail_command(conn, conn->ctask, DID_NO_CONNECT << 16); 920 fail_command(conn, conn->ctask, DID_IMM_RETRY << 16);
921 continue; 921 continue;
922 } 922 }
923 if (iscsi_prep_scsi_cmd_pdu(conn->ctask)) { 923 if (iscsi_prep_scsi_cmd_pdu(conn->ctask)) {
@@ -1024,21 +1024,19 @@ int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
1024 * be entering our queuecommand while a block is starting 1024 * be entering our queuecommand while a block is starting
1025 * up because the block code is not locked) 1025 * up because the block code is not locked)
1026 */ 1026 */
1027 if (session->state == ISCSI_STATE_IN_RECOVERY) { 1027 switch (session->state) {
1028 case ISCSI_STATE_IN_RECOVERY:
1028 reason = FAILURE_SESSION_IN_RECOVERY; 1029 reason = FAILURE_SESSION_IN_RECOVERY;
1029 goto reject; 1030 goto reject;
1030 } 1031 case ISCSI_STATE_LOGGING_OUT:
1031 1032 reason = FAILURE_SESSION_LOGGING_OUT;
1032 switch (session->state) { 1033 goto reject;
1033 case ISCSI_STATE_RECOVERY_FAILED: 1034 case ISCSI_STATE_RECOVERY_FAILED:
1034 reason = FAILURE_SESSION_RECOVERY_TIMEOUT; 1035 reason = FAILURE_SESSION_RECOVERY_TIMEOUT;
1035 break; 1036 break;
1036 case ISCSI_STATE_TERMINATE: 1037 case ISCSI_STATE_TERMINATE:
1037 reason = FAILURE_SESSION_TERMINATE; 1038 reason = FAILURE_SESSION_TERMINATE;
1038 break; 1039 break;
1039 case ISCSI_STATE_LOGGING_OUT:
1040 reason = FAILURE_SESSION_LOGGING_OUT;
1041 break;
1042 default: 1040 default:
1043 reason = FAILURE_SESSION_FREED; 1041 reason = FAILURE_SESSION_FREED;
1044 } 1042 }