From: Nicholas Bellinger <n...@linux-iscsi.org>

This patch converts iscsi_target_seq_pdu_list.c code for DataSequenceInOrder=No 
+
DataPDUInOrder=No operation to honor the MaxXmitDataSegmentLength value
for iscsi_cmd->se_cmd.data_direction == DMA_TO_DEVICE cases.

Cc: Mike Christie <micha...@cs.wisc.edu>
Cc: Andy Grover <agro...@redhat.com>
Cc: Hannes Reinecke <h...@suse.de>
Cc: Roland Dreier <rol...@purestorage.com>
Signed-off-by: Nicholas Bellinger <n...@linux-iscsi.org>
---
 drivers/target/iscsi/iscsi_target_seq_pdu_list.c |   61 +++++++++++-----------
 1 files changed, 31 insertions(+), 30 deletions(-)

diff --git a/drivers/target/iscsi/iscsi_target_seq_pdu_list.c 
b/drivers/target/iscsi/iscsi_target_seq_pdu_list.c
index 85a306e..edb592a 100644
--- a/drivers/target/iscsi/iscsi_target_seq_pdu_list.c
+++ b/drivers/target/iscsi/iscsi_target_seq_pdu_list.c
@@ -219,8 +219,14 @@ static void iscsit_determine_counts_for_list(
        int check_immediate = 0;
        u32 burstlength = 0, offset = 0;
        u32 unsolicited_data_length = 0;
+       u32 mdsl;
        struct iscsi_conn *conn = cmd->conn;
 
+       if (cmd->se_cmd.data_direction == DMA_TO_DEVICE)
+               mdsl = cmd->conn->conn_ops->MaxXmitDataSegmentLength;
+       else
+               mdsl = cmd->conn->conn_ops->MaxRecvDataSegmentLength;
+
        if ((bl->type == PDULIST_IMMEDIATE) ||
            (bl->type == PDULIST_IMMEDIATE_AND_UNSOLICITED))
                check_immediate = 1;
@@ -243,14 +249,13 @@ static void iscsit_determine_counts_for_list(
                        continue;
                }
                if (unsolicited_data_length > 0) {
-                       if ((offset + conn->conn_ops->MaxRecvDataSegmentLength)
-                                       >= cmd->se_cmd.data_length) {
+                       if ((offset + mdsl) >= cmd->se_cmd.data_length) {
                                unsolicited_data_length -=
                                        (cmd->se_cmd.data_length - offset);
                                offset += (cmd->se_cmd.data_length - offset);
                                continue;
                        }
-                       if ((offset + conn->conn_ops->MaxRecvDataSegmentLength)
+                       if ((offset + mdsl)
                                        >= 
conn->sess->sess_ops->FirstBurstLength) {
                                unsolicited_data_length -=
                                        (conn->sess->sess_ops->FirstBurstLength 
-
@@ -262,17 +267,15 @@ static void iscsit_determine_counts_for_list(
                                continue;
                        }
 
-                       offset += conn->conn_ops->MaxRecvDataSegmentLength;
-                       unsolicited_data_length -=
-                               conn->conn_ops->MaxRecvDataSegmentLength;
+                       offset += mdsl;
+                       unsolicited_data_length -= mdsl;
                        continue;
                }
-               if ((offset + conn->conn_ops->MaxRecvDataSegmentLength) >=
-                    cmd->se_cmd.data_length) {
+               if ((offset + mdsl) >= cmd->se_cmd.data_length) {
                        offset += (cmd->se_cmd.data_length - offset);
                        continue;
                }
-               if ((burstlength + conn->conn_ops->MaxRecvDataSegmentLength) >=
+               if ((burstlength + mdsl) >=
                     conn->sess->sess_ops->MaxBurstLength) {
                        offset += (conn->sess->sess_ops->MaxBurstLength -
                                        burstlength);
@@ -281,8 +284,8 @@ static void iscsit_determine_counts_for_list(
                        continue;
                }
 
-               burstlength += conn->conn_ops->MaxRecvDataSegmentLength;
-               offset += conn->conn_ops->MaxRecvDataSegmentLength;
+               burstlength += mdsl;
+               offset += mdsl;
        }
 }
 
@@ -296,12 +299,17 @@ static int iscsit_do_build_pdu_and_seq_lists(
        struct iscsi_build_list *bl)
 {
        int check_immediate = 0, datapduinorder, datasequenceinorder;
-       u32 burstlength = 0, offset = 0, i = 0;
+       u32 burstlength = 0, offset = 0, i = 0, mdsl;
        u32 pdu_count = 0, seq_no = 0, unsolicited_data_length = 0;
        struct iscsi_conn *conn = cmd->conn;
        struct iscsi_pdu *pdu = cmd->pdu_list;
        struct iscsi_seq *seq = cmd->seq_list;
 
+       if (cmd->se_cmd.data_direction == DMA_TO_DEVICE)
+               mdsl = cmd->conn->conn_ops->MaxXmitDataSegmentLength;
+       else
+               mdsl = cmd->conn->conn_ops->MaxRecvDataSegmentLength;
+
        datapduinorder = conn->sess->sess_ops->DataPDUInOrder;
        datasequenceinorder = conn->sess->sess_ops->DataSequenceInOrder;
 
@@ -348,9 +356,7 @@ static int iscsit_do_build_pdu_and_seq_lists(
                        continue;
                }
                if (unsolicited_data_length > 0) {
-                       if ((offset +
-                            conn->conn_ops->MaxRecvDataSegmentLength) >=
-                            cmd->se_cmd.data_length) {
+                       if ((offset + mdsl) >= cmd->se_cmd.data_length) {
                                if (!datapduinorder) {
                                        pdu[i].type = PDUTYPE_UNSOLICITED;
                                        pdu[i].length =
@@ -367,8 +373,7 @@ static int iscsit_do_build_pdu_and_seq_lists(
                                offset += (cmd->se_cmd.data_length - offset);
                                continue;
                        }
-                       if ((offset +
-                            conn->conn_ops->MaxRecvDataSegmentLength) >=
+                       if ((offset + mdsl) >=
                                        conn->sess->sess_ops->FirstBurstLength) 
{
                                if (!datapduinorder) {
                                        pdu[i].type = PDUTYPE_UNSOLICITED;
@@ -396,17 +401,14 @@ static int iscsit_do_build_pdu_and_seq_lists(
 
                        if (!datapduinorder) {
                                pdu[i].type = PDUTYPE_UNSOLICITED;
-                               pdu[i++].length =
-                                    conn->conn_ops->MaxRecvDataSegmentLength;
+                               pdu[i++].length = mdsl;
                        }
-                       burstlength += conn->conn_ops->MaxRecvDataSegmentLength;
-                       offset += conn->conn_ops->MaxRecvDataSegmentLength;
-                       unsolicited_data_length -=
-                               conn->conn_ops->MaxRecvDataSegmentLength;
+                       burstlength += mdsl;
+                       offset += mdsl;
+                       unsolicited_data_length -= mdsl;
                        continue;
                }
-               if ((offset + conn->conn_ops->MaxRecvDataSegmentLength) >=
-                    cmd->se_cmd.data_length) {
+               if ((offset + mdsl) >= cmd->se_cmd.data_length) {
                        if (!datapduinorder) {
                                pdu[i].type = PDUTYPE_NORMAL;
                                pdu[i].length = (cmd->se_cmd.data_length - 
offset);
@@ -420,7 +422,7 @@ static int iscsit_do_build_pdu_and_seq_lists(
                        offset += (cmd->se_cmd.data_length - offset);
                        continue;
                }
-               if ((burstlength + conn->conn_ops->MaxRecvDataSegmentLength) >=
+               if ((burstlength + mdsl) >=
                     conn->sess->sess_ops->MaxBurstLength) {
                        if (!datapduinorder) {
                                pdu[i].type = PDUTYPE_NORMAL;
@@ -445,11 +447,10 @@ static int iscsit_do_build_pdu_and_seq_lists(
 
                if (!datapduinorder) {
                        pdu[i].type = PDUTYPE_NORMAL;
-                       pdu[i++].length =
-                               conn->conn_ops->MaxRecvDataSegmentLength;
+                       pdu[i++].length = mdsl;
                }
-               burstlength += conn->conn_ops->MaxRecvDataSegmentLength;
-               offset += conn->conn_ops->MaxRecvDataSegmentLength;
+               burstlength += mdsl;
+               offset += mdsl;
        }
 
        if (!datasequenceinorder) {
-- 
1.7.2.5

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to