diff --git a/lib/iscsi/conn.c b/lib/iscsi/conn.c index bf2ae4028..8c8bdca2a 100644 --- a/lib/iscsi/conn.c +++ b/lib/iscsi/conn.c @@ -778,7 +778,7 @@ iscsi_send_logout_request(struct spdk_iscsi_conn *conn) struct spdk_iscsi_pdu *rsp_pdu; struct iscsi_bhs_async *rsph; - rsp_pdu = spdk_get_pdu(); + rsp_pdu = spdk_get_pdu(conn); assert(rsp_pdu != NULL); rsph = (struct iscsi_bhs_async *)&rsp_pdu->bhs; @@ -1238,7 +1238,7 @@ iscsi_conn_send_nopin(struct spdk_iscsi_conn *conn) SPDK_DEBUGLOG(SPDK_LOG_ISCSI, "StatSN=%u, ExpCmdSN=%u, MaxCmdSN=%u\n", conn->StatSN, conn->sess->ExpCmdSN, conn->sess->MaxCmdSN); - rsp_pdu = spdk_get_pdu(); + rsp_pdu = spdk_get_pdu(conn); rsp = (struct iscsi_bhs_nop_in *) &rsp_pdu->bhs; rsp_pdu->data = NULL; /* diff --git a/lib/iscsi/iscsi.c b/lib/iscsi/iscsi.c index e0447dbb8..76646f7c2 100644 --- a/lib/iscsi/iscsi.c +++ b/lib/iscsi/iscsi.c @@ -260,7 +260,7 @@ iscsi_reject(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu, data_len += ISCSI_DIGEST_LEN; } - rsp_pdu = spdk_get_pdu(); + rsp_pdu = spdk_get_pdu(conn); if (rsp_pdu == NULL) { free(data); return -ENOMEM; @@ -2148,7 +2148,7 @@ iscsi_pdu_hdr_op_login(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu) return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR); } - rsp_pdu = spdk_get_pdu(); + rsp_pdu = spdk_get_pdu(conn); if (rsp_pdu == NULL) { return SPDK_ISCSI_CONNECTION_FATAL; } @@ -2371,7 +2371,7 @@ iscsi_pdu_payload_op_text(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *p SPDK_LOGDUMP(SPDK_LOG_ISCSI, "Negotiated Params", data, data_len); /* response PDU */ - rsp_pdu = spdk_get_pdu(); + rsp_pdu = spdk_get_pdu(conn); if (rsp_pdu == NULL) { spdk_iscsi_param_free(params); free(data); @@ -2491,7 +2491,7 @@ iscsi_pdu_hdr_op_logout(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu } /* response PDU */ - rsp_pdu = spdk_get_pdu(); + rsp_pdu = spdk_get_pdu(conn); if (rsp_pdu == NULL) { return SPDK_ISCSI_CONNECTION_FATAL; } @@ -2573,7 +2573,7 @@ iscsi_send_r2t(struct spdk_iscsi_conn *conn, uint64_t fmt_lun; /* R2T PDU */ - rsp_pdu = spdk_get_pdu(); + rsp_pdu = spdk_get_pdu(conn); if (rsp_pdu == NULL) { return SPDK_ISCSI_CONNECTION_FATAL; } @@ -2892,7 +2892,7 @@ iscsi_send_datain(struct spdk_iscsi_conn *conn, primary = spdk_iscsi_task_get_primary(task); /* DATA PDU */ - rsp_pdu = spdk_get_pdu(); + rsp_pdu = spdk_get_pdu(conn); rsph = (struct iscsi_bhs_data_in *)&rsp_pdu->bhs; rsp_pdu->data = task->scsi.iovs[0].iov_base + offset; rsp_pdu->data_buf_len = task->scsi.iovs[0].iov_len - offset; @@ -3127,7 +3127,7 @@ void spdk_iscsi_task_response(struct spdk_iscsi_conn *conn, } /* response PDU */ - rsp_pdu = spdk_get_pdu(); + rsp_pdu = spdk_get_pdu(conn); assert(rsp_pdu != NULL); rsph = (struct iscsi_bhs_scsi_resp *)&rsp_pdu->bhs; assert(task->scsi.sense_data_len <= sizeof(rsp_pdu->sense.data)); @@ -3471,7 +3471,7 @@ spdk_iscsi_task_mgmt_response(struct spdk_iscsi_conn *conn, reqh = (struct iscsi_bhs_task_req *)&task->pdu->bhs; /* response PDU */ - rsp_pdu = spdk_get_pdu(); + rsp_pdu = spdk_get_pdu(conn); rsph = (struct iscsi_bhs_task_resp *)&rsp_pdu->bhs; rsph->opcode = ISCSI_OP_TASK_RSP; rsph->flags |= 0x80; /* bit 0 default to 1 */ @@ -3802,7 +3802,7 @@ iscsi_pdu_payload_op_nopout(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu } /* response PDU */ - rsp_pdu = spdk_get_pdu(); + rsp_pdu = spdk_get_pdu(conn); if (rsp_pdu == NULL) { free(data); return SPDK_ISCSI_CONNECTION_FATAL; @@ -4470,7 +4470,7 @@ iscsi_pdu_hdr_handle(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu) * return response code 0x020b to initiator. * */ if (!conn->full_feature && conn->state == ISCSI_CONN_STATE_RUNNING) { - rsp_pdu = spdk_get_pdu(); + rsp_pdu = spdk_get_pdu(conn); if (rsp_pdu == NULL) { return SPDK_ISCSI_CONNECTION_FATAL; } @@ -4598,7 +4598,7 @@ iscsi_read_pdu(struct spdk_iscsi_conn *conn) case ISCSI_PDU_RECV_STATE_AWAIT_PDU_READY: assert(conn->pdu_in_progress == NULL); - conn->pdu_in_progress = spdk_get_pdu(); + conn->pdu_in_progress = spdk_get_pdu(conn); if (conn->pdu_in_progress == NULL) { return SPDK_ISCSI_CONNECTION_FATAL; } diff --git a/lib/iscsi/iscsi.h b/lib/iscsi/iscsi.h index 34791b25d..7cf4eb27e 100644 --- a/lib/iscsi/iscsi.h +++ b/lib/iscsi/iscsi.h @@ -183,6 +183,7 @@ struct spdk_iscsi_pdu { uint32_t data_buf_len; bool dif_insert_or_strip; struct spdk_dif_ctx dif_ctx; + struct spdk_iscsi_conn *conn; TAILQ_ENTRY(spdk_iscsi_pdu) tailq; @@ -432,7 +433,7 @@ uint32_t spdk_iscsi_pdu_calc_data_digest(struct spdk_iscsi_pdu *pdu); /* Memory management */ void spdk_put_pdu(struct spdk_iscsi_pdu *pdu); -struct spdk_iscsi_pdu *spdk_get_pdu(void); +struct spdk_iscsi_pdu *spdk_get_pdu(struct spdk_iscsi_conn *conn); int spdk_iscsi_conn_handle_queued_datain_tasks(struct spdk_iscsi_conn *conn); void spdk_iscsi_op_abort_task_set(struct spdk_iscsi_task *task, uint8_t function); diff --git a/lib/iscsi/iscsi_subsystem.c b/lib/iscsi/iscsi_subsystem.c index 528e48fd3..51e6a9847 100644 --- a/lib/iscsi/iscsi_subsystem.c +++ b/lib/iscsi/iscsi_subsystem.c @@ -310,10 +310,11 @@ void spdk_put_pdu(struct spdk_iscsi_pdu *pdu) } } -struct spdk_iscsi_pdu *spdk_get_pdu(void) +struct spdk_iscsi_pdu *spdk_get_pdu(struct spdk_iscsi_conn *conn) { struct spdk_iscsi_pdu *pdu; + assert(conn != NULL); pdu = spdk_mempool_get(g_spdk_iscsi.pdu_pool); if (!pdu) { SPDK_ERRLOG("Unable to get PDU\n"); @@ -323,6 +324,7 @@ struct spdk_iscsi_pdu *spdk_get_pdu(void) /* we do not want to zero out the last part of the structure reserved for AHS and sense data */ memset(pdu, 0, offsetof(struct spdk_iscsi_pdu, ahs)); pdu->ref = 1; + pdu->conn = conn; return pdu; } diff --git a/test/unit/lib/iscsi/common.c b/test/unit/lib/iscsi/common.c index 4ce3e46c2..206b7ad2b 100644 --- a/test/unit/lib/iscsi/common.c +++ b/test/unit/lib/iscsi/common.c @@ -95,10 +95,11 @@ spdk_put_pdu(struct spdk_iscsi_pdu *pdu) } struct spdk_iscsi_pdu * -spdk_get_pdu(void) +spdk_get_pdu(struct spdk_iscsi_conn *conn) { struct spdk_iscsi_pdu *pdu; + assert(conn != NULL); if (g_pdu_pool_is_empty) { return NULL; } @@ -110,6 +111,7 @@ spdk_get_pdu(void) memset(pdu, 0, offsetof(struct spdk_iscsi_pdu, ahs)); pdu->ref = 1; + pdu->conn = conn; return pdu; } diff --git a/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c b/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c index 02ee6fe9c..32372585c 100644 --- a/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c +++ b/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c @@ -271,8 +271,8 @@ maxburstlength_test(void) struct spdk_iscsi_pdu *response_pdu; int rc; - req_pdu = spdk_get_pdu(); - data_out_pdu = spdk_get_pdu(); + req_pdu = spdk_get_pdu(&conn); + data_out_pdu = spdk_get_pdu(&conn); sess.ExpCmdSN = 0; sess.MaxCmdSN = 64; @@ -370,7 +370,7 @@ underflow_for_read_transfer_test(void) dev.lun[0] = &lun; conn.dev = &dev; - pdu = spdk_get_pdu(); + pdu = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu != NULL); scsi_req = (struct iscsi_bhs_scsi_req *)&pdu->bhs; @@ -433,7 +433,7 @@ underflow_for_zero_read_transfer_test(void) dev.lun[0] = &lun; conn.dev = &dev; - pdu = spdk_get_pdu(); + pdu = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu != NULL); scsi_req = (struct iscsi_bhs_scsi_req *)&pdu->bhs; @@ -498,7 +498,7 @@ underflow_for_request_sense_test(void) dev.lun[0] = &lun; conn.dev = &dev; - pdu1 = spdk_get_pdu(); + pdu1 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu1 != NULL); scsi_req = (struct iscsi_bhs_scsi_req *)&pdu1->bhs; @@ -588,7 +588,7 @@ underflow_for_check_condition_test(void) dev.lun[0] = &lun; conn.dev = &dev; - pdu = spdk_get_pdu(); + pdu = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu != NULL); scsi_req = (struct iscsi_bhs_scsi_req *)&pdu->bhs; @@ -652,7 +652,7 @@ add_transfer_task_test(void) TAILQ_INIT(&conn.queued_r2t_tasks); TAILQ_INIT(&conn.active_r2t_tasks); - pdu = spdk_get_pdu(); + pdu = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu != NULL); pdu->data_segment_len = SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH; /* 64K */ @@ -729,7 +729,7 @@ get_transfer_task_test(void) conn.sess = &sess; TAILQ_INIT(&conn.active_r2t_tasks); - pdu1 = spdk_get_pdu(); + pdu1 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu1 != NULL); pdu1->data_segment_len = SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH; @@ -739,7 +739,7 @@ get_transfer_task_test(void) rc = add_transfer_task(&conn, &task1); CU_ASSERT(rc == 0); - pdu2 = spdk_get_pdu(); + pdu2 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu2 != NULL); pdu2->data_segment_len = SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH; @@ -786,7 +786,7 @@ del_transfer_task_test(void) TAILQ_INIT(&conn.active_r2t_tasks); TAILQ_INIT(&conn.queued_r2t_tasks); - pdu1 = spdk_get_pdu(); + pdu1 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu1 != NULL); pdu1->data_segment_len = SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH; @@ -797,7 +797,7 @@ del_transfer_task_test(void) rc = add_transfer_task(&conn, &task1); CU_ASSERT(rc == 0); - pdu2 = spdk_get_pdu(); + pdu2 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu2 != NULL); pdu2->data_segment_len = SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH; @@ -808,7 +808,7 @@ del_transfer_task_test(void) rc = add_transfer_task(&conn, &task2); CU_ASSERT(rc == 0); - pdu3 = spdk_get_pdu(); + pdu3 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu3 != NULL); pdu3->data_segment_len = SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH; @@ -819,7 +819,7 @@ del_transfer_task_test(void) rc = add_transfer_task(&conn, &task3); CU_ASSERT(rc == 0); - pdu4 = spdk_get_pdu(); + pdu4 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu4 != NULL); pdu4->data_segment_len = SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH; @@ -830,7 +830,7 @@ del_transfer_task_test(void) rc = add_transfer_task(&conn, &task4); CU_ASSERT(rc == 0); - pdu5 = spdk_get_pdu(); + pdu5 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu5 != NULL); pdu5->data_segment_len = SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH; @@ -904,7 +904,7 @@ clear_all_transfer_tasks_test(void) task1 = spdk_iscsi_task_get(&conn, NULL, NULL); SPDK_CU_ASSERT_FATAL(task1 != NULL); - pdu1 = spdk_get_pdu(); + pdu1 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu1 != NULL); pdu1->data_segment_len = SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH; @@ -917,7 +917,7 @@ clear_all_transfer_tasks_test(void) rc = add_transfer_task(&conn, task1); CU_ASSERT(rc == 0); - mgmt_pdu1 = spdk_get_pdu(); + mgmt_pdu1 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(mgmt_pdu1 != NULL); mgmt_pdu1->cmd_sn = alloc_cmd_sn; @@ -925,7 +925,7 @@ clear_all_transfer_tasks_test(void) task2 = spdk_iscsi_task_get(&conn, NULL, NULL); SPDK_CU_ASSERT_FATAL(task2 != NULL); - pdu2 = spdk_get_pdu(); + pdu2 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu2 != NULL); pdu2->data_segment_len = SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH; @@ -940,7 +940,7 @@ clear_all_transfer_tasks_test(void) task3 = spdk_iscsi_task_get(&conn, NULL, NULL); SPDK_CU_ASSERT_FATAL(task3 != NULL); - pdu3 = spdk_get_pdu(); + pdu3 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu3 != NULL); pdu3->data_segment_len = SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH; @@ -955,7 +955,7 @@ clear_all_transfer_tasks_test(void) task4 = spdk_iscsi_task_get(&conn, NULL, NULL); SPDK_CU_ASSERT_FATAL(task4 != NULL); - pdu4 = spdk_get_pdu(); + pdu4 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu4 != NULL); pdu4->data_segment_len = SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH; @@ -970,7 +970,7 @@ clear_all_transfer_tasks_test(void) task5 = spdk_iscsi_task_get(&conn, NULL, NULL); SPDK_CU_ASSERT_FATAL(task5 != NULL); - pdu5 = spdk_get_pdu(); + pdu5 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu5 != NULL); pdu5->data_segment_len = SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH; @@ -983,7 +983,7 @@ clear_all_transfer_tasks_test(void) rc = add_transfer_task(&conn, task5); CU_ASSERT(rc == 0); - mgmt_pdu2 = spdk_get_pdu(); + mgmt_pdu2 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(mgmt_pdu2 != NULL); mgmt_pdu2->cmd_sn = alloc_cmd_sn; @@ -991,7 +991,7 @@ clear_all_transfer_tasks_test(void) task6 = spdk_iscsi_task_get(&conn, NULL, NULL); SPDK_CU_ASSERT_FATAL(task6 != NULL); - pdu6 = spdk_get_pdu(); + pdu6 = spdk_get_pdu(&conn); SPDK_CU_ASSERT_FATAL(pdu6 != NULL); pdu6->data_segment_len = SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH;