Honour MaxRecvDataSegmentLength from the target and split DATAOUT into
chunks of this size.
This commit is contained in:
@@ -82,11 +82,17 @@ iscsi_scsi_response_cb(struct iscsi_context *iscsi, int status,
|
||||
|
||||
int
|
||||
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;
|
||||
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,
|
||||
ISCSI_PDU_NO_PDU,
|
||||
cmd_pdu->itt,
|
||||
@@ -100,9 +106,14 @@ iscsi_send_data_out(struct iscsi_context *iscsi, struct iscsi_pdu *cmd_pdu,
|
||||
cmd_pdu->private_data);
|
||||
iscsi_free_pdu(iscsi, cmd_pdu);
|
||||
return -1;
|
||||
|
||||
}
|
||||
|
||||
if (tot_len == len) {
|
||||
flags = ISCSI_PDU_SCSI_FINAL;
|
||||
} else {
|
||||
flags = 0;
|
||||
}
|
||||
|
||||
/* 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);
|
||||
return -1;
|
||||
}
|
||||
|
||||
tot_len -= len;
|
||||
offset += len;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user