Honour MaxRecvDataSegmentLength from the target and split DATAOUT into

chunks of this size.
This commit is contained in:
Ronnie Sahlberg
2011-01-02 18:50:49 +11:00
parent d240e8b5aa
commit 502843d64a
+16 -1
View File
@@ -82,11 +82,17 @@ iscsi_scsi_response_cb(struct iscsi_context *iscsi, int status,
int int
iscsi_send_data_out(struct iscsi_context *iscsi, struct iscsi_pdu *cmd_pdu, iscsi_send_data_out(struct iscsi_context *iscsi, struct iscsi_pdu *cmd_pdu,
uint32_t offset, uint32_t len) uint32_t offset, uint32_t tot_len)
{ {
while (tot_len > 0) {
uint32_t len = tot_len;
struct iscsi_pdu *pdu; struct iscsi_pdu *pdu;
int flags; int flags;
if (len > iscsi->target_max_recv_data_segment_length) {
len = iscsi->target_max_recv_data_segment_length;
}
pdu = iscsi_allocate_pdu_with_itt_flags(iscsi, ISCSI_PDU_DATA_OUT, pdu = iscsi_allocate_pdu_with_itt_flags(iscsi, ISCSI_PDU_DATA_OUT,
ISCSI_PDU_NO_PDU, ISCSI_PDU_NO_PDU,
cmd_pdu->itt, cmd_pdu->itt,
@@ -100,9 +106,14 @@ iscsi_send_data_out(struct iscsi_context *iscsi, struct iscsi_pdu *cmd_pdu,
cmd_pdu->private_data); cmd_pdu->private_data);
iscsi_free_pdu(iscsi, cmd_pdu); iscsi_free_pdu(iscsi, cmd_pdu);
return -1; return -1;
} }
if (tot_len == len) {
flags = ISCSI_PDU_SCSI_FINAL; flags = ISCSI_PDU_SCSI_FINAL;
} else {
flags = 0;
}
/* flags */ /* flags */
iscsi_pdu_set_pduflags(pdu, flags); iscsi_pdu_set_pduflags(pdu, flags);
@@ -149,6 +160,10 @@ iscsi_send_data_out(struct iscsi_context *iscsi, struct iscsi_pdu *cmd_pdu,
iscsi_free_pdu(iscsi, pdu); iscsi_free_pdu(iscsi, pdu);
return -1; return -1;
} }
tot_len -= len;
offset += len;
}
return 0; return 0;
} }