Merge pull request #144 from plieven/fix_unsolicited
iscsi-command: fix unsolicited data-out length
This commit is contained in:
@@ -33,6 +33,13 @@ extern "C" {
|
|||||||
#define discard_const(ptr) ((void *)((intptr_t)(ptr)))
|
#define discard_const(ptr) ((void *)((intptr_t)(ptr)))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef MIN
|
||||||
|
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
#ifndef MAX
|
||||||
|
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
|
||||||
#define ISCSI_RAW_HEADER_SIZE 48
|
#define ISCSI_RAW_HEADER_SIZE 48
|
||||||
#define ISCSI_DIGEST_SIZE 4
|
#define ISCSI_DIGEST_SIZE 4
|
||||||
|
|
||||||
|
|||||||
@@ -179,13 +179,9 @@ iscsi_create_context(const char *initiator_name)
|
|||||||
/* iscsi->smalloc_size is the size for small allocations. this should be
|
/* iscsi->smalloc_size is the size for small allocations. this should be
|
||||||
max(ISCSI_HEADER_SIZE, sizeof(struct iscsi_pdu), sizeof(struct iscsi_in_pdu))
|
max(ISCSI_HEADER_SIZE, sizeof(struct iscsi_pdu), sizeof(struct iscsi_in_pdu))
|
||||||
rounded up to the next power of 2. */
|
rounded up to the next power of 2. */
|
||||||
|
required = MAX(required, sizeof(struct iscsi_pdu));
|
||||||
|
required = MAX(required, sizeof(struct iscsi_in_pdu));
|
||||||
iscsi->smalloc_size = 1;
|
iscsi->smalloc_size = 1;
|
||||||
if (sizeof(struct iscsi_pdu) > required) {
|
|
||||||
required = sizeof(struct iscsi_pdu);
|
|
||||||
}
|
|
||||||
if (sizeof(struct iscsi_in_pdu) > required) {
|
|
||||||
required = sizeof(struct iscsi_in_pdu);
|
|
||||||
}
|
|
||||||
while (iscsi->smalloc_size < required) {
|
while (iscsi->smalloc_size < required) {
|
||||||
iscsi->smalloc_size <<= 1;
|
iscsi->smalloc_size <<= 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,9 +76,7 @@ iscsi_send_data_out(struct iscsi_context *iscsi, struct iscsi_pdu *cmd_pdu,
|
|||||||
struct iscsi_pdu *pdu;
|
struct iscsi_pdu *pdu;
|
||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
if (len > iscsi->target_max_recv_data_segment_length) {
|
len = MIN(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,
|
||||||
@@ -193,11 +191,8 @@ iscsi_timeout_scan(struct iscsi_context *iscsi)
|
|||||||
int
|
int
|
||||||
iscsi_send_unsolicited_data_out(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
|
iscsi_send_unsolicited_data_out(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
|
||||||
{
|
{
|
||||||
uint32_t len = pdu->expxferlen - pdu->payload_len;
|
uint32_t len = MIN(pdu->expxferlen, iscsi->first_burst_length) - pdu->payload_len;
|
||||||
|
|
||||||
if (len > iscsi->first_burst_length) {
|
|
||||||
len = iscsi->first_burst_length;
|
|
||||||
}
|
|
||||||
return iscsi_send_data_out(iscsi, pdu, 0xffffffff,
|
return iscsi_send_data_out(iscsi, pdu, 0xffffffff,
|
||||||
pdu->payload_len, len);
|
pdu->payload_len, len);
|
||||||
}
|
}
|
||||||
@@ -272,13 +267,8 @@ iscsi_scsi_command_async(struct iscsi_context *iscsi, int lun,
|
|||||||
if (iscsi->use_immediate_data == ISCSI_IMMEDIATE_DATA_YES) {
|
if (iscsi->use_immediate_data == ISCSI_IMMEDIATE_DATA_YES) {
|
||||||
uint32_t len = task->expxferlen;
|
uint32_t len = task->expxferlen;
|
||||||
|
|
||||||
if (len > iscsi->first_burst_length) {
|
len = MIN(len, iscsi->first_burst_length);
|
||||||
len = iscsi->first_burst_length;
|
len = MIN(len, iscsi->target_max_recv_data_segment_length);
|
||||||
}
|
|
||||||
|
|
||||||
if (len > iscsi->target_max_recv_data_segment_length) {
|
|
||||||
len = iscsi->target_max_recv_data_segment_length;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdu->payload_offset = 0;
|
pdu->payload_offset = 0;
|
||||||
pdu->payload_len = len;
|
pdu->payload_len = len;
|
||||||
|
|||||||
Reference in New Issue
Block a user