iscsi-target: Change iscsi_target_seq_pdu_list.c to honor MaxXmitDataSegmentLength
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>
This commit is contained in:
Родитель
1c417f39c1
Коммит
b094a4bd84
|
@ -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) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче