Skip to content

Commit

Permalink
iscsi-target: Change iscsi_target_seq_pdu_list.c to honor MaxXmitData…
Browse files Browse the repository at this point in the history
…SegmentLength

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 <michaelc@cs.wisc.edu>
Cc: Andy Grover <agrover@redhat.com>
Cc: Hannes Reinecke <hare@suse.de>
Cc: Roland Dreier <roland@purestorage.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
  • Loading branch information
Nicholas Bellinger committed Oct 2, 2012
1 parent 1c417f3 commit b094a4b
Showing 1 changed file with 31 additions and 30 deletions.
61 changes: 31 additions & 30 deletions drivers/target/iscsi/iscsi_target_seq_pdu_list.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 -
Expand All @@ -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);
Expand All @@ -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;
}
}

Expand All @@ -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;

Expand Down Expand Up @@ -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 =
Expand All @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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;
Expand All @@ -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) {
Expand Down

0 comments on commit b094a4b

Please sign in to comment.