diff --git a/include/iscsi-private.h b/include/iscsi-private.h index 07b8ee5..68b4463 100644 --- a/include/iscsi-private.h +++ b/include/iscsi-private.h @@ -218,7 +218,8 @@ struct iscsi_pdu { struct iscsi_data outdata; /* Header for PDU to send */ uint32_t out_offset; /* Offset into data-out iovector */ - uint32_t out_len; /* Amount of data to sent */ + uint32_t out_len; /* Amount of data to sent starting at out_offset */ + uint32_t out_written; /* Number of bytes written to socket */ struct iscsi_data indata; diff --git a/lib/connect.c b/lib/connect.c index b36f5c9..0275b17 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -308,6 +308,7 @@ try_again: iscsi->statsn++; pdu->written = 0; + pdu->out_written = 0; iscsi_add_to_outqueue(iscsi, pdu); } @@ -341,6 +342,7 @@ try_again: iscsi->statsn++; pdu->written = 0; + pdu->out_written = 0; iscsi_add_to_outqueue(iscsi, pdu); } diff --git a/lib/socket.c b/lib/socket.c index 048802a..5a8ff60 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -517,11 +517,11 @@ iscsi_write_to_socket(struct iscsi_context *iscsi) } /* Write any iovectors that might have been passed to us */ - while (pdu->out_len > 0) { + while (pdu->out_written < pdu->out_len) { unsigned char *buf; - count = pdu->out_len; - buf = iscsi_get_user_out_buffer(iscsi, pdu, pdu->out_offset, &count); + count = pdu->out_len - pdu->out_written; + buf = iscsi_get_user_out_buffer(iscsi, pdu, pdu->out_offset + pdu->out_written, &count); if (buf == NULL) { iscsi_set_error(iscsi, "Can't find iovector data for DATA-OUT"); return -1; @@ -539,8 +539,7 @@ iscsi_write_to_socket(struct iscsi_context *iscsi) "socket :%d", errno); return -1; } - pdu->out_offset += count; - pdu->out_len -= count; + pdu->out_written += count; } if (pdu->written == total) {