| @@ -603,33 +603,33 @@ initiator_get_targets(int target, strv_t | | | @@ -603,33 +603,33 @@ initiator_get_targets(int target, strv_t |
603 | } | | 603 | } |
604 | } | | 604 | } |
605 | | | 605 | |
606 | return 1; | | 606 | return 1; |
607 | } | | 607 | } |
608 | | | 608 | |
609 | | | 609 | |
610 | static int | | 610 | static int |
611 | discovery_phase(int target, strv_t *svp) | | 611 | discovery_phase(int target, strv_t *svp) |
612 | { | | 612 | { |
613 | initiator_session_t *sess; | | 613 | initiator_session_t *sess; |
614 | iscsi_parameter_value_t *vp; | | 614 | iscsi_parameter_value_t *vp; |
615 | iscsi_parameter_t *ip; | | 615 | iscsi_parameter_t *ip; |
| | | 616 | unsigned i; |
616 | char *ptr; | | 617 | char *ptr; |
617 | char *colon_ptr; | | 618 | char *colon_ptr; |
618 | char *comma_ptr; | | 619 | char *comma_ptr; |
619 | char port[64]; | | 620 | char port[64]; |
620 | char *text = NULL; | | 621 | char *text = NULL; |
621 | int text_len = 0; | | 622 | int text_len = 0; |
622 | int i; | | | |
623 | | | 623 | |
624 | if (target >= CONFIG_INITIATOR_NUM_TARGETS) { | | 624 | if (target >= CONFIG_INITIATOR_NUM_TARGETS) { |
625 | iscsi_trace_error(__FILE__, __LINE__, "target (%d) out of range [0..%d]\n", target, CONFIG_INITIATOR_NUM_TARGETS); | | 625 | iscsi_trace_error(__FILE__, __LINE__, "target (%d) out of range [0..%d]\n", target, CONFIG_INITIATOR_NUM_TARGETS); |
626 | return -1; | | 626 | return -1; |
627 | } | | 627 | } |
628 | sess = g_target[target].sess; | | 628 | sess = g_target[target].sess; |
629 | if ((text = iscsi_malloc_atomic(DISCOVERY_PHASE_TEXT_LEN)) == NULL) { | | 629 | if ((text = iscsi_malloc_atomic(DISCOVERY_PHASE_TEXT_LEN)) == NULL) { |
630 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_malloc_atomic() failed\n"); | | 630 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_malloc_atomic() failed\n"); |
631 | return -1; | | 631 | return -1; |
632 | } | | 632 | } |
633 | /* Login to target */ | | 633 | /* Login to target */ |
634 | | | 634 | |
635 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "entering Discovery login phase with target %d (sock %#x)\n", target, (int) sess->sock); | | 635 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "entering Discovery login phase with target %d (sock %#x)\n", target, (int) sess->sock); |
| @@ -1277,27 +1277,27 @@ tx_worker_proc_i(void *arg) | | | @@ -1277,27 +1277,27 @@ tx_worker_proc_i(void *arg) |
1277 | } | | 1277 | } |
1278 | /* Get initiator command */ | | 1278 | /* Get initiator command */ |
1279 | | | 1279 | |
1280 | if ((cmd = iscsi_queue_remove(&g_target[me->id].sess->tx_queue)) == NULL) { | | 1280 | if ((cmd = iscsi_queue_remove(&g_target[me->id].sess->tx_queue)) == NULL) { |
1281 | iscsi_trace_error(__FILE__, __LINE__, "tx_worker[%d]: iscsi_queue_remove() failed\n", me->id); | | 1281 | iscsi_trace_error(__FILE__, __LINE__, "tx_worker[%d]: iscsi_queue_remove() failed\n", me->id); |
1282 | ISCSI_UNLOCK(&me->work_mutex, return -1); | | 1282 | ISCSI_UNLOCK(&me->work_mutex, return -1); |
1283 | goto done; | | 1283 | goto done; |
1284 | } | | 1284 | } |
1285 | ISCSI_UNLOCK(&me->work_mutex, return -1); | | 1285 | ISCSI_UNLOCK(&me->work_mutex, return -1); |
1286 | iscsi_trace(TRACE_ISCSI_CMD, __FILE__, __LINE__, "tx_worker[%d]: dequeued initiator_cmd_t 0x%p (type %d, target %llu)\n", me->id, cmd, cmd->type, cmd->isid); | | 1286 | iscsi_trace(TRACE_ISCSI_CMD, __FILE__, __LINE__, "tx_worker[%d]: dequeued initiator_cmd_t 0x%p (type %d, target %llu)\n", me->id, cmd, cmd->type, cmd->isid); |
1287 | | | 1287 | |
1288 | /* Make sure we've got the right command */ | | 1288 | /* Make sure we've got the right command */ |
1289 | | | 1289 | |
1290 | if (cmd->isid != me->id) { | | 1290 | if (cmd->isid != (unsigned)me->id) { |
1291 | iscsi_trace_error(__FILE__, __LINE__, "got command %#x for target %llu, expected %d\n", cmd->type, cmd->isid, me->id); | | 1291 | iscsi_trace_error(__FILE__, __LINE__, "got command %#x for target %llu, expected %d\n", cmd->type, cmd->isid, me->id); |
1292 | goto done; | | 1292 | goto done; |
1293 | } | | 1293 | } |
1294 | /* | | 1294 | /* |
1295 | * Add to list of oustanding commands in session | | 1295 | * Add to list of oustanding commands in session |
1296 | * (unless NOP_OUT without ping) | | 1296 | * (unless NOP_OUT without ping) |
1297 | */ | | 1297 | */ |
1298 | | | 1298 | |
1299 | if (!((cmd->type == ISCSI_NOP_OUT) && (((iscsi_nop_out_args_t *) (cmd->ptr))->tag == 0xffffffff))) { | | 1299 | if (!((cmd->type == ISCSI_NOP_OUT) && (((iscsi_nop_out_args_t *) (cmd->ptr))->tag == 0xffffffff))) { |
1300 | cmd->next = NULL; | | 1300 | cmd->next = NULL; |
1301 | iscsi_spin_lock(&sess->cmds_spin); | | 1301 | iscsi_spin_lock(&sess->cmds_spin); |
1302 | for (ptr = sess->cmds; ((ptr) && (ptr->next != NULL)); ptr = ptr->next) { | | 1302 | for (ptr = sess->cmds; ((ptr) && (ptr->next != NULL)); ptr = ptr->next) { |
1303 | } | | 1303 | } |
| @@ -1569,27 +1569,27 @@ text_command_i(initiator_cmd_t * cmd) | | | @@ -1569,27 +1569,27 @@ text_command_i(initiator_cmd_t * cmd) |
1569 | if (hash_insert(&g_tag_hash, cmd, text_cmd->tag) != 0) { | | 1569 | if (hash_insert(&g_tag_hash, cmd, text_cmd->tag) != 0) { |
1570 | iscsi_trace_error(__FILE__, __LINE__, "hash_insert() failed\n"); | | 1570 | iscsi_trace_error(__FILE__, __LINE__, "hash_insert() failed\n"); |
1571 | return -1; | | 1571 | return -1; |
1572 | } | | 1572 | } |
1573 | /* Send text command PDU */ | | 1573 | /* Send text command PDU */ |
1574 | | | 1574 | |
1575 | text_cmd->ExpStatSN = sess->ExpStatSN; | | 1575 | text_cmd->ExpStatSN = sess->ExpStatSN; |
1576 | text_cmd->CmdSN = sess->CmdSN++; | | 1576 | text_cmd->CmdSN = sess->CmdSN++; |
1577 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "sending text command\n"); | | 1577 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "sending text command\n"); |
1578 | if (iscsi_text_cmd_encap(header, text_cmd) != 0) { | | 1578 | if (iscsi_text_cmd_encap(header, text_cmd) != 0) { |
1579 | iscsi_trace_error(__FILE__, __LINE__, "(iscsi_text_cmd_encap() failed\n"); | | 1579 | iscsi_trace_error(__FILE__, __LINE__, "(iscsi_text_cmd_encap() failed\n"); |
1580 | return -1; | | 1580 | return -1; |
1581 | } | | 1581 | } |
1582 | if (iscsi_sock_send_header_and_data(sess->sock, header, ISCSI_HEADER_LEN, text_cmd->text, text_cmd->length, 0) | | 1582 | if ((unsigned)iscsi_sock_send_header_and_data(sess->sock, header, ISCSI_HEADER_LEN, text_cmd->text, text_cmd->length, 0) |
1583 | != ISCSI_HEADER_LEN + text_cmd->length) { | | 1583 | != ISCSI_HEADER_LEN + text_cmd->length) { |
1584 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_send_header_and_data() failed.\n"); | | 1584 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_send_header_and_data() failed.\n"); |
1585 | return -1; | | 1585 | return -1; |
1586 | } | | 1586 | } |
1587 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "text command sent ok\n"); | | 1587 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "text command sent ok\n"); |
1588 | | | 1588 | |
1589 | return 0; | | 1589 | return 0; |
1590 | } | | 1590 | } |
1591 | | | 1591 | |
1592 | static int | | 1592 | static int |
1593 | login_command_i(initiator_cmd_t * cmd) | | 1593 | login_command_i(initiator_cmd_t * cmd) |
1594 | { | | 1594 | { |
1595 | iscsi_login_cmd_args_t *login_cmd = (iscsi_login_cmd_args_t *) cmd->ptr; | | 1595 | iscsi_login_cmd_args_t *login_cmd = (iscsi_login_cmd_args_t *) cmd->ptr; |
| @@ -1603,27 +1603,27 @@ login_command_i(initiator_cmd_t * cmd) | | | @@ -1603,27 +1603,27 @@ login_command_i(initiator_cmd_t * cmd) |
1603 | /* retreive the cmd ptr using the tag from the response PDU. */ | | 1603 | /* retreive the cmd ptr using the tag from the response PDU. */ |
1604 | | | 1604 | |
1605 | if (hash_insert(&g_tag_hash, cmd, login_cmd->tag) != 0) { | | 1605 | if (hash_insert(&g_tag_hash, cmd, login_cmd->tag) != 0) { |
1606 | iscsi_trace_error(__FILE__, __LINE__, "hash_insert() failed\n"); | | 1606 | iscsi_trace_error(__FILE__, __LINE__, "hash_insert() failed\n"); |
1607 | return -1; | | 1607 | return -1; |
1608 | } | | 1608 | } |
1609 | /* Send login command PDU */ | | 1609 | /* Send login command PDU */ |
1610 | login_cmd->ExpStatSN = sess->ExpStatSN; | | 1610 | login_cmd->ExpStatSN = sess->ExpStatSN; |
1611 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "sending login command\n"); | | 1611 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "sending login command\n"); |
1612 | if (iscsi_login_cmd_encap(header, login_cmd) != 0) { | | 1612 | if (iscsi_login_cmd_encap(header, login_cmd) != 0) { |
1613 | iscsi_trace_error(__FILE__, __LINE__, "(iscsi_login_cmd_encap() failed\n"); | | 1613 | iscsi_trace_error(__FILE__, __LINE__, "(iscsi_login_cmd_encap() failed\n"); |
1614 | return -1; | | 1614 | return -1; |
1615 | } | | 1615 | } |
1616 | if (iscsi_sock_send_header_and_data(sess->sock, header, ISCSI_HEADER_LEN, login_cmd->text, login_cmd->length, 0) | | 1616 | if ((unsigned)iscsi_sock_send_header_and_data(sess->sock, header, ISCSI_HEADER_LEN, login_cmd->text, login_cmd->length, 0) |
1617 | != ISCSI_HEADER_LEN + login_cmd->length) { | | 1617 | != ISCSI_HEADER_LEN + login_cmd->length) { |
1618 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_send_header_and_data() failed.\n"); | | 1618 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_send_header_and_data() failed.\n"); |
1619 | return -1; | | 1619 | return -1; |
1620 | } | | 1620 | } |
1621 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "login command sent ok\n"); | | 1621 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "login command sent ok\n"); |
1622 | | | 1622 | |
1623 | return 0; | | 1623 | return 0; |
1624 | } | | 1624 | } |
1625 | | | 1625 | |
1626 | static int | | 1626 | static int |
1627 | logout_phase_i(initiator_session_t * sess) | | 1627 | logout_phase_i(initiator_session_t * sess) |
1628 | { | | 1628 | { |
1629 | initiator_cmd_t *cmd = NULL; | | 1629 | initiator_cmd_t *cmd = NULL; |
| @@ -2317,32 +2317,32 @@ scsi_command_i(initiator_cmd_t * cmd) | | | @@ -2317,32 +2317,32 @@ scsi_command_i(initiator_cmd_t * cmd) |
2317 | if (modify_iov(&sg_copy, &sg_len_copy, 0, scsi_cmd->length) != 0) { | | 2317 | if (modify_iov(&sg_copy, &sg_len_copy, 0, scsi_cmd->length) != 0) { |
2318 | iscsi_trace_error(__FILE__, __LINE__, "modify_iov() failed\n"); | | 2318 | iscsi_trace_error(__FILE__, __LINE__, "modify_iov() failed\n"); |
2319 | goto error; | | 2319 | goto error; |
2320 | } | | 2320 | } |
2321 | if (scsi_cmd->ahs) { | | 2321 | if (scsi_cmd->ahs) { |
2322 | if (iscsi_sock_msg(sess->sock, 1, ISCSI_HEADER_LEN, header, 0) != ISCSI_HEADER_LEN) { | | 2322 | if (iscsi_sock_msg(sess->sock, 1, ISCSI_HEADER_LEN, header, 0) != ISCSI_HEADER_LEN) { |
2323 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); | | 2323 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); |
2324 | goto error; | | 2324 | goto error; |
2325 | } | | 2325 | } |
2326 | if (iscsi_sock_msg(sess->sock, 1, scsi_cmd->ahs_len, scsi_cmd->ahs, 0) != scsi_cmd->ahs_len) { | | 2326 | if (iscsi_sock_msg(sess->sock, 1, scsi_cmd->ahs_len, scsi_cmd->ahs, 0) != scsi_cmd->ahs_len) { |
2327 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); | | 2327 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); |
2328 | goto error; | | 2328 | goto error; |
2329 | } | | 2329 | } |
2330 | if (iscsi_sock_msg(sess->sock, 1, scsi_cmd->length, sg_copy, sg_len_copy) != scsi_cmd->length) { | | 2330 | if ((unsigned)iscsi_sock_msg(sess->sock, 1, scsi_cmd->length, sg_copy, sg_len_copy) != scsi_cmd->length) { |
2331 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); | | 2331 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); |
2332 | goto error; | | 2332 | goto error; |
2333 | } | | 2333 | } |
2334 | } else { | | 2334 | } else { |
2335 | if (iscsi_sock_send_header_and_data(sess->sock, header, ISCSI_HEADER_LEN, sg_copy, scsi_cmd->length, sg_len_copy) | | 2335 | if ((unsigned)iscsi_sock_send_header_and_data(sess->sock, header, ISCSI_HEADER_LEN, sg_copy, scsi_cmd->length, sg_len_copy) |
2336 | != ISCSI_HEADER_LEN + scsi_cmd->length) { | | 2336 | != ISCSI_HEADER_LEN + scsi_cmd->length) { |
2337 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_send_header_and_data() failed\n"); | | 2337 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_send_header_and_data() failed\n"); |
2338 | goto error; | | 2338 | goto error; |
2339 | } | | 2339 | } |
2340 | } | | 2340 | } |
2341 | scsi_cmd->bytes_sent += scsi_cmd->length; | | 2341 | scsi_cmd->bytes_sent += scsi_cmd->length; |
2342 | } else { | | 2342 | } else { |
2343 | if (iscsi_sock_msg(sess->sock, 1, ISCSI_HEADER_LEN, header, 0) != ISCSI_HEADER_LEN) { | | 2343 | if (iscsi_sock_msg(sess->sock, 1, ISCSI_HEADER_LEN, header, 0) != ISCSI_HEADER_LEN) { |
2344 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); | | 2344 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); |
2345 | goto error; | | 2345 | goto error; |
2346 | } | | 2346 | } |
2347 | if (scsi_cmd->ahs_len) { | | 2347 | if (scsi_cmd->ahs_len) { |
2348 | if (iscsi_sock_msg(sess->sock, 1, scsi_cmd->ahs_len, scsi_cmd->ahs, 0) != scsi_cmd->ahs_len) { | | 2348 | if (iscsi_sock_msg(sess->sock, 1, scsi_cmd->ahs_len, scsi_cmd->ahs, 0) != scsi_cmd->ahs_len) { |
| @@ -2439,27 +2439,27 @@ scsi_command_i(initiator_cmd_t * cmd) | | | @@ -2439,27 +2439,27 @@ scsi_command_i(initiator_cmd_t * cmd) |
2439 | | | 2439 | |
2440 | /* | | 2440 | /* |
2441 | * Data was not fragmented; use the original | | 2441 | * Data was not fragmented; use the original |
2442 | * iovec. | | 2442 | * iovec. |
2443 | */ | | 2443 | */ |
2444 | | | 2444 | |
2445 | sg_which = sg; | | 2445 | sg_which = sg; |
2446 | sg_len_which = sg_len; | | 2446 | sg_len_which = sg_len; |
2447 | } | | 2447 | } |
2448 | | | 2448 | |
2449 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "sending write data PDU (offset %u, len %u, sg_len %u)\n", | | 2449 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "sending write data PDU (offset %u, len %u, sg_len %u)\n", |
2450 | data.offset, data.length, sg_len_which); | | 2450 | data.offset, data.length, sg_len_which); |
2451 | | | 2451 | |
2452 | if (iscsi_sock_send_header_and_data(sess->sock, header, ISCSI_HEADER_LEN, sg_which, data.length, sg_len_which) | | 2452 | if ((unsigned)iscsi_sock_send_header_and_data(sess->sock, header, ISCSI_HEADER_LEN, sg_which, data.length, sg_len_which) |
2453 | != ISCSI_HEADER_LEN + data.length) { | | 2453 | != ISCSI_HEADER_LEN + data.length) { |
2454 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_send_header_and_data() failed\n"); | | 2454 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_send_header_and_data() failed\n"); |
2455 | goto error; | | 2455 | goto error; |
2456 | } | | 2456 | } |
2457 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "sent write data PDU (offset %u, len %u)\n", data.offset, data.length); | | 2457 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "sent write data PDU (offset %u, len %u)\n", data.offset, data.length); |
2458 | scsi_cmd->bytes_sent += data.length; | | 2458 | scsi_cmd->bytes_sent += data.length; |
2459 | } while ((scsi_cmd->bytes_sent < scsi_cmd->trans_len) | | 2459 | } while ((scsi_cmd->bytes_sent < scsi_cmd->trans_len) |
2460 | && ((scsi_cmd->bytes_sent < sess->sess_params.first_burst_length) | | 2460 | && ((scsi_cmd->bytes_sent < sess->sess_params.first_burst_length) |
2461 | || (!sess->sess_params.first_burst_length))); | | 2461 | || (!sess->sess_params.first_burst_length))); |
2462 | if (scsi_cmd->trans_len - scsi_cmd->bytes_sent) { | | 2462 | if (scsi_cmd->trans_len - scsi_cmd->bytes_sent) { |
2463 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "REACHED FIRST BURST\n"); | | 2463 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "REACHED FIRST BURST\n"); |
2464 | } | | 2464 | } |
2465 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "successfully sent %u of %u bytes write data\n", scsi_cmd->bytes_sent, scsi_cmd->trans_len); | | 2465 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "successfully sent %u of %u bytes write data\n", scsi_cmd->bytes_sent, scsi_cmd->trans_len); |
| @@ -2546,27 +2546,27 @@ async_msg_i(initiator_session_t * sess, | | | @@ -2546,27 +2546,27 @@ async_msg_i(initiator_session_t * sess, |
2546 | } | | 2546 | } |
2547 | sess->CmdSN = msg.ExpCmdSN; | | 2547 | sess->CmdSN = msg.ExpCmdSN; |
2548 | sess->MaxCmdSN = msg.MaxCmdSN; | | 2548 | sess->MaxCmdSN = msg.MaxCmdSN; |
2549 | sess->ExpStatSN = msg.StatSN + 1; | | 2549 | sess->ExpStatSN = msg.StatSN + 1; |
2550 | | | 2550 | |
2551 | /* Read Sense Data */ | | 2551 | /* Read Sense Data */ |
2552 | if (msg.length) { | | 2552 | if (msg.length) { |
2553 | uint8_t *sense_data = NULL; | | 2553 | uint8_t *sense_data = NULL; |
2554 | if ((sense_data = iscsi_malloc(msg.length)) == NULL) { | | 2554 | if ((sense_data = iscsi_malloc(msg.length)) == NULL) { |
2555 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_malloc() failed\n"); | | 2555 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_malloc() failed\n"); |
2556 | return -1; | | 2556 | return -1; |
2557 | } | | 2557 | } |
2558 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "reading %d bytes sense data \n", msg.length); | | 2558 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "reading %d bytes sense data \n", msg.length); |
2559 | if (iscsi_sock_msg(sess->sock, 0, msg.length, sense_data, 0) != msg.length) { | | 2559 | if ((unsigned)iscsi_sock_msg(sess->sock, 0, msg.length, sense_data, 0) != msg.length) { |
2560 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); | | 2560 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); |
2561 | if (sense_data != NULL) | | 2561 | if (sense_data != NULL) |
2562 | iscsi_free(sense_data); | | 2562 | iscsi_free(sense_data); |
2563 | return -1; | | 2563 | return -1; |
2564 | } | | 2564 | } |
2565 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "read %d bytes sense data ok (currently discarding)\n", msg.length); | | 2565 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "read %d bytes sense data ok (currently discarding)\n", msg.length); |
2566 | if (sense_data != NULL) | | 2566 | if (sense_data != NULL) |
2567 | iscsi_free(sense_data); | | 2567 | iscsi_free(sense_data); |
2568 | } else { | | 2568 | } else { |
2569 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "no sense data available\n"); | | 2569 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "no sense data available\n"); |
2570 | } | | 2570 | } |
2571 | | | 2571 | |
2572 | switch (msg.AsyncEvent) { | | 2572 | switch (msg.AsyncEvent) { |
| @@ -2589,48 +2589,48 @@ async_msg_i(initiator_session_t * sess, | | | @@ -2589,48 +2589,48 @@ async_msg_i(initiator_session_t * sess, |
2589 | default: | | 2589 | default: |
2590 | break; | | 2590 | break; |
2591 | } | | 2591 | } |
2592 | | | 2592 | |
2593 | return 0; | | 2593 | return 0; |
2594 | } | | 2594 | } |
2595 | | | 2595 | |
2596 | static int | | 2596 | static int |
2597 | nop_in_i(initiator_session_t * sess, initiator_cmd_t * cmd, uint8_t *header) | | 2597 | nop_in_i(initiator_session_t * sess, initiator_cmd_t * cmd, uint8_t *header) |
2598 | { | | 2598 | { |
2599 | iscsi_nop_out_args_t *nop_out = NULL; | | 2599 | iscsi_nop_out_args_t *nop_out = NULL; |
2600 | iscsi_nop_in_args_t nop_in; | | 2600 | iscsi_nop_in_args_t nop_in; |
2601 | uint8_t *ping_data = NULL; | | 2601 | uint8_t *ping_data = NULL; |
2602 | int i; | | 2602 | unsigned i; |
2603 | | | 2603 | |
2604 | if (cmd) { | | 2604 | if (cmd) { |
2605 | nop_out = (iscsi_nop_out_args_t *) cmd->ptr; | | 2605 | nop_out = (iscsi_nop_out_args_t *) cmd->ptr; |
2606 | } else { | | 2606 | } else { |
2607 | iscsi_trace_error(__FILE__, __LINE__, "no initiator_cmd_t associated with this NOP_IN\n"); | | 2607 | iscsi_trace_error(__FILE__, __LINE__, "no initiator_cmd_t associated with this NOP_IN\n"); |
2608 | } | | 2608 | } |
2609 | if (iscsi_nop_in_decap(header, &nop_in) != 0) { | | 2609 | if (iscsi_nop_in_decap(header, &nop_in) != 0) { |
2610 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_nop_in() failed\n"); | | 2610 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_nop_in() failed\n"); |
2611 | return -1; | | 2611 | return -1; |
2612 | } | | 2612 | } |
2613 | if (cmd) | | 2613 | if (cmd) |
2614 | RETURN_NOT_EQUAL("nop_in.length", nop_in.length, nop_out->length, NO_CLEANUP, -1); | | 2614 | RETURN_NOT_EQUAL("nop_in.length", nop_in.length, nop_out->length, NO_CLEANUP, -1); |
2615 | if (nop_in.length) { | | 2615 | if (nop_in.length) { |
2616 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "reading %d bytes ping data\n", nop_in.length); | | 2616 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "reading %d bytes ping data\n", nop_in.length); |
2617 | if ((ping_data = iscsi_malloc_atomic(nop_in.length)) == NULL) { | | 2617 | if ((ping_data = iscsi_malloc_atomic(nop_in.length)) == NULL) { |
2618 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_malloc_atomic() failed\n"); | | 2618 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_malloc_atomic() failed\n"); |
2619 | return -1; | | 2619 | return -1; |
2620 | } | | 2620 | } |
2621 | #define NOI_CLEANUP {if (ping_data) iscsi_free_atomic(ping_data);} | | 2621 | #define NOI_CLEANUP {if (ping_data) iscsi_free_atomic(ping_data);} |
2622 | #define NOI_ERROR {NOI_CLEANUP; return -1;} | | 2622 | #define NOI_ERROR {NOI_CLEANUP; return -1;} |
2623 | if (iscsi_sock_msg(sess->sock, 0, nop_in.length, ping_data, 0) != nop_in.length) { | | 2623 | if ((unsigned)iscsi_sock_msg(sess->sock, 0, nop_in.length, ping_data, 0) != nop_in.length) { |
2624 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); | | 2624 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); |
2625 | NOI_ERROR; | | 2625 | NOI_ERROR; |
2626 | } | | 2626 | } |
2627 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "successfully read %d bytes ping data\n", nop_in.length); | | 2627 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "successfully read %d bytes ping data\n", nop_in.length); |
2628 | if (cmd) { | | 2628 | if (cmd) { |
2629 | for (i = 0; i < nop_in.length; i++) { | | 2629 | for (i = 0; i < nop_in.length; i++) { |
2630 | if (nop_out->data[i] != ping_data[i]) { | | 2630 | if (nop_out->data[i] != ping_data[i]) { |
2631 | iscsi_trace_error(__FILE__, __LINE__, "Bad ping data[%d]. Got %#x, expected %#x\n", i, ping_data[i], nop_out->data[i]); | | 2631 | iscsi_trace_error(__FILE__, __LINE__, "Bad ping data[%d]. Got %#x, expected %#x\n", i, ping_data[i], nop_out->data[i]); |
2632 | NOI_ERROR; | | 2632 | NOI_ERROR; |
2633 | } | | 2633 | } |
2634 | } | | 2634 | } |
2635 | } | | 2635 | } |
2636 | } | | 2636 | } |
| @@ -2644,27 +2644,27 @@ nop_in_i(initiator_session_t * sess, ini | | | @@ -2644,27 +2644,27 @@ nop_in_i(initiator_session_t * sess, ini |
2644 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "sending %d byte ping response\n", nop_in.length); | | 2644 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "sending %d byte ping response\n", nop_in.length); |
2645 | (void) memset(&nop_out_args, 0x0, sizeof(nop_out_args)); | | 2645 | (void) memset(&nop_out_args, 0x0, sizeof(nop_out_args)); |
2646 | nop_out_args.tag = 0xffffffff; | | 2646 | nop_out_args.tag = 0xffffffff; |
2647 | nop_out_args.immediate = 0x40; | | 2647 | nop_out_args.immediate = 0x40; |
2648 | nop_out_args.transfer_tag = nop_in.transfer_tag; | | 2648 | nop_out_args.transfer_tag = nop_in.transfer_tag; |
2649 | nop_out_args.length = nop_in.length; | | 2649 | nop_out_args.length = nop_in.length; |
2650 | nop_out_args.lun = nop_in.lun; | | 2650 | nop_out_args.lun = nop_in.lun; |
2651 | nop_out_args.ExpStatSN = sess->ExpStatSN; | | 2651 | nop_out_args.ExpStatSN = sess->ExpStatSN; |
2652 | nop_out_args.CmdSN = sess->CmdSN; | | 2652 | nop_out_args.CmdSN = sess->CmdSN; |
2653 | if (iscsi_nop_out_encap(nop_header, &nop_out_args) != 0) { | | 2653 | if (iscsi_nop_out_encap(nop_header, &nop_out_args) != 0) { |
2654 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_nop_out_encap() failed\n"); | | 2654 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_nop_out_encap() failed\n"); |
2655 | NOI_ERROR; | | 2655 | NOI_ERROR; |
2656 | } | | 2656 | } |
2657 | if (iscsi_sock_send_header_and_data(sess->sock, nop_header, nop_out_args.length, ping_data, nop_in.length, 0) != nop_in.length) { | | 2657 | if ((unsigned)iscsi_sock_send_header_and_data(sess->sock, nop_header, nop_out_args.length, ping_data, nop_in.length, 0) != nop_in.length) { |
2658 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); | | 2658 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); |
2659 | NOI_ERROR; | | 2659 | NOI_ERROR; |
2660 | } | | 2660 | } |
2661 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "successfully sent %d byte ping response\n", nop_in.length); | | 2661 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "successfully sent %d byte ping response\n", nop_in.length); |
2662 | } | | 2662 | } |
2663 | NOI_CLEANUP; | | 2663 | NOI_CLEANUP; |
2664 | /* Check and update numbering */ | | 2664 | /* Check and update numbering */ |
2665 | sess->ExpStatSN = nop_in.StatSN + 1; | | 2665 | sess->ExpStatSN = nop_in.StatSN + 1; |
2666 | /* | | 2666 | /* |
2667 | * RETURN_NOT_EQUAL("StatSN", nop_in.StatSN, sess->ExpStatSN++, | | 2667 | * RETURN_NOT_EQUAL("StatSN", nop_in.StatSN, sess->ExpStatSN++, |
2668 | * NO_CLEANUP, -1); | | 2668 | * NO_CLEANUP, -1); |
2669 | */ | | 2669 | */ |
2670 | sess->CmdSN = nop_in.ExpCmdSN; | | 2670 | sess->CmdSN = nop_in.ExpCmdSN; |
| @@ -2809,27 +2809,27 @@ scsi_r2t_i(initiator_session_t * sess, i | | | @@ -2809,27 +2809,27 @@ scsi_r2t_i(initiator_session_t * sess, i |
2809 | FF_CLEANUP; | | 2809 | FF_CLEANUP; |
2810 | return -1; | | 2810 | return -1; |
2811 | } | | 2811 | } |
2812 | sg_which = sg_copy; | | 2812 | sg_which = sg_copy; |
2813 | sg_len_which = sg_len_copy; | | 2813 | sg_len_which = sg_len_copy; |
2814 | } else { | | 2814 | } else { |
2815 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "using original iovec for R2T transfer (offset %u, length %u)\n", | | 2815 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "using original iovec for R2T transfer (offset %u, length %u)\n", |
2816 | r2t.offset, r2t.length); | | 2816 | r2t.offset, r2t.length); |
2817 | sg_which = sg; | | 2817 | sg_which = sg; |
2818 | sg_len_which = sg_len; | | 2818 | sg_len_which = sg_len; |
2819 | } | | 2819 | } |
2820 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "sending R2T write data PDU (offset %u, len %u, sg_len %u)\n", | | 2820 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "sending R2T write data PDU (offset %u, len %u, sg_len %u)\n", |
2821 | data.offset, data.length, sg_len_which); | | 2821 | data.offset, data.length, sg_len_which); |
2822 | if (iscsi_sock_send_header_and_data(sess->sock, header, ISCSI_HEADER_LEN, sg_which, data.length, sg_len_which) | | 2822 | if ((unsigned)iscsi_sock_send_header_and_data(sess->sock, header, ISCSI_HEADER_LEN, sg_which, data.length, sg_len_which) |
2823 | != ISCSI_HEADER_LEN + data.length) { | | 2823 | != ISCSI_HEADER_LEN + data.length) { |
2824 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_send_header_and_data() failed\n"); | | 2824 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_send_header_and_data() failed\n"); |
2825 | FF_CLEANUP; | | 2825 | FF_CLEANUP; |
2826 | return -1; | | 2826 | return -1; |
2827 | } | | 2827 | } |
2828 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "sent write data PDU OK (offset %u, len %u)\n", data.offset, data.length); | | 2828 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "sent write data PDU OK (offset %u, len %u)\n", data.offset, data.length); |
2829 | bytes_sent += data.length; | | 2829 | bytes_sent += data.length; |
2830 | scsi_cmd->bytes_sent += data.length; | | 2830 | scsi_cmd->bytes_sent += data.length; |
2831 | } while (bytes_sent < r2t.length); | | 2831 | } while (bytes_sent < r2t.length); |
2832 | FF_CLEANUP; | | 2832 | FF_CLEANUP; |
2833 | if (hash_insert(&g_tag_hash, cmd, scsi_cmd->tag) != 0) { | | 2833 | if (hash_insert(&g_tag_hash, cmd, scsi_cmd->tag) != 0) { |
2834 | iscsi_trace_error(__FILE__, __LINE__, "hash_insert() failed\n"); | | 2834 | iscsi_trace_error(__FILE__, __LINE__, "hash_insert() failed\n"); |
2835 | return -1; | | 2835 | return -1; |
| @@ -2899,27 +2899,27 @@ scsi_response_i(initiator_session_t * se | | | @@ -2899,27 +2899,27 @@ scsi_response_i(initiator_session_t * se |
2899 | } else if (scsi_cmd->input) { | | 2899 | } else if (scsi_cmd->input) { |
2900 | | | 2900 | |
2901 | | | 2901 | |
2902 | } | | 2902 | } |
2903 | } else if (scsi_rsp.length) { | | 2903 | } else if (scsi_rsp.length) { |
2904 | uint8_t *sense_data = NULL; | | 2904 | uint8_t *sense_data = NULL; |
2905 | | | 2905 | |
2906 | if ((sense_data = iscsi_malloc(scsi_rsp.length)) == NULL) { | | 2906 | if ((sense_data = iscsi_malloc(scsi_rsp.length)) == NULL) { |
2907 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_malloc() failed\n"); | | 2907 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_malloc() failed\n"); |
2908 | return -1; | | 2908 | return -1; |
2909 | } | | 2909 | } |
2910 | iscsi_trace_error(__FILE__, __LINE__, "reading %d bytes sense data (recv_sg_len %u)\n", | | 2910 | iscsi_trace_error(__FILE__, __LINE__, "reading %d bytes sense data (recv_sg_len %u)\n", |
2911 | scsi_rsp.length, scsi_cmd->recv_sg_len); | | 2911 | scsi_rsp.length, scsi_cmd->recv_sg_len); |
2912 | if (iscsi_sock_msg(sess->sock, 0, scsi_rsp.length, sense_data, 0) != scsi_rsp.length) { | | 2912 | if ((unsigned)iscsi_sock_msg(sess->sock, 0, scsi_rsp.length, sense_data, 0) != scsi_rsp.length) { |
2913 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); | | 2913 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); |
2914 | if (sense_data != NULL) | | 2914 | if (sense_data != NULL) |
2915 | iscsi_free(sense_data); | | 2915 | iscsi_free(sense_data); |
2916 | return -1; | | 2916 | return -1; |
2917 | } | | 2917 | } |
2918 | iscsi_trace_error(__FILE__, __LINE__, "read %d bytes sense data ok (currently discarding)\n", scsi_rsp.length); | | 2918 | iscsi_trace_error(__FILE__, __LINE__, "read %d bytes sense data ok (currently discarding)\n", scsi_rsp.length); |
2919 | if (sense_data != NULL) | | 2919 | if (sense_data != NULL) |
2920 | iscsi_free(sense_data); | | 2920 | iscsi_free(sense_data); |
2921 | } else { | | 2921 | } else { |
2922 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "no sense data available\n"); | | 2922 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "no sense data available\n"); |
2923 | } | | 2923 | } |
2924 | | | 2924 | |
2925 | /* Check and update numbering */ | | 2925 | /* Check and update numbering */ |
| @@ -3041,39 +3041,39 @@ scsi_read_data_i(initiator_session_t * s | | | @@ -3041,39 +3041,39 @@ scsi_read_data_i(initiator_session_t * s |
3041 | total_len = 0; | | 3041 | total_len = 0; |
3042 | for (i = 0; i < sg_len; i++) { | | 3042 | for (i = 0; i < sg_len; i++) { |
3043 | total_len += sg[i].iov_len; | | 3043 | total_len += sg[i].iov_len; |
3044 | if (total_len >= data.length) { | | 3044 | if (total_len >= data.length) { |
3045 | break; | | 3045 | break; |
3046 | } | | 3046 | } |
3047 | } | | 3047 | } |
3048 | sg[i].iov_len -= (total_len - data.length); | | 3048 | sg[i].iov_len -= (total_len - data.length); |
3049 | sg_len = i + 1; | | 3049 | sg_len = i + 1; |
3050 | } else { | | 3050 | } else { |
3051 | sg = (struct iovec *) scsi_cmd->recv_data; | | 3051 | sg = (struct iovec *) scsi_cmd->recv_data; |
3052 | } | | 3052 | } |
3053 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "reading %d bytes into sg buffer (total offset %u)\n", data.length, data.offset); | | 3053 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "reading %d bytes into sg buffer (total offset %u)\n", data.length, data.offset); |
3054 | if ((rc = iscsi_sock_msg(sess->sock, 0, data.length, (uint8_t *) sg, sg_len)) != data.length) { | | 3054 | if ((rc = iscsi_sock_msg(sess->sock, 0, data.length, (uint8_t *) sg, sg_len)) != (int)data.length) { |
3055 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed: got %u, expected %u\n", rc, data.length); | | 3055 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed: got %u, expected %u\n", rc, data.length); |
3056 | if (sg_orig) | | 3056 | if (sg_orig) |
3057 | iscsi_free_atomic(sg_orig); | | 3057 | iscsi_free_atomic(sg_orig); |
3058 | return -1; | | 3058 | return -1; |
3059 | } | | 3059 | } |
3060 | scsi_cmd->bytes_recv += data.length; | | 3060 | scsi_cmd->bytes_recv += data.length; |
3061 | if (sg_orig) | | 3061 | if (sg_orig) |
3062 | iscsi_free_atomic(sg_orig); | | 3062 | iscsi_free_atomic(sg_orig); |
3063 | } else { | | 3063 | } else { |
3064 | if (data.length) { | | 3064 | if (data.length) { |
3065 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "reading %d bytes into dest buffer (offset %u)\n", data.length, data.offset); | | 3065 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "reading %d bytes into dest buffer (offset %u)\n", data.length, data.offset); |
3066 | if (iscsi_sock_msg(sess->sock, 0, data.length, scsi_cmd->recv_data + data.offset, 0) != data.length) { | | 3066 | if (iscsi_sock_msg(sess->sock, 0, data.length, scsi_cmd->recv_data + data.offset, 0) != (int)data.length) { |
3067 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); | | 3067 | iscsi_trace_error(__FILE__, __LINE__, "iscsi_sock_msg() failed\n"); |
3068 | return -1; | | 3068 | return -1; |
3069 | } | | 3069 | } |
3070 | scsi_cmd->bytes_recv += data.length; | | 3070 | scsi_cmd->bytes_recv += data.length; |
3071 | } | | 3071 | } |
3072 | } | | 3072 | } |
3073 | | | 3073 | |
3074 | | | 3074 | |
3075 | /* Check for status */ | | 3075 | /* Check for status */ |
3076 | | | 3076 | |
3077 | if (data.S_bit) { | | 3077 | if (data.S_bit) { |
3078 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "received status with final PDU\n"); | | 3078 | iscsi_trace(TRACE_ISCSI_DEBUG, __FILE__, __LINE__, "received status with final PDU\n"); |
3079 | RETURN_NOT_EQUAL("Final Bit", data.final, 1, NO_CLEANUP, -1); | | 3079 | RETURN_NOT_EQUAL("Final Bit", data.final, 1, NO_CLEANUP, -1); |