diff options
author | Mike Christie <michaelc@cs.wisc.edu> | 2007-12-13 13:43:32 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-01-11 19:28:38 -0500 |
commit | 9000bcd649b26aef4c35d2941f8a65f05bbb9ee1 (patch) | |
tree | 083baa69d22c295dfbc76127604efcda0894d871 /drivers/scsi/libiscsi.c | |
parent | bca1088a8194f4fc850b65ea4f324c15d47d3cc3 (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.c | 14 |
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 | } |