提交 9000bcd6 编写于 作者: M Mike Christie 提交者: James Bottomley

[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: NMike Christie <michaelc@cs.wisc.edu>
Signed-off-by: NJames Bottomley <James.Bottomley@HansenPartnership.com>
上级 bca1088a
...@@ -917,7 +917,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn) ...@@ -917,7 +917,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
conn->ctask = list_entry(conn->xmitqueue.next, conn->ctask = list_entry(conn->xmitqueue.next,
struct iscsi_cmd_task, running); struct iscsi_cmd_task, running);
if (conn->session->state == ISCSI_STATE_LOGGING_OUT) { if (conn->session->state == ISCSI_STATE_LOGGING_OUT) {
fail_command(conn, conn->ctask, DID_NO_CONNECT << 16); fail_command(conn, conn->ctask, DID_IMM_RETRY << 16);
continue; continue;
} }
if (iscsi_prep_scsi_cmd_pdu(conn->ctask)) { 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,21 +1024,19 @@ int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
* be entering our queuecommand while a block is starting * be entering our queuecommand while a block is starting
* up because the block code is not locked) * up because the block code is not locked)
*/ */
if (session->state == ISCSI_STATE_IN_RECOVERY) { switch (session->state) {
case ISCSI_STATE_IN_RECOVERY:
reason = FAILURE_SESSION_IN_RECOVERY; reason = FAILURE_SESSION_IN_RECOVERY;
goto reject; goto reject;
} case ISCSI_STATE_LOGGING_OUT:
reason = FAILURE_SESSION_LOGGING_OUT;
switch (session->state) { goto reject;
case ISCSI_STATE_RECOVERY_FAILED: case ISCSI_STATE_RECOVERY_FAILED:
reason = FAILURE_SESSION_RECOVERY_TIMEOUT; reason = FAILURE_SESSION_RECOVERY_TIMEOUT;
break; break;
case ISCSI_STATE_TERMINATE: case ISCSI_STATE_TERMINATE:
reason = FAILURE_SESSION_TERMINATE; reason = FAILURE_SESSION_TERMINATE;
break; break;
case ISCSI_STATE_LOGGING_OUT:
reason = FAILURE_SESSION_LOGGING_OUT;
break;
default: default:
reason = FAILURE_SESSION_FREED; reason = FAILURE_SESSION_FREED;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册