diff --git a/include/iser-private.h b/include/iser-private.h index e167e06..bf30d8a 100644 --- a/include/iser-private.h +++ b/include/iser-private.h @@ -72,7 +72,8 @@ enum desc_type { enum data_dir{ DATA_WRITE = 0, - DATA_READ}; + DATA_READ, + DATA_NONE}; #define SHIFT_4K 12 #define SIZE_4K (1ULL << SHIFT_4K) diff --git a/lib/iser.c b/lib/iser.c index a927338..ed3b84f 100644 --- a/lib/iser.c +++ b/lib/iser.c @@ -908,7 +908,8 @@ iser_send_command(struct iser_conn *iser_conn, struct iser_pdu *iser_pdu) iscsi_set_error(iscsi, "error in prepare write cmd\n"); return -1; } - } + } else + iser_pdu->desc->data_dir = DATA_NONE; err = iser_post_send(iser_conn, tx_desc, true); if (err) @@ -1322,7 +1323,10 @@ iser_rcv_completion(struct iser_rx_desc *rx_desc, uint32_t itt = scsi_get_uint32(&in.hdr[16]); if (opcode == ISCSI_PDU_NOP_IN && itt == 0xffffffff) - goto nop_target; + goto no_waitpdu; + + if (opcode == ISCSI_PDU_ASYNC_MSG) + goto no_waitpdu; struct iscsi_pdu *iscsi_pdu; struct iser_pdu *iser_pdu; @@ -1355,7 +1359,7 @@ iser_rcv_completion(struct iser_rx_desc *rx_desc, } } -nop_target: +no_waitpdu: /* decrementing conn->post_recv_buf_count only --after-- freeing the * * task eliminates the need to worry on tasks which are completed in * * parallel to the execution of iser_conn_term. So the code that waits *