Patchwork [3.5.y.z,extended,stable] Patch "tcm_qla2xxx: Fix residual for underrun commands that fail" has been added to staging queue

mail settings
Submitter Luis Henriques
Date June 25, 2013, 9:30 a.m.
Message ID <>
Download mbox | patch
Permalink /patch/254093/
State New
Headers show


Luis Henriques - June 25, 2013, 9:30 a.m.
This is a note to let you know that I have just added a patch titled

    tcm_qla2xxx: Fix residual for underrun commands that fail

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



From eaa52ae524012b52c44a7b939bbd66c27dd1d7e6 Mon Sep 17 00:00:00 2001
From: Roland Dreier <>
Date: Wed, 5 Jun 2013 09:54:17 -0700
Subject: [PATCH] tcm_qla2xxx: Fix residual for underrun commands that fail

commit b5aff3d2747bea08b386edd070941a45611ffe51 upstream.

Suppose an initiator sends a DATA IN command with an allocation length
shorter than the FC transfer length -- we get a target message like

    TARGET_CORE[qla2xxx]: Expected Transfer Length: 256 does not match SCSI CDB Length: 0 for SAM Opcode: 0x12

In that case, the target core adjusts the data_length and sets
se_cmd->residual_count for the underrun.  But now suppose that command
fails and we end up in tcm_qla2xxx_queue_status() -- that function
unconditionally overwrites residual_count with the already adjusted
data_length, and the initiator will burp with a message like

    qla2xxx [0000:00:06.0]-301d:0: Dropped frame(s) detected (0x100 of 0x100 bytes).

Fix this by adding on to the existing underflow residual count instead.

Signed-off-by: Roland Dreier <>
Cc: Giridhar Malavali <>
Cc: Chad Dupuis <>
Signed-off-by: Nicholas Bellinger <>
Signed-off-by: Luis Henriques <>
 drivers/scsi/qla2xxx/tcm_qla2xxx.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)



diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
index 6c864ea..9016350 100644
--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c
+++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
@@ -702,8 +702,12 @@  static int tcm_qla2xxx_queue_status(struct se_cmd *se_cmd)
 		 * For FCP_READ with CHECK_CONDITION status, clear cmd->bufflen
 		 * for qla_tgt_xmit_response LLD code
+		if (se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) {
+			se_cmd->se_cmd_flags &= ~SCF_OVERFLOW_BIT;
+			se_cmd->residual_count = 0;
+		}
 		se_cmd->se_cmd_flags |= SCF_UNDERFLOW_BIT;
-		se_cmd->residual_count = se_cmd->data_length;
+		se_cmd->residual_count += se_cmd->data_length;

 		cmd->bufflen = 0;