Handle ImmediateData=Yes correctly when sending data to the target.

We should not handle any combination of
ImmediateData=Yes/No
InitialR2T=Yes/No
correctly
This commit is contained in:
Ronnie Sahlberg
2011-01-02 19:49:45 +11:00
parent 20eaf85dd4
commit e7c24af75e

View File

@@ -245,22 +245,34 @@ iscsi_scsi_command_async(struct iscsi_context *iscsi, int lun,
iscsi_free_pdu(iscsi, pdu);
return -1;
}
if (iscsi->use_immediate_data == ISCSI_IMMEDIATE_DATA_NO) {
pdu->nidata.data = data.data;
pdu->nidata.size = data.size;
data.data = NULL;
data.size = 0;
}
/* Only add data to the out-pdu if we actually have some immediate data to attach */
if (data.size > 0) {
if (iscsi_pdu_add_data(iscsi, pdu, data.data, data.size)
/* Assume all data is non-immediate data */
pdu->nidata.data = data.data;
pdu->nidata.size = data.size;
/* Are we allowed to send immediate data ? */
if (iscsi->use_immediate_data == ISCSI_IMMEDIATE_DATA_YES) {
uint32_t len = data.size;
if (len > iscsi->target_max_recv_data_segment_length) {
len = iscsi->target_max_recv_data_segment_length;
}
if (iscsi_pdu_add_data(iscsi, pdu, data.data, len)
!= 0) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to "
"add outdata to the pdu.");
iscsi_free_pdu(iscsi, pdu);
return -1;
}
offset = len;
if (len == data.size) {
/* We managed to send it all as immediate data, so there is no non-immediate data left */
pdu->nidata.data = NULL;
pdu->nidata.size = 0;
}
}
if (pdu->nidata.size > 0 && iscsi->use_initial_r2t == ISCSI_INITIAL_R2T_NO) {