Skip to content

Commit 4454b66

Browse files
author
Nicholas Bellinger
committed
iscsi-target: Fix-up all zero data-length CDBs with R/W_BIT set
This patch changes special case handling for ISCSI_OP_SCSI_CMD where an initiator sends a zero length Expected Data Transfer Length (EDTL), but still sets the WRITE and/or READ flag bits when no payload transfer is requested. Many, many moons ago two special cases where added for an ancient version of ESX that has long since been fixed, so instead of adding a new special case for the reported bug with a Broadcom 57800 NIC, go ahead and always strip off the incorrect WRITE + READ flag bits. Also, avoid sending a reject here, as RFC-3720 does mandate this case be handled without protocol error. Reported-by: Witold Bazakbal <[email protected]> Tested-by: Witold Bazakbal <[email protected]> Cc: <[email protected]> #3.1+ Signed-off-by: Nicholas Bellinger <[email protected]>
1 parent a51d522 commit 4454b66

File tree

1 file changed

+12
-14
lines changed

1 file changed

+12
-14
lines changed

drivers/target/iscsi/iscsi_target.c

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -823,24 +823,22 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
823823
if (((hdr->flags & ISCSI_FLAG_CMD_READ) ||
824824
(hdr->flags & ISCSI_FLAG_CMD_WRITE)) && !hdr->data_length) {
825825
/*
826-
* Vmware ESX v3.0 uses a modified Cisco Initiator (v3.4.2)
827-
* that adds support for RESERVE/RELEASE. There is a bug
828-
* add with this new functionality that sets R/W bits when
829-
* neither CDB carries any READ or WRITE datapayloads.
826+
* From RFC-3720 Section 10.3.1:
827+
*
828+
* "Either or both of R and W MAY be 1 when either the
829+
* Expected Data Transfer Length and/or Bidirectional Read
830+
* Expected Data Transfer Length are 0"
831+
*
832+
* For this case, go ahead and clear the unnecssary bits
833+
* to avoid any confusion with ->data_direction.
830834
*/
831-
if ((hdr->cdb[0] == 0x16) || (hdr->cdb[0] == 0x17)) {
832-
hdr->flags &= ~ISCSI_FLAG_CMD_READ;
833-
hdr->flags &= ~ISCSI_FLAG_CMD_WRITE;
834-
goto done;
835-
}
835+
hdr->flags &= ~ISCSI_FLAG_CMD_READ;
836+
hdr->flags &= ~ISCSI_FLAG_CMD_WRITE;
836837

837-
pr_err("ISCSI_FLAG_CMD_READ or ISCSI_FLAG_CMD_WRITE"
838+
pr_warn("ISCSI_FLAG_CMD_READ or ISCSI_FLAG_CMD_WRITE"
838839
" set when Expected Data Transfer Length is 0 for"
839-
" CDB: 0x%02x. Bad iSCSI Initiator.\n", hdr->cdb[0]);
840-
return iscsit_add_reject_cmd(cmd,
841-
ISCSI_REASON_BOOKMARK_INVALID, buf);
840+
" CDB: 0x%02x, Fixing up flags\n", hdr->cdb[0]);
842841
}
843-
done:
844842

845843
if (!(hdr->flags & ISCSI_FLAG_CMD_READ) &&
846844
!(hdr->flags & ISCSI_FLAG_CMD_WRITE) && (hdr->data_length != 0)) {

0 commit comments

Comments
 (0)