From fa123fc397a540b1c8311ecdb1a888fc46408354 Mon Sep 17 00:00:00 2001 From: Peter Lieven Date: Fri, 5 Aug 2016 11:28:43 +0200 Subject: [PATCH] abstract transport to static driver functions and opaque driver specific information. This splits a transport into static driver specific functions for the common iscsi commands. Optionally, a driver specific opaque memory is introduced which is currently only used by iSER transport. Last a lot of functions changed to static. Signed-off-by: Peter Lieven --- include/iscsi-private.h | 13 ++-- include/iser-private.h | 7 -- lib/connect.c | 16 ++-- lib/discovery.c | 4 +- lib/init.c | 31 +------- lib/iscsi-command.c | 12 +-- lib/iser.c | 161 +++++++++++++++++----------------------- lib/login.c | 52 ++++++------- lib/nop.c | 6 +- lib/pdu.c | 28 +++---- lib/socket.c | 41 +++++----- lib/task_mgmt.c | 2 +- 12 files changed, 159 insertions(+), 214 deletions(-) diff --git a/include/iscsi-private.h b/include/iscsi-private.h index 55ad5f2..b91af60 100644 --- a/include/iscsi-private.h +++ b/include/iscsi-private.h @@ -76,9 +76,10 @@ union socket_address { }; struct iscsi_context { - - struct iscsi_transport *t; + struct iscsi_transport *drv; + void *opaque; enum iscsi_transport_type transport; + char initiator_name[MAX_STRING_SIZE+1]; char target_name[MAX_STRING_SIZE+1]; char target_address[MAX_STRING_SIZE+1]; /* If a redirect */ @@ -393,7 +394,7 @@ int iscsi_service_reconnect_if_loggedin(struct iscsi_context *iscsi); void iscsi_dump_pdu_header(struct iscsi_context *iscsi, unsigned char *data); -struct iscsi_transport { +typedef struct iscsi_transport { int (*connect)(struct iscsi_context *iscsi, union socket_address *sa, int ai_family); int (*queue_pdu)(struct iscsi_context *iscsi, struct iscsi_pdu *pdu); struct iscsi_pdu* (*new_pdu)(struct iscsi_context *iscsi, size_t size); @@ -402,11 +403,7 @@ struct iscsi_transport { int (*service)(struct iscsi_context *iscsi, int revents); int (*get_fd)(struct iscsi_context *iscsi); int (*which_events)(struct iscsi_context *iscsi); -}; - -struct tcp_transport { - struct iscsi_transport t; -}; +} iscsi_transport; #ifdef __cplusplus } diff --git a/include/iser-private.h b/include/iser-private.h index 164ba2b..73749cb 100644 --- a/include/iser-private.h +++ b/include/iser-private.h @@ -202,13 +202,6 @@ struct iser_conn { struct iser_tx_desc *tx_desc; }; - -struct iser_transport { /* struct iser_conn */ - - struct iscsi_transport t; - struct iser_conn iser_conn; -}; - void iscsi_init_iser_transport(struct iscsi_context *iscsi); #endif /* __linux */ diff --git a/lib/connect.c b/lib/connect.c index d09f12d..7815973 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -277,7 +277,7 @@ void iscsi_defer_reconnect(struct iscsi_context *iscsi) pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); } while ((pdu = iscsi->waitpdu)) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); @@ -288,7 +288,7 @@ void iscsi_defer_reconnect(struct iscsi_context *iscsi) pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); } } @@ -332,7 +332,7 @@ void iscsi_reconnect_cb(struct iscsi_context *iscsi _U_, int status, ISCSI_LIST_REMOVE(&old_iscsi->waitpdu, pdu); if (pdu->itt == 0xffffffff) { - iscsi->t->free_pdu(old_iscsi, pdu); + iscsi->drv->free_pdu(old_iscsi, pdu); continue; } @@ -346,7 +346,7 @@ void iscsi_reconnect_cb(struct iscsi_context *iscsi _U_, int status, pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } - iscsi->t->free_pdu(old_iscsi, pdu); + iscsi->drv->free_pdu(old_iscsi, pdu); continue; } @@ -364,7 +364,7 @@ void iscsi_reconnect_cb(struct iscsi_context *iscsi _U_, int status, pdu->scsi_cbdata.private_data)) { /* not much we can really do at this point */ } - iscsi->t->free_pdu(old_iscsi, pdu); + iscsi->drv->free_pdu(old_iscsi, pdu); } if (old_iscsi->incoming != NULL) { @@ -375,12 +375,10 @@ void iscsi_reconnect_cb(struct iscsi_context *iscsi _U_, int status, } if (old_iscsi->outqueue_current != NULL && old_iscsi->outqueue_current->flags & ISCSI_PDU_DELETE_WHEN_SENT) { - iscsi->t->free_pdu(old_iscsi, old_iscsi->outqueue_current); + iscsi->drv->free_pdu(old_iscsi, old_iscsi->outqueue_current); } - if (old_iscsi->t) { - iscsi_free(old_iscsi, old_iscsi->t); - } + iscsi_free(old_iscsi, old_iscsi->opaque); for (i = 0; i < old_iscsi->smalloc_free; i++) { iscsi_free(old_iscsi, old_iscsi->smalloc_ptrs[i]); diff --git a/lib/discovery.c b/lib/discovery.c index 0fba3d8..a0b5550 100644 --- a/lib/discovery.c +++ b/lib/discovery.c @@ -73,7 +73,7 @@ iscsi_discovery_async(struct iscsi_context *iscsi, iscsi_command_cb cb, if (iscsi_pdu_add_data(iscsi, pdu, (unsigned char *)str, strlen(str)+1) != 0) { iscsi_set_error(iscsi, "Out-of-memory: pdu add data failed."); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } @@ -83,7 +83,7 @@ iscsi_discovery_async(struct iscsi_context *iscsi, iscsi_command_cb cb, if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi " "text pdu."); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } diff --git a/lib/init.c b/lib/init.c index ca4ff20..dfe3db0 100644 --- a/lib/init.c +++ b/lib/init.c @@ -48,35 +48,14 @@ int iscsi_init_transport(struct iscsi_context *iscsi, enum iscsi_transport_type transport) { - struct tcp_transport *tcp_transport; -#ifdef HAVE_LINUX_ISER - struct iser_transport *iser_transport; -#endif - - if (iscsi->t) { - iscsi_free(iscsi, iscsi->t); - iscsi->t = NULL; - } iscsi->transport = transport; switch (iscsi->transport) { case TCP_TRANSPORT: - tcp_transport = iscsi_malloc(iscsi, sizeof(struct tcp_transport)); - if (tcp_transport == NULL) { - iscsi_set_error(iscsi, "Couldn't allocate memory for transport\n"); - return -1; - } - iscsi->t = &tcp_transport->t; iscsi_init_tcp_transport(iscsi); break; #ifdef HAVE_LINUX_ISER case ISER_TRANSPORT: - iser_transport = iscsi_malloc(iscsi, sizeof(struct iser_transport)); - if (iser_transport == NULL) { - iscsi_set_error(iscsi, "Couldn't allocate memory for transport\n"); - return -1; - } - iscsi->t = &iser_transport->t; iscsi_init_iser_transport(iscsi); break; #endif @@ -371,7 +350,7 @@ iscsi_destroy_context(struct iscsi_context *iscsi) pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); } while ((pdu = iscsi->waitpdu)) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); @@ -382,11 +361,11 @@ iscsi_destroy_context(struct iscsi_context *iscsi) pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); } if (iscsi->outqueue_current != NULL && iscsi->outqueue_current->flags & ISCSI_PDU_DELETE_WHEN_SENT) { - iscsi->t->free_pdu(iscsi, iscsi->outqueue_current); + iscsi->drv->free_pdu(iscsi, iscsi->outqueue_current); } if (iscsi->incoming != NULL) { @@ -413,9 +392,7 @@ iscsi_destroy_context(struct iscsi_context *iscsi) iscsi_destroy_context(iscsi->old_iscsi); } - if (iscsi->t) { - iscsi_free(iscsi, iscsi->t); - } + iscsi_free(iscsi, iscsi->opaque); memset(iscsi, 0, sizeof(struct iscsi_context)); free(iscsi); diff --git a/lib/iscsi-command.c b/lib/iscsi-command.c index 82a8e25..b194aef 100644 --- a/lib/iscsi-command.c +++ b/lib/iscsi-command.c @@ -147,7 +147,7 @@ error: cmd_pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, cmd_pdu->private_data); } - iscsi->t->free_pdu(iscsi, cmd_pdu); + iscsi->drv->free_pdu(iscsi, cmd_pdu); return -1; } @@ -283,7 +283,7 @@ iscsi_scsi_command_async(struct iscsi_context *iscsi, int lun, if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi " "scsi pdu."); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } @@ -2579,7 +2579,7 @@ iscsi_scsi_cancel_task(struct iscsi_context *iscsi, pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return 0; } } @@ -2590,7 +2590,7 @@ iscsi_scsi_cancel_task(struct iscsi_context *iscsi, pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return 0; } } @@ -2608,7 +2608,7 @@ iscsi_scsi_cancel_all_tasks(struct iscsi_context *iscsi) pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); } while ((pdu = iscsi->outqueue)) { ISCSI_LIST_REMOVE(&iscsi->outqueue, pdu); @@ -2616,6 +2616,6 @@ iscsi_scsi_cancel_all_tasks(struct iscsi_context *iscsi) pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); } } diff --git a/lib/iser.c b/lib/iser.c index eaffbd4..85ec52c 100644 --- a/lib/iser.c +++ b/lib/iser.c @@ -33,22 +33,16 @@ #ifdef __linux -int cq_handle(struct iser_conn *iser_conn); +static int cq_handle(struct iser_conn *iser_conn); /* * iscsi_iser_get_fd() - Return completion queue * event channel file descriptor. */ -int +static int iscsi_iser_get_fd(struct iscsi_context *iscsi) { - struct iser_transport *iser_transport; - struct iser_conn *iser_conn; - - iser_transport = container_of(iscsi->t, struct iser_transport, t); - - iser_conn = &iser_transport->iser_conn; - + struct iser_conn *iser_conn = iscsi->opaque; return iser_conn->comp_channel->fd; } @@ -61,7 +55,7 @@ iscsi_iser_get_fd(struct iscsi_context *iscsi) * will return same value of 1 each time. * Being used in QEMU iscsi block so we need compatability with TCP */ -int +static int iscsi_iser_which_events(struct iscsi_context *iscsi _U_) { /* iSER is waiting to events from CQ that are always POLLIN */ @@ -77,15 +71,11 @@ iscsi_iser_which_events(struct iscsi_context *iscsi _U_) * CQ can only create POLLIN events, hence this function * will poll the cq for completion until boundary or emptiness. */ -int +static int iscsi_iser_service(struct iscsi_context *iscsi, int revents) { - struct iser_transport *iser_transport; int ret = 0; - struct iser_conn *iser_conn; - - iser_transport = container_of(iscsi->t, struct iser_transport, t); - iser_conn = &iser_transport->iser_conn; + struct iser_conn *iser_conn = iscsi->opaque; if (revents == POLLIN) ret = cq_handle(iser_conn); @@ -106,7 +96,7 @@ iscsi_iser_service(struct iscsi_context *iscsi, int revents) * iser_free_rx_descriptors() - freeing descriptors memory * @iser_conn: ib connection context */ -void +static void iser_free_rx_descriptors(struct iser_conn *iser_conn) { struct iser_rx_desc *rx_desc; @@ -128,7 +118,7 @@ iser_free_rx_descriptors(struct iser_conn *iser_conn) * iser_free_login_buf() - freeing login buffer * @iser_conn: ib connection context */ -void +static void iser_free_login_buf(struct iser_conn *iser_conn) { struct iscsi_context *iscsi = iser_conn->cma_id->context; @@ -139,7 +129,7 @@ iser_free_login_buf(struct iser_conn *iser_conn) return; } -void +static void iser_free_reg_mr(struct iser_conn *iser_conn) { struct iser_tx_desc *tx_desc = iser_conn->tx_desc; @@ -166,7 +156,7 @@ iser_free_reg_mr(struct iser_conn *iser_conn) * iser_free_iser_conn_res() - freeing ib context resources * @iser_conn: ib connection context */ -void +static void iser_free_iser_conn_res(struct iser_conn *iser_conn, bool destroy) { int ret; @@ -227,7 +217,7 @@ iser_free_iser_conn_res(struct iser_conn *iser_conn, bool destroy) * and destroying cm id * @iser_conn: ib connection context */ -void +static void iser_conn_release(struct iser_conn *iser_conn) { int ret; @@ -250,7 +240,7 @@ iser_conn_release(struct iser_conn *iser_conn) * iser_conn_terminate() - disconnecting rdma_cm * @iser_conn: ib connection context */ -void +static void iser_conn_terminate(struct iser_conn *iser_conn) { int ret; @@ -271,16 +261,13 @@ iser_conn_terminate(struct iser_conn *iser_conn) * freeing resources * @iser_conn: ib connection context */ -int +static int iscsi_iser_disconnect(struct iscsi_context *iscsi) { - struct iser_transport *iser_transport; + struct iser_conn *iser_conn = iscsi->opaque; - iser_transport = container_of(iscsi->t, struct iser_transport, t); - - iser_conn_terminate(&iser_transport->iser_conn); - - iser_conn_release(&iser_transport->iser_conn); + iser_conn_terminate(iser_conn); + iser_conn_release(iser_conn); iscsi->fd = -1; iscsi->is_connected = 0; @@ -289,7 +276,7 @@ iscsi_iser_disconnect(struct iscsi_context *iscsi) { return 0; } -struct iscsi_pdu* +static struct iscsi_pdu* iscsi_iser_new_pdu(struct iscsi_context *iscsi, __attribute__((unused))size_t size) { struct iscsi_pdu *pdu; @@ -302,7 +289,7 @@ iscsi_iser_new_pdu(struct iscsi_context *iscsi, __attribute__((unused))size_t si return pdu; } -void +static void iscsi_iser_free_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) { struct iser_pdu *iser_pdu; @@ -341,7 +328,8 @@ iscsi_iser_free_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) ** headers ** @iser_pdu: iser pdu including iscsi pdu inside it **/ -void iser_create_send_desc(struct iser_pdu *iser_pdu) { +static void +iser_create_send_desc(struct iser_pdu *iser_pdu) { unsigned char *iscsi_header = iser_pdu->iscsi_pdu.outdata.data; struct iser_tx_desc *tx_desc = iser_pdu->desc; @@ -357,8 +345,8 @@ void iser_create_send_desc(struct iser_pdu *iser_pdu) { * on receive queue * @iser_conn: ib connection context */ -int iser_post_recvl(struct iser_conn *iser_conn) { - +static int +iser_post_recvl(struct iser_conn *iser_conn) { struct ibv_recv_wr rx_wr; struct ibv_recv_wr *rx_wr_failed; struct ibv_sge sge; @@ -395,7 +383,8 @@ int iser_post_recvl(struct iser_conn *iser_conn) { * Notes: * Need to handle signal better */ -int iser_post_send(struct iser_conn *iser_conn, struct iser_tx_desc *tx_desc, bool signal) { +static int +iser_post_send(struct iser_conn *iser_conn, struct iser_tx_desc *tx_desc, bool signal) { int ret; struct ibv_send_wr send_wr; @@ -425,10 +414,10 @@ int iser_post_send(struct iser_conn *iser_conn, struct iser_tx_desc *tx_desc, bo * @iser_transport: iser connection context * @iser_pdu: iser pdu to send */ -int iser_send_control(struct iser_transport *iser_transport, struct iser_pdu *iser_pdu) { +static int +iser_send_control(struct iser_conn *iser_conn, struct iser_pdu *iser_pdu) { struct iser_tx_desc *tx_desc; - struct iser_conn *iser_conn = &iser_transport->iser_conn; int ret; struct iscsi_context *iscsi = iser_conn->cma_id->context; size_t datalen; @@ -487,7 +476,7 @@ int iser_send_control(struct iser_transport *iser_transport, struct iser_pdu *is * @iser_pdu: iser pdu * @iser_conn: iser_connection context */ -int +static int iser_initialize_headers(struct iser_pdu *iser_pdu, struct iser_conn *iser_conn) { struct iser_tx_desc *tx_desc; @@ -608,7 +597,7 @@ is_control_opcode(uint8_t opcode) return is_control; } -int +static int overflow_data_size(struct iser_pdu *iser_pdu) { int data_size; @@ -627,12 +616,10 @@ overflow_data_size(struct iser_pdu *iser_pdu) * Nots: * Need to fix if failed prepareation return -1 */ -int -iser_send_command(struct iser_transport *iser_transport, - struct iser_pdu *iser_pdu) +static int +iser_send_command(struct iser_conn *iser_conn, struct iser_pdu *iser_pdu) { struct iser_tx_desc *tx_desc = iser_pdu->desc; - struct iser_conn *iser_conn = &iser_transport->iser_conn; int err = 0; struct iscsi_context *iscsi = iser_conn->cma_id->context; @@ -676,11 +663,11 @@ iser_send_command(struct iser_transport *iser_transport, * Need to be compatible to TCP which has real queue, * in iSER every queue pdu already sends all pdu (post_send) */ -int iscsi_iser_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) { +static int +iscsi_iser_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) { struct iser_pdu *iser_pdu; - struct iser_transport *iser_transport; - struct iser_conn *iser_conn; + struct iser_conn *iser_conn = iscsi->opaque; uint8_t opcode; if (pdu == NULL) { @@ -689,8 +676,6 @@ int iscsi_iser_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) { } iser_pdu = container_of(pdu, struct iser_pdu, iscsi_pdu); - iser_transport = container_of(iscsi->t, struct iser_transport, t); - iser_conn = &iser_transport->iser_conn; opcode = pdu->outdata.data[0]; iscsi_pdu_set_expstatsn(pdu, iscsi->statsn + 1); @@ -702,12 +687,12 @@ int iscsi_iser_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) { } if (unlikely(is_control_opcode(opcode))) { - if (iser_send_control(iser_transport, iser_pdu)) { + if (iser_send_control(iser_conn, iser_pdu)) { iscsi_set_error(iscsi, "iser_send_command Failed\n"); return -1; } } else { - if (iser_send_command(iser_transport, iser_pdu)) { + if (iser_send_command(iser_conn, iser_pdu)) { iscsi_set_error(iscsi, "iser_send_command Failed\n"); return -1; } @@ -725,7 +710,7 @@ static int iser_create_iser_conn_res(struct iser_conn *iser_conn) { struct ibv_qp_init_attr init_attr; int ret; - struct iscsi_context *iscsi = iser_conn->cma_id->context; + struct iscsi_context *iscsi = iser_conn->cma_id->context; memset(&init_attr, 0, sizeof(struct ibv_qp_init_attr)); init_attr.qp_context = (void *)iser_conn->cma_id->context; @@ -754,15 +739,10 @@ static int iser_create_iser_conn_res(struct iser_conn *iser_conn) { * @cma_id: connection manager id */ static int iser_addr_handler(struct rdma_cm_id *cma_id) { - struct iscsi_context *iscsi = cma_id->context; - struct iser_transport *iser_transport; - struct iser_conn *iser_conn; + struct iser_conn *iser_conn = iscsi->opaque; int ret, flags; - iser_transport = container_of(iscsi->t, struct iser_transport, t); - iser_conn = &iser_transport->iser_conn; - ret = rdma_resolve_route(cma_id, 1000); if (ret) { iscsi_set_error(iscsi, "Failed resolving address\n"); @@ -789,7 +769,7 @@ static int iser_addr_handler(struct rdma_cm_id *cma_id) { iser_conn->cq = ibv_create_cq(cma_id->verbs, ISER_MAX_CQ_LEN, - iser_transport, + iser_conn, iser_conn->comp_channel, 0); if (!iser_conn->cq) { @@ -836,14 +816,11 @@ pd_error: * @cma_id: connection manager id */ static int iser_route_handler(struct rdma_cm_id *cma_id) { - struct rdma_conn_param conn_param; struct iser_cm_hdr req_hdr; struct iscsi_context* iscsi = cma_id->context; int ret; - - struct iser_transport *iser_transport = container_of(iscsi->t, struct iser_transport, t); - struct iser_conn *iser_conn = &iser_transport->iser_conn; + struct iser_conn *iser_conn = iscsi->opaque; ret = iser_create_iser_conn_res(iser_conn); if (ret) { @@ -864,7 +841,7 @@ static int iser_route_handler(struct rdma_cm_id *cma_id) { ret = rdma_connect(cma_id, &conn_param); if (ret) { - iscsi_set_error(iscsi, "conn %p failure connecting: %d", iser_transport, ret); + iscsi_set_error(iscsi, "conn %p failure connecting: %d", iser_conn, ret); return -1; } return ret; @@ -885,7 +862,8 @@ login_mr_error: * @iser_conn: ib connection context * @cmds_max: maximum in flight commands */ -int iser_alloc_rx_descriptors(struct iser_conn *iser_conn, int cmds_max) +static int +iser_alloc_rx_descriptors(struct iser_conn *iser_conn, int cmds_max) { int i,j; struct iser_rx_desc *rx_desc; @@ -940,7 +918,7 @@ fail_alloc_mrs: * @iser_conn: ib connection context * @count: amount of receive requests to post on receive queue */ -int +static int iser_post_recvm(struct iser_conn *iser_conn, int count) { struct ibv_recv_wr *rx_wr, *rx_wr_failed; @@ -972,7 +950,7 @@ iser_post_recvm(struct iser_conn *iser_conn, int count) return ret; } -int +static int iser_reg_mr(struct iser_conn *iser_conn) { int i; @@ -1023,7 +1001,7 @@ iser_reg_mr(struct iser_conn *iser_conn) * commant about memcpy of data from iSER buffer to * App buffer */ -int +static int iser_rcv_completion(struct iser_rx_desc *rx_desc, struct iser_conn *iser_conn) { @@ -1127,7 +1105,7 @@ receive: * @iser_conn: ib connection context * */ -int +static int iser_snd_completion(struct iser_tx_desc *tx_desc _U_, struct iser_conn *iser_conn _U_) { @@ -1213,7 +1191,7 @@ static int cq_event_handler(struct iser_conn *iser_conn) * Need to check if it is possible * to get cq event except POLLIN. */ -int cq_handle(struct iser_conn *iser_conn) +static int cq_handle(struct iser_conn *iser_conn) { void *ev_ctx = NULL; int ret; @@ -1248,17 +1226,13 @@ int cq_handle(struct iser_conn *iser_conn) static int iser_connected_handler(struct rdma_cm_id *cma_id) { struct iscsi_context *iscsi = cma_id->context; - struct iser_transport *iser_transport; - struct iser_conn *iser_conn; + struct iser_conn *iser_conn = iscsi->opaque; - iser_transport = container_of(iscsi->t, struct iser_transport, t); - if (iser_transport == NULL) { + if (iser_conn == NULL) { iscsi_set_error(iscsi, "Failed init of transport\n"); return -1; } - iser_conn = &iser_transport->iser_conn; - iser_conn->post_recv_buf_count = 0; return iser_reg_mr(iser_conn); @@ -1273,7 +1247,8 @@ static int iser_connected_handler(struct rdma_cm_id *cma_id) { * @event: rdma cm event * */ -int iser_cma_handler(struct iser_conn *iser_conn,struct rdma_cm_id *cma_id, struct rdma_cm_event *event) { +static int +iser_cma_handler(struct iser_conn *iser_conn,struct rdma_cm_id *cma_id, struct rdma_cm_event *event) { int ret = 0; @@ -1360,18 +1335,16 @@ static void *cm_thread(void *arg) * Notes: * Need to move iser_reg_mr(headers) to iser_connected_handler. */ -int iscsi_iser_connect(struct iscsi_context *iscsi, union socket_address *sa,__attribute__((unused)) int ai_family) { +static int +iscsi_iser_connect(struct iscsi_context *iscsi, union socket_address *sa,__attribute__((unused)) int ai_family) { - struct iser_transport *iser_transport; - struct iser_conn *iser_conn; + struct iser_conn *iser_conn = iscsi->opaque; int ret; - iser_transport = container_of(iscsi->t, struct iser_transport, t); - if (iser_transport == NULL) { + if (iser_conn == NULL) { iscsi_set_error(iscsi, "Failed init of transport\n"); return -1; } - iser_conn = &iser_transport->iser_conn; sem_init(&iser_conn->sem_connect, 0, 0); iser_conn->cma_channel = rdma_create_event_channel(); @@ -1426,18 +1399,22 @@ int iscsi_iser_connect(struct iscsi_context *iscsi, union socket_address *sa,__a return 0; } +static iscsi_transport iscsi_transport_iser = { + .connect = iscsi_iser_connect, + .queue_pdu = iscsi_iser_queue_pdu, + .new_pdu = iscsi_iser_new_pdu, + .disconnect = iscsi_iser_disconnect, + .free_pdu = iscsi_iser_free_pdu, + .service = iscsi_iser_service, + .get_fd = iscsi_iser_get_fd, + .which_events = iscsi_iser_which_events, +}; + void iscsi_init_iser_transport(struct iscsi_context *iscsi) { - iscsi->t->connect = iscsi_iser_connect; - iscsi->t->queue_pdu = iscsi_iser_queue_pdu; - iscsi->t->new_pdu = iscsi_iser_new_pdu; - iscsi->t->disconnect = iscsi_iser_disconnect; - iscsi->t->free_pdu = iscsi_iser_free_pdu; - iscsi->t->service = iscsi_iser_service; - iscsi->t->get_fd = iscsi_iser_get_fd; - iscsi->t->which_events = iscsi_iser_which_events; - - return; + iscsi->drv = &iscsi_transport_iser; + iscsi->opaque = iscsi_malloc(iscsi, sizeof(struct iser_conn)); + iscsi->transport = ISER_TRANSPORT; } #endif diff --git a/lib/login.c b/lib/login.c index e24e7ad..dd0e7ab 100644 --- a/lib/login.c +++ b/lib/login.c @@ -852,14 +852,14 @@ iscsi_login_async(struct iscsi_context *iscsi, iscsi_command_cb cb, /* initiator name */ if (iscsi_login_add_initiatorname(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* optional alias */ if (iscsi->alias[0]) { if (iscsi_login_add_alias(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } } @@ -867,134 +867,134 @@ iscsi_login_async(struct iscsi_context *iscsi, iscsi_command_cb cb, /* target name */ if (iscsi->session_type == ISCSI_SESSION_NORMAL) { if (iscsi_login_add_targetname(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } } /* session type */ if (iscsi_login_add_sessiontype(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* header digest */ if (iscsi_login_add_headerdigest(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* auth method */ if (iscsi_login_add_authmethod(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* auth algorithm */ if (iscsi_login_add_authalgorithm(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* chap username */ if (iscsi_login_add_chap_username(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* chap response */ if (iscsi_login_add_chap_response(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* data digest */ if (iscsi_login_add_datadigest(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* initial r2t */ if (iscsi_login_add_initialr2t(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* immediate data */ if (iscsi_login_add_immediatedata(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* max burst length */ if (iscsi_login_add_maxburstlength(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* first burst length */ if (iscsi_login_add_firstburstlength(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* default time 2 wait */ if (iscsi_login_add_defaulttime2wait(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* default time 2 retain */ if (iscsi_login_add_defaulttime2retain(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* max outstanding r2t */ if (iscsi_login_add_maxoutstandingr2t(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* errorrecoverylevel */ if (iscsi_login_add_errorrecoverylevel(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* ifmarker */ if (iscsi_login_add_ifmarker(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* ofmarker */ if (iscsi_login_add_ofmarker(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* maxconnections */ if (iscsi_login_add_maxconnections(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* max recv data segment length */ if (iscsi_login_add_maxrecvdatasegmentlength(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* data pdu in order */ if (iscsi_login_add_datapduinorder(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } /* data sequence in order */ if (iscsi_login_add_datasequenceinorder(iscsi, pdu) != 0) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } @@ -1005,7 +1005,7 @@ iscsi_login_async(struct iscsi_context *iscsi, iscsi_command_cb cb, if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi " "pdu."); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } @@ -1322,7 +1322,7 @@ iscsi_logout_async(struct iscsi_context *iscsi, iscsi_command_cb cb, if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi " "logout pdu."); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } diff --git a/lib/nop.c b/lib/nop.c index d1add06..6d9f450 100644 --- a/lib/nop.c +++ b/lib/nop.c @@ -73,14 +73,14 @@ iscsi_nop_out_async(struct iscsi_context *iscsi, iscsi_command_cb cb, if (data != NULL && len > 0) { if (iscsi_pdu_add_data(iscsi, pdu, data, len) != 0) { iscsi_set_error(iscsi, "Failed to add outdata to nop-out"); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } } if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_set_error(iscsi, "failed to queue iscsi nop-out pdu"); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } @@ -124,7 +124,7 @@ iscsi_send_target_nop_out(struct iscsi_context *iscsi, uint32_t ttt, uint32_t lu if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_set_error(iscsi, "failed to queue iscsi nop-out pdu"); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; } diff --git a/lib/pdu.c b/lib/pdu.c index c95ef00..1275b33 100644 --- a/lib/pdu.c +++ b/lib/pdu.c @@ -96,7 +96,7 @@ iscsi_allocate_pdu(struct iscsi_context *iscsi, enum iscsi_opcode opcode, { struct iscsi_pdu *pdu; - pdu = iscsi->t->new_pdu(iscsi, sizeof(struct iscsi_pdu)); + pdu = iscsi->drv->new_pdu(iscsi, sizeof(struct iscsi_pdu)); if (pdu == NULL) { iscsi_set_error(iscsi, "failed to allocate pdu"); return NULL; @@ -379,7 +379,7 @@ int iscsi_process_reject(struct iscsi_context *iscsi, } ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return 0; } @@ -528,7 +528,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) case ISCSI_PDU_LOGIN_RESPONSE: if (iscsi_process_login_reply(iscsi, pdu, in) != 0) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); iscsi_set_error(iscsi, "iscsi login reply " "failed"); return -1; @@ -537,7 +537,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) case ISCSI_PDU_TEXT_RESPONSE: if (iscsi_process_text_reply(iscsi, pdu, in) != 0) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); iscsi_set_error(iscsi, "iscsi text reply " "failed"); return -1; @@ -546,7 +546,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) case ISCSI_PDU_LOGOUT_RESPONSE: if (iscsi_process_logout_reply(iscsi, pdu, in) != 0) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); iscsi_set_error(iscsi, "iscsi logout reply " "failed"); return -1; @@ -555,7 +555,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) case ISCSI_PDU_SCSI_RESPONSE: if (iscsi_process_scsi_reply(iscsi, pdu, in) != 0) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); iscsi_set_error(iscsi, "iscsi response reply " "failed"); return -1; @@ -565,7 +565,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) if (iscsi_process_scsi_data_in(iscsi, pdu, in, &is_finished) != 0) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); iscsi_set_error(iscsi, "iscsi data in " "failed"); return -1; @@ -574,7 +574,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) case ISCSI_PDU_NOP_IN: if (iscsi_process_nop_out_reply(iscsi, pdu, in) != 0) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); iscsi_set_error(iscsi, "iscsi nop-in failed"); return -1; } @@ -583,7 +583,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) if (iscsi_process_task_mgmt_reply(iscsi, pdu, in) != 0) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); iscsi_set_error(iscsi, "iscsi task-mgmt failed"); return -1; } @@ -591,7 +591,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) case ISCSI_PDU_R2T: if (iscsi_process_r2t(iscsi, pdu, in) != 0) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); iscsi_set_error(iscsi, "iscsi r2t " "failed"); return -1; @@ -606,7 +606,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) if (is_finished) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); } return 0; } @@ -720,7 +720,7 @@ iscsi_timeout_scan(struct iscsi_context *iscsi) pdu->callback(iscsi, SCSI_STATUS_TIMEOUT, NULL, pdu->private_data); } - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); } for (pdu = iscsi->waitpdu; pdu; pdu = next_pdu) { next_pdu = pdu->next; @@ -740,12 +740,12 @@ iscsi_timeout_scan(struct iscsi_context *iscsi) pdu->callback(iscsi, SCSI_STATUS_TIMEOUT, NULL, pdu->private_data); } - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); } } int iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) { - return iscsi->t->queue_pdu(iscsi, pdu); + return iscsi->drv->queue_pdu(iscsi, pdu); } diff --git a/lib/socket.c b/lib/socket.c index 8b30912..036b4f4 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -359,7 +359,7 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal, iscsi->socket_status_cb = cb; iscsi->connect_data = private_data; - if (iscsi->t->connect(iscsi, &sa, ai->ai_family) < 0) { + if (iscsi->drv->connect(iscsi, &sa, ai->ai_family) < 0) { iscsi_set_error(iscsi, "Couldn't connect transport"); freeaddrinfo(ai); return -1; @@ -396,10 +396,10 @@ iscsi_tcp_disconnect(struct iscsi_context *iscsi) int iscsi_disconnect(struct iscsi_context *iscsi) { - return iscsi->t->disconnect(iscsi); + return iscsi->drv->disconnect(iscsi); } -int +static int iscsi_tcp_get_fd(struct iscsi_context *iscsi) { if (iscsi->old_iscsi) { @@ -411,10 +411,10 @@ iscsi_tcp_get_fd(struct iscsi_context *iscsi) int iscsi_get_fd(struct iscsi_context *iscsi) { - return iscsi->t->get_fd(iscsi); + return iscsi->drv->get_fd(iscsi); } -int +static int iscsi_tcp_which_events(struct iscsi_context *iscsi) { int events = iscsi->is_connected ? POLLIN : POLLOUT; @@ -438,7 +438,7 @@ iscsi_tcp_which_events(struct iscsi_context *iscsi) int iscsi_which_events(struct iscsi_context *iscsi) { - return iscsi->t->which_events(iscsi); + return iscsi->drv->which_events(iscsi); } int @@ -811,7 +811,7 @@ iscsi_write_to_socket(struct iscsi_context *iscsi) iscsi->is_corked = 1; } if (pdu->flags & ISCSI_PDU_DELETE_WHEN_SENT) { - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); } iscsi->outqueue_current = NULL; } @@ -837,7 +837,7 @@ iscsi_service_reconnect_if_loggedin(struct iscsi_context *iscsi) return -1; } -int +static int iscsi_tcp_service(struct iscsi_context *iscsi, int revents) { if (iscsi->fd < 0) { @@ -943,7 +943,7 @@ iscsi_tcp_service(struct iscsi_context *iscsi, int revents) int iscsi_service(struct iscsi_context *iscsi, int revents) { - return iscsi->t->service(iscsi, revents); + return iscsi->drv->service(iscsi, revents); } static int iscsi_tcp_queue_pdu(struct iscsi_context *iscsi, @@ -1080,16 +1080,19 @@ void iscsi_set_bind_interfaces(struct iscsi_context *iscsi, char * interfaces _U #endif } +static iscsi_transport iscsi_transport_tcp = { + .connect = iscsi_tcp_connect, + .queue_pdu = iscsi_tcp_queue_pdu, + .new_pdu = iscsi_tcp_new_pdu, + .disconnect = iscsi_tcp_disconnect, + .free_pdu = iscsi_tcp_free_pdu, + .service = iscsi_tcp_service, + .get_fd = iscsi_tcp_get_fd, + .which_events = iscsi_tcp_which_events, +}; + void iscsi_init_tcp_transport(struct iscsi_context *iscsi) { - iscsi->t->connect = iscsi_tcp_connect; - iscsi->t->queue_pdu = iscsi_tcp_queue_pdu; - iscsi->t->new_pdu = iscsi_tcp_new_pdu; - iscsi->t->disconnect = iscsi_tcp_disconnect; - iscsi->t->free_pdu = iscsi_tcp_free_pdu; - iscsi->t->service = iscsi_tcp_service; - iscsi->t->get_fd = iscsi_tcp_get_fd; - iscsi->t->which_events = iscsi_tcp_which_events; - - return; + iscsi->drv = &iscsi_transport_tcp; + iscsi->transport = TCP_TRANSPORT; } diff --git a/lib/task_mgmt.c b/lib/task_mgmt.c index 6ad3d3b..9abbd9c 100644 --- a/lib/task_mgmt.c +++ b/lib/task_mgmt.c @@ -83,7 +83,7 @@ iscsi_task_mgmt_async(struct iscsi_context *iscsi, if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_set_error(iscsi, "failed to queue iscsi taskmgmt pdu"); - iscsi->t->free_pdu(iscsi, pdu); + iscsi->drv->free_pdu(iscsi, pdu); return -1; }