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 <pl@kamp.de>
This commit is contained in:
Peter Lieven
2016-08-05 11:28:43 +02:00
parent df1dc08eb7
commit fa123fc397
12 changed files with 159 additions and 214 deletions

View File

@@ -76,9 +76,10 @@ union socket_address {
}; };
struct iscsi_context { struct iscsi_context {
struct iscsi_transport *drv;
struct iscsi_transport *t; void *opaque;
enum iscsi_transport_type transport; enum iscsi_transport_type transport;
char initiator_name[MAX_STRING_SIZE+1]; char initiator_name[MAX_STRING_SIZE+1];
char target_name[MAX_STRING_SIZE+1]; char target_name[MAX_STRING_SIZE+1];
char target_address[MAX_STRING_SIZE+1]; /* If a redirect */ 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); 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 (*connect)(struct iscsi_context *iscsi, union socket_address *sa, int ai_family);
int (*queue_pdu)(struct iscsi_context *iscsi, struct iscsi_pdu *pdu); int (*queue_pdu)(struct iscsi_context *iscsi, struct iscsi_pdu *pdu);
struct iscsi_pdu* (*new_pdu)(struct iscsi_context *iscsi, size_t size); 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 (*service)(struct iscsi_context *iscsi, int revents);
int (*get_fd)(struct iscsi_context *iscsi); int (*get_fd)(struct iscsi_context *iscsi);
int (*which_events)(struct iscsi_context *iscsi); int (*which_events)(struct iscsi_context *iscsi);
}; } iscsi_transport;
struct tcp_transport {
struct iscsi_transport t;
};
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -202,13 +202,6 @@ struct iser_conn {
struct iser_tx_desc *tx_desc; 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); void iscsi_init_iser_transport(struct iscsi_context *iscsi);
#endif /* __linux */ #endif /* __linux */

View File

@@ -277,7 +277,7 @@ void iscsi_defer_reconnect(struct iscsi_context *iscsi)
pdu->callback(iscsi, SCSI_STATUS_CANCELLED, pdu->callback(iscsi, SCSI_STATUS_CANCELLED,
NULL, pdu->private_data); NULL, pdu->private_data);
} }
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
} }
while ((pdu = iscsi->waitpdu)) { while ((pdu = iscsi->waitpdu)) {
ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu);
@@ -288,7 +288,7 @@ void iscsi_defer_reconnect(struct iscsi_context *iscsi)
pdu->callback(iscsi, SCSI_STATUS_CANCELLED, pdu->callback(iscsi, SCSI_STATUS_CANCELLED,
NULL, pdu->private_data); 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); ISCSI_LIST_REMOVE(&old_iscsi->waitpdu, pdu);
if (pdu->itt == 0xffffffff) { if (pdu->itt == 0xffffffff) {
iscsi->t->free_pdu(old_iscsi, pdu); iscsi->drv->free_pdu(old_iscsi, pdu);
continue; continue;
} }
@@ -346,7 +346,7 @@ void iscsi_reconnect_cb(struct iscsi_context *iscsi _U_, int status,
pdu->callback(iscsi, SCSI_STATUS_CANCELLED, pdu->callback(iscsi, SCSI_STATUS_CANCELLED,
NULL, pdu->private_data); NULL, pdu->private_data);
} }
iscsi->t->free_pdu(old_iscsi, pdu); iscsi->drv->free_pdu(old_iscsi, pdu);
continue; continue;
} }
@@ -364,7 +364,7 @@ void iscsi_reconnect_cb(struct iscsi_context *iscsi _U_, int status,
pdu->scsi_cbdata.private_data)) { pdu->scsi_cbdata.private_data)) {
/* not much we can really do at this point */ /* 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) { 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) { 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->opaque);
iscsi_free(old_iscsi, old_iscsi->t);
}
for (i = 0; i < old_iscsi->smalloc_free; i++) { for (i = 0; i < old_iscsi->smalloc_free; i++) {
iscsi_free(old_iscsi, old_iscsi->smalloc_ptrs[i]); iscsi_free(old_iscsi, old_iscsi->smalloc_ptrs[i]);

View File

@@ -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) if (iscsi_pdu_add_data(iscsi, pdu, (unsigned char *)str, strlen(str)+1)
!= 0) { != 0) {
iscsi_set_error(iscsi, "Out-of-memory: pdu add data failed."); 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; return -1;
} }
@@ -83,7 +83,7 @@ iscsi_discovery_async(struct iscsi_context *iscsi, iscsi_command_cb cb,
if (iscsi_queue_pdu(iscsi, pdu) != 0) { if (iscsi_queue_pdu(iscsi, pdu) != 0) {
iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi " iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi "
"text pdu."); "text pdu.");
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }

View File

@@ -48,35 +48,14 @@
int iscsi_init_transport(struct iscsi_context *iscsi, int iscsi_init_transport(struct iscsi_context *iscsi,
enum iscsi_transport_type transport) { 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; iscsi->transport = transport;
switch (iscsi->transport) { switch (iscsi->transport) {
case TCP_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); iscsi_init_tcp_transport(iscsi);
break; break;
#ifdef HAVE_LINUX_ISER #ifdef HAVE_LINUX_ISER
case ISER_TRANSPORT: 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); iscsi_init_iser_transport(iscsi);
break; break;
#endif #endif
@@ -371,7 +350,7 @@ iscsi_destroy_context(struct iscsi_context *iscsi)
pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL,
pdu->private_data); pdu->private_data);
} }
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
} }
while ((pdu = iscsi->waitpdu)) { while ((pdu = iscsi->waitpdu)) {
ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); 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->callback(iscsi, SCSI_STATUS_CANCELLED, NULL,
pdu->private_data); 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) { 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) { if (iscsi->incoming != NULL) {
@@ -413,9 +392,7 @@ iscsi_destroy_context(struct iscsi_context *iscsi)
iscsi_destroy_context(iscsi->old_iscsi); iscsi_destroy_context(iscsi->old_iscsi);
} }
if (iscsi->t) { iscsi_free(iscsi, iscsi->opaque);
iscsi_free(iscsi, iscsi->t);
}
memset(iscsi, 0, sizeof(struct iscsi_context)); memset(iscsi, 0, sizeof(struct iscsi_context));
free(iscsi); free(iscsi);

View File

@@ -147,7 +147,7 @@ error:
cmd_pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, cmd_pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL,
cmd_pdu->private_data); cmd_pdu->private_data);
} }
iscsi->t->free_pdu(iscsi, cmd_pdu); iscsi->drv->free_pdu(iscsi, cmd_pdu);
return -1; return -1;
} }
@@ -283,7 +283,7 @@ iscsi_scsi_command_async(struct iscsi_context *iscsi, int lun,
if (iscsi_queue_pdu(iscsi, pdu) != 0) { if (iscsi_queue_pdu(iscsi, pdu) != 0) {
iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi " iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi "
"scsi pdu."); "scsi pdu.");
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
@@ -2579,7 +2579,7 @@ iscsi_scsi_cancel_task(struct iscsi_context *iscsi,
pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL,
pdu->private_data); pdu->private_data);
} }
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return 0; return 0;
} }
} }
@@ -2590,7 +2590,7 @@ iscsi_scsi_cancel_task(struct iscsi_context *iscsi,
pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL,
pdu->private_data); pdu->private_data);
} }
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return 0; return 0;
} }
} }
@@ -2608,7 +2608,7 @@ iscsi_scsi_cancel_all_tasks(struct iscsi_context *iscsi)
pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL,
pdu->private_data); pdu->private_data);
} }
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
} }
while ((pdu = iscsi->outqueue)) { while ((pdu = iscsi->outqueue)) {
ISCSI_LIST_REMOVE(&iscsi->outqueue, pdu); 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->callback(iscsi, SCSI_STATUS_CANCELLED, NULL,
pdu->private_data); pdu->private_data);
} }
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
} }
} }

View File

@@ -33,22 +33,16 @@
#ifdef __linux #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 * iscsi_iser_get_fd() - Return completion queue
* event channel file descriptor. * event channel file descriptor.
*/ */
int static int
iscsi_iser_get_fd(struct iscsi_context *iscsi) iscsi_iser_get_fd(struct iscsi_context *iscsi)
{ {
struct iser_transport *iser_transport; struct iser_conn *iser_conn = iscsi->opaque;
struct iser_conn *iser_conn;
iser_transport = container_of(iscsi->t, struct iser_transport, t);
iser_conn = &iser_transport->iser_conn;
return iser_conn->comp_channel->fd; 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. * will return same value of 1 each time.
* Being used in QEMU iscsi block so we need compatability with TCP * Being used in QEMU iscsi block so we need compatability with TCP
*/ */
int static int
iscsi_iser_which_events(struct iscsi_context *iscsi _U_) iscsi_iser_which_events(struct iscsi_context *iscsi _U_)
{ {
/* iSER is waiting to events from CQ that are always POLLIN */ /* 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 * CQ can only create POLLIN events, hence this function
* will poll the cq for completion until boundary or emptiness. * will poll the cq for completion until boundary or emptiness.
*/ */
int static int
iscsi_iser_service(struct iscsi_context *iscsi, int revents) iscsi_iser_service(struct iscsi_context *iscsi, int revents)
{ {
struct iser_transport *iser_transport;
int ret = 0; int ret = 0;
struct iser_conn *iser_conn; struct iser_conn *iser_conn = iscsi->opaque;
iser_transport = container_of(iscsi->t, struct iser_transport, t);
iser_conn = &iser_transport->iser_conn;
if (revents == POLLIN) if (revents == POLLIN)
ret = cq_handle(iser_conn); 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_free_rx_descriptors() - freeing descriptors memory
* @iser_conn: ib connection context * @iser_conn: ib connection context
*/ */
void static void
iser_free_rx_descriptors(struct iser_conn *iser_conn) iser_free_rx_descriptors(struct iser_conn *iser_conn)
{ {
struct iser_rx_desc *rx_desc; 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_free_login_buf() - freeing login buffer
* @iser_conn: ib connection context * @iser_conn: ib connection context
*/ */
void static void
iser_free_login_buf(struct iser_conn *iser_conn) iser_free_login_buf(struct iser_conn *iser_conn)
{ {
struct iscsi_context *iscsi = iser_conn->cma_id->context; struct iscsi_context *iscsi = iser_conn->cma_id->context;
@@ -139,7 +129,7 @@ iser_free_login_buf(struct iser_conn *iser_conn)
return; return;
} }
void static void
iser_free_reg_mr(struct iser_conn *iser_conn) iser_free_reg_mr(struct iser_conn *iser_conn)
{ {
struct iser_tx_desc *tx_desc = iser_conn->tx_desc; 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_free_iser_conn_res() - freeing ib context resources
* @iser_conn: ib connection context * @iser_conn: ib connection context
*/ */
void static void
iser_free_iser_conn_res(struct iser_conn *iser_conn, bool destroy) iser_free_iser_conn_res(struct iser_conn *iser_conn, bool destroy)
{ {
int ret; int ret;
@@ -227,7 +217,7 @@ iser_free_iser_conn_res(struct iser_conn *iser_conn, bool destroy)
* and destroying cm id * and destroying cm id
* @iser_conn: ib connection context * @iser_conn: ib connection context
*/ */
void static void
iser_conn_release(struct iser_conn *iser_conn) iser_conn_release(struct iser_conn *iser_conn)
{ {
int ret; int ret;
@@ -250,7 +240,7 @@ iser_conn_release(struct iser_conn *iser_conn)
* iser_conn_terminate() - disconnecting rdma_cm * iser_conn_terminate() - disconnecting rdma_cm
* @iser_conn: ib connection context * @iser_conn: ib connection context
*/ */
void static void
iser_conn_terminate(struct iser_conn *iser_conn) iser_conn_terminate(struct iser_conn *iser_conn)
{ {
int ret; int ret;
@@ -271,16 +261,13 @@ iser_conn_terminate(struct iser_conn *iser_conn)
* freeing resources * freeing resources
* @iser_conn: ib connection context * @iser_conn: ib connection context
*/ */
int static int
iscsi_iser_disconnect(struct iscsi_context *iscsi) { 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_conn);
iser_conn_release(iser_conn);
iser_conn_terminate(&iser_transport->iser_conn);
iser_conn_release(&iser_transport->iser_conn);
iscsi->fd = -1; iscsi->fd = -1;
iscsi->is_connected = 0; iscsi->is_connected = 0;
@@ -289,7 +276,7 @@ iscsi_iser_disconnect(struct iscsi_context *iscsi) {
return 0; return 0;
} }
struct iscsi_pdu* static struct iscsi_pdu*
iscsi_iser_new_pdu(struct iscsi_context *iscsi, __attribute__((unused))size_t size) { iscsi_iser_new_pdu(struct iscsi_context *iscsi, __attribute__((unused))size_t size) {
struct iscsi_pdu *pdu; struct iscsi_pdu *pdu;
@@ -302,7 +289,7 @@ iscsi_iser_new_pdu(struct iscsi_context *iscsi, __attribute__((unused))size_t si
return pdu; return pdu;
} }
void static void
iscsi_iser_free_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) iscsi_iser_free_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
{ {
struct iser_pdu *iser_pdu; struct iser_pdu *iser_pdu;
@@ -341,7 +328,8 @@ iscsi_iser_free_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
** headers ** headers
** @iser_pdu: iser pdu including iscsi pdu inside it ** @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; unsigned char *iscsi_header = iser_pdu->iscsi_pdu.outdata.data;
struct iser_tx_desc *tx_desc = iser_pdu->desc; 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 * on receive queue
* @iser_conn: ib connection context * @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;
struct ibv_recv_wr *rx_wr_failed; struct ibv_recv_wr *rx_wr_failed;
struct ibv_sge sge; struct ibv_sge sge;
@@ -395,7 +383,8 @@ int iser_post_recvl(struct iser_conn *iser_conn) {
* Notes: * Notes:
* Need to handle signal better * 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; int ret;
struct ibv_send_wr send_wr; 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_transport: iser connection context
* @iser_pdu: iser pdu to send * @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_tx_desc *tx_desc;
struct iser_conn *iser_conn = &iser_transport->iser_conn;
int ret; int ret;
struct iscsi_context *iscsi = iser_conn->cma_id->context; struct iscsi_context *iscsi = iser_conn->cma_id->context;
size_t datalen; 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_pdu: iser pdu
* @iser_conn: iser_connection context * @iser_conn: iser_connection context
*/ */
int static int
iser_initialize_headers(struct iser_pdu *iser_pdu, struct iser_conn *iser_conn) iser_initialize_headers(struct iser_pdu *iser_pdu, struct iser_conn *iser_conn)
{ {
struct iser_tx_desc *tx_desc; struct iser_tx_desc *tx_desc;
@@ -608,7 +597,7 @@ is_control_opcode(uint8_t opcode)
return is_control; return is_control;
} }
int static int
overflow_data_size(struct iser_pdu *iser_pdu) overflow_data_size(struct iser_pdu *iser_pdu)
{ {
int data_size; int data_size;
@@ -627,12 +616,10 @@ overflow_data_size(struct iser_pdu *iser_pdu)
* Nots: * Nots:
* Need to fix if failed prepareation return -1 * Need to fix if failed prepareation return -1
*/ */
int static int
iser_send_command(struct iser_transport *iser_transport, iser_send_command(struct iser_conn *iser_conn, struct iser_pdu *iser_pdu)
struct iser_pdu *iser_pdu)
{ {
struct iser_tx_desc *tx_desc = iser_pdu->desc; struct iser_tx_desc *tx_desc = iser_pdu->desc;
struct iser_conn *iser_conn = &iser_transport->iser_conn;
int err = 0; int err = 0;
struct iscsi_context *iscsi = iser_conn->cma_id->context; 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, * Need to be compatible to TCP which has real queue,
* in iSER every queue pdu already sends all pdu (post_send) * 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_pdu *iser_pdu;
struct iser_transport *iser_transport; struct iser_conn *iser_conn = iscsi->opaque;
struct iser_conn *iser_conn;
uint8_t opcode; uint8_t opcode;
if (pdu == NULL) { 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_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]; opcode = pdu->outdata.data[0];
iscsi_pdu_set_expstatsn(pdu, iscsi->statsn + 1); 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 (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"); iscsi_set_error(iscsi, "iser_send_command Failed\n");
return -1; return -1;
} }
} else { } 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"); iscsi_set_error(iscsi, "iser_send_command Failed\n");
return -1; 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; struct ibv_qp_init_attr init_attr;
int ret; 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)); memset(&init_attr, 0, sizeof(struct ibv_qp_init_attr));
init_attr.qp_context = (void *)iser_conn->cma_id->context; 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 * @cma_id: connection manager id
*/ */
static int iser_addr_handler(struct rdma_cm_id *cma_id) { static int iser_addr_handler(struct rdma_cm_id *cma_id) {
struct iscsi_context *iscsi = cma_id->context; struct iscsi_context *iscsi = cma_id->context;
struct iser_transport *iser_transport; struct iser_conn *iser_conn = iscsi->opaque;
struct iser_conn *iser_conn;
int ret, flags; 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); ret = rdma_resolve_route(cma_id, 1000);
if (ret) { if (ret) {
iscsi_set_error(iscsi, "Failed resolving address\n"); 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_conn->cq = ibv_create_cq(cma_id->verbs,
ISER_MAX_CQ_LEN, ISER_MAX_CQ_LEN,
iser_transport, iser_conn,
iser_conn->comp_channel, iser_conn->comp_channel,
0); 0);
if (!iser_conn->cq) { if (!iser_conn->cq) {
@@ -836,14 +816,11 @@ pd_error:
* @cma_id: connection manager id * @cma_id: connection manager id
*/ */
static int iser_route_handler(struct rdma_cm_id *cma_id) { static int iser_route_handler(struct rdma_cm_id *cma_id) {
struct rdma_conn_param conn_param; struct rdma_conn_param conn_param;
struct iser_cm_hdr req_hdr; struct iser_cm_hdr req_hdr;
struct iscsi_context* iscsi = cma_id->context; struct iscsi_context* iscsi = cma_id->context;
int ret; int ret;
struct iser_conn *iser_conn = iscsi->opaque;
struct iser_transport *iser_transport = container_of(iscsi->t, struct iser_transport, t);
struct iser_conn *iser_conn = &iser_transport->iser_conn;
ret = iser_create_iser_conn_res(iser_conn); ret = iser_create_iser_conn_res(iser_conn);
if (ret) { if (ret) {
@@ -864,7 +841,7 @@ static int iser_route_handler(struct rdma_cm_id *cma_id) {
ret = rdma_connect(cma_id, &conn_param); ret = rdma_connect(cma_id, &conn_param);
if (ret) { 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 -1;
} }
return ret; return ret;
@@ -885,7 +862,8 @@ login_mr_error:
* @iser_conn: ib connection context * @iser_conn: ib connection context
* @cmds_max: maximum in flight commands * @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; int i,j;
struct iser_rx_desc *rx_desc; struct iser_rx_desc *rx_desc;
@@ -940,7 +918,7 @@ fail_alloc_mrs:
* @iser_conn: ib connection context * @iser_conn: ib connection context
* @count: amount of receive requests to post on receive queue * @count: amount of receive requests to post on receive queue
*/ */
int static int
iser_post_recvm(struct iser_conn *iser_conn, int count) iser_post_recvm(struct iser_conn *iser_conn, int count)
{ {
struct ibv_recv_wr *rx_wr, *rx_wr_failed; 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; return ret;
} }
int static int
iser_reg_mr(struct iser_conn *iser_conn) iser_reg_mr(struct iser_conn *iser_conn)
{ {
int i; int i;
@@ -1023,7 +1001,7 @@ iser_reg_mr(struct iser_conn *iser_conn)
* commant about memcpy of data from iSER buffer to * commant about memcpy of data from iSER buffer to
* App buffer * App buffer
*/ */
int static int
iser_rcv_completion(struct iser_rx_desc *rx_desc, iser_rcv_completion(struct iser_rx_desc *rx_desc,
struct iser_conn *iser_conn) struct iser_conn *iser_conn)
{ {
@@ -1127,7 +1105,7 @@ receive:
* @iser_conn: ib connection context * @iser_conn: ib connection context
* *
*/ */
int static int
iser_snd_completion(struct iser_tx_desc *tx_desc _U_, iser_snd_completion(struct iser_tx_desc *tx_desc _U_,
struct iser_conn *iser_conn _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 * Need to check if it is possible
* to get cq event except POLLIN. * 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; void *ev_ctx = NULL;
int ret; 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) { static int iser_connected_handler(struct rdma_cm_id *cma_id) {
struct iscsi_context *iscsi = cma_id->context; struct iscsi_context *iscsi = cma_id->context;
struct iser_transport *iser_transport; struct iser_conn *iser_conn = iscsi->opaque;
struct iser_conn *iser_conn;
iser_transport = container_of(iscsi->t, struct iser_transport, t); if (iser_conn == NULL) {
if (iser_transport == NULL) {
iscsi_set_error(iscsi, "Failed init of transport\n"); iscsi_set_error(iscsi, "Failed init of transport\n");
return -1; return -1;
} }
iser_conn = &iser_transport->iser_conn;
iser_conn->post_recv_buf_count = 0; iser_conn->post_recv_buf_count = 0;
return iser_reg_mr(iser_conn); 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 * @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; int ret = 0;
@@ -1360,18 +1335,16 @@ static void *cm_thread(void *arg)
* Notes: * Notes:
* Need to move iser_reg_mr(headers) to iser_connected_handler. * 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 = iscsi->opaque;
struct iser_conn *iser_conn;
int ret; int ret;
iser_transport = container_of(iscsi->t, struct iser_transport, t); if (iser_conn == NULL) {
if (iser_transport == NULL) {
iscsi_set_error(iscsi, "Failed init of transport\n"); iscsi_set_error(iscsi, "Failed init of transport\n");
return -1; return -1;
} }
iser_conn = &iser_transport->iser_conn;
sem_init(&iser_conn->sem_connect, 0, 0); sem_init(&iser_conn->sem_connect, 0, 0);
iser_conn->cma_channel = rdma_create_event_channel(); 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; 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) void iscsi_init_iser_transport(struct iscsi_context *iscsi)
{ {
iscsi->t->connect = iscsi_iser_connect; iscsi->drv = &iscsi_transport_iser;
iscsi->t->queue_pdu = iscsi_iser_queue_pdu; iscsi->opaque = iscsi_malloc(iscsi, sizeof(struct iser_conn));
iscsi->t->new_pdu = iscsi_iser_new_pdu; iscsi->transport = ISER_TRANSPORT;
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;
} }
#endif #endif

View File

@@ -852,14 +852,14 @@ iscsi_login_async(struct iscsi_context *iscsi, iscsi_command_cb cb,
/* initiator name */ /* initiator name */
if (iscsi_login_add_initiatorname(iscsi, pdu) != 0) { if (iscsi_login_add_initiatorname(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* optional alias */ /* optional alias */
if (iscsi->alias[0]) { if (iscsi->alias[0]) {
if (iscsi_login_add_alias(iscsi, pdu) != 0) { if (iscsi_login_add_alias(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
} }
@@ -867,134 +867,134 @@ iscsi_login_async(struct iscsi_context *iscsi, iscsi_command_cb cb,
/* target name */ /* target name */
if (iscsi->session_type == ISCSI_SESSION_NORMAL) { if (iscsi->session_type == ISCSI_SESSION_NORMAL) {
if (iscsi_login_add_targetname(iscsi, pdu) != 0) { if (iscsi_login_add_targetname(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
} }
/* session type */ /* session type */
if (iscsi_login_add_sessiontype(iscsi, pdu) != 0) { if (iscsi_login_add_sessiontype(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* header digest */ /* header digest */
if (iscsi_login_add_headerdigest(iscsi, pdu) != 0) { if (iscsi_login_add_headerdigest(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* auth method */ /* auth method */
if (iscsi_login_add_authmethod(iscsi, pdu) != 0) { if (iscsi_login_add_authmethod(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* auth algorithm */ /* auth algorithm */
if (iscsi_login_add_authalgorithm(iscsi, pdu) != 0) { if (iscsi_login_add_authalgorithm(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* chap username */ /* chap username */
if (iscsi_login_add_chap_username(iscsi, pdu) != 0) { if (iscsi_login_add_chap_username(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* chap response */ /* chap response */
if (iscsi_login_add_chap_response(iscsi, pdu) != 0) { if (iscsi_login_add_chap_response(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* data digest */ /* data digest */
if (iscsi_login_add_datadigest(iscsi, pdu) != 0) { if (iscsi_login_add_datadigest(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* initial r2t */ /* initial r2t */
if (iscsi_login_add_initialr2t(iscsi, pdu) != 0) { if (iscsi_login_add_initialr2t(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* immediate data */ /* immediate data */
if (iscsi_login_add_immediatedata(iscsi, pdu) != 0) { if (iscsi_login_add_immediatedata(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* max burst length */ /* max burst length */
if (iscsi_login_add_maxburstlength(iscsi, pdu) != 0) { if (iscsi_login_add_maxburstlength(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* first burst length */ /* first burst length */
if (iscsi_login_add_firstburstlength(iscsi, pdu) != 0) { if (iscsi_login_add_firstburstlength(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* default time 2 wait */ /* default time 2 wait */
if (iscsi_login_add_defaulttime2wait(iscsi, pdu) != 0) { if (iscsi_login_add_defaulttime2wait(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* default time 2 retain */ /* default time 2 retain */
if (iscsi_login_add_defaulttime2retain(iscsi, pdu) != 0) { if (iscsi_login_add_defaulttime2retain(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* max outstanding r2t */ /* max outstanding r2t */
if (iscsi_login_add_maxoutstandingr2t(iscsi, pdu) != 0) { if (iscsi_login_add_maxoutstandingr2t(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* errorrecoverylevel */ /* errorrecoverylevel */
if (iscsi_login_add_errorrecoverylevel(iscsi, pdu) != 0) { if (iscsi_login_add_errorrecoverylevel(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* ifmarker */ /* ifmarker */
if (iscsi_login_add_ifmarker(iscsi, pdu) != 0) { if (iscsi_login_add_ifmarker(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* ofmarker */ /* ofmarker */
if (iscsi_login_add_ofmarker(iscsi, pdu) != 0) { if (iscsi_login_add_ofmarker(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* maxconnections */ /* maxconnections */
if (iscsi_login_add_maxconnections(iscsi, pdu) != 0) { if (iscsi_login_add_maxconnections(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* max recv data segment length */ /* max recv data segment length */
if (iscsi_login_add_maxrecvdatasegmentlength(iscsi, pdu) != 0) { if (iscsi_login_add_maxrecvdatasegmentlength(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* data pdu in order */ /* data pdu in order */
if (iscsi_login_add_datapduinorder(iscsi, pdu) != 0) { if (iscsi_login_add_datapduinorder(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
/* data sequence in order */ /* data sequence in order */
if (iscsi_login_add_datasequenceinorder(iscsi, pdu) != 0) { if (iscsi_login_add_datasequenceinorder(iscsi, pdu) != 0) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
@@ -1005,7 +1005,7 @@ iscsi_login_async(struct iscsi_context *iscsi, iscsi_command_cb cb,
if (iscsi_queue_pdu(iscsi, pdu) != 0) { if (iscsi_queue_pdu(iscsi, pdu) != 0) {
iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi " iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi "
"pdu."); "pdu.");
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }
@@ -1322,7 +1322,7 @@ iscsi_logout_async(struct iscsi_context *iscsi, iscsi_command_cb cb,
if (iscsi_queue_pdu(iscsi, pdu) != 0) { if (iscsi_queue_pdu(iscsi, pdu) != 0) {
iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi " iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi "
"logout pdu."); "logout pdu.");
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }

View File

@@ -73,14 +73,14 @@ iscsi_nop_out_async(struct iscsi_context *iscsi, iscsi_command_cb cb,
if (data != NULL && len > 0) { if (data != NULL && len > 0) {
if (iscsi_pdu_add_data(iscsi, pdu, data, len) != 0) { if (iscsi_pdu_add_data(iscsi, pdu, data, len) != 0) {
iscsi_set_error(iscsi, "Failed to add outdata to nop-out"); 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; return -1;
} }
} }
if (iscsi_queue_pdu(iscsi, pdu) != 0) { if (iscsi_queue_pdu(iscsi, pdu) != 0) {
iscsi_set_error(iscsi, "failed to queue iscsi nop-out pdu"); 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; 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) { if (iscsi_queue_pdu(iscsi, pdu) != 0) {
iscsi_set_error(iscsi, "failed to queue iscsi nop-out pdu"); 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; return -1;
} }

View File

@@ -96,7 +96,7 @@ iscsi_allocate_pdu(struct iscsi_context *iscsi, enum iscsi_opcode opcode,
{ {
struct iscsi_pdu *pdu; 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) { if (pdu == NULL) {
iscsi_set_error(iscsi, "failed to allocate pdu"); iscsi_set_error(iscsi, "failed to allocate pdu");
return NULL; return NULL;
@@ -379,7 +379,7 @@ int iscsi_process_reject(struct iscsi_context *iscsi,
} }
ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu);
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return 0; return 0;
} }
@@ -528,7 +528,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in)
case ISCSI_PDU_LOGIN_RESPONSE: case ISCSI_PDU_LOGIN_RESPONSE:
if (iscsi_process_login_reply(iscsi, pdu, in) != 0) { if (iscsi_process_login_reply(iscsi, pdu, in) != 0) {
ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); 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 " iscsi_set_error(iscsi, "iscsi login reply "
"failed"); "failed");
return -1; return -1;
@@ -537,7 +537,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in)
case ISCSI_PDU_TEXT_RESPONSE: case ISCSI_PDU_TEXT_RESPONSE:
if (iscsi_process_text_reply(iscsi, pdu, in) != 0) { if (iscsi_process_text_reply(iscsi, pdu, in) != 0) {
ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); 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 " iscsi_set_error(iscsi, "iscsi text reply "
"failed"); "failed");
return -1; return -1;
@@ -546,7 +546,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in)
case ISCSI_PDU_LOGOUT_RESPONSE: case ISCSI_PDU_LOGOUT_RESPONSE:
if (iscsi_process_logout_reply(iscsi, pdu, in) != 0) { if (iscsi_process_logout_reply(iscsi, pdu, in) != 0) {
ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); 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 " iscsi_set_error(iscsi, "iscsi logout reply "
"failed"); "failed");
return -1; return -1;
@@ -555,7 +555,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in)
case ISCSI_PDU_SCSI_RESPONSE: case ISCSI_PDU_SCSI_RESPONSE:
if (iscsi_process_scsi_reply(iscsi, pdu, in) != 0) { if (iscsi_process_scsi_reply(iscsi, pdu, in) != 0) {
ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); 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 " iscsi_set_error(iscsi, "iscsi response reply "
"failed"); "failed");
return -1; 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, if (iscsi_process_scsi_data_in(iscsi, pdu, in,
&is_finished) != 0) { &is_finished) != 0) {
ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); 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 " iscsi_set_error(iscsi, "iscsi data in "
"failed"); "failed");
return -1; return -1;
@@ -574,7 +574,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in)
case ISCSI_PDU_NOP_IN: case ISCSI_PDU_NOP_IN:
if (iscsi_process_nop_out_reply(iscsi, pdu, in) != 0) { if (iscsi_process_nop_out_reply(iscsi, pdu, in) != 0) {
ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); 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"); iscsi_set_error(iscsi, "iscsi nop-in failed");
return -1; 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, if (iscsi_process_task_mgmt_reply(iscsi, pdu,
in) != 0) { in) != 0) {
ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); 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"); iscsi_set_error(iscsi, "iscsi task-mgmt failed");
return -1; return -1;
} }
@@ -591,7 +591,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in)
case ISCSI_PDU_R2T: case ISCSI_PDU_R2T:
if (iscsi_process_r2t(iscsi, pdu, in) != 0) { if (iscsi_process_r2t(iscsi, pdu, in) != 0) {
ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu);
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
iscsi_set_error(iscsi, "iscsi r2t " iscsi_set_error(iscsi, "iscsi r2t "
"failed"); "failed");
return -1; return -1;
@@ -606,7 +606,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in)
if (is_finished) { if (is_finished) {
ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu);
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
} }
return 0; return 0;
} }
@@ -720,7 +720,7 @@ iscsi_timeout_scan(struct iscsi_context *iscsi)
pdu->callback(iscsi, SCSI_STATUS_TIMEOUT, pdu->callback(iscsi, SCSI_STATUS_TIMEOUT,
NULL, pdu->private_data); NULL, pdu->private_data);
} }
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
} }
for (pdu = iscsi->waitpdu; pdu; pdu = next_pdu) { for (pdu = iscsi->waitpdu; pdu; pdu = next_pdu) {
next_pdu = pdu->next; next_pdu = pdu->next;
@@ -740,12 +740,12 @@ iscsi_timeout_scan(struct iscsi_context *iscsi)
pdu->callback(iscsi, SCSI_STATUS_TIMEOUT, pdu->callback(iscsi, SCSI_STATUS_TIMEOUT,
NULL, pdu->private_data); NULL, pdu->private_data);
} }
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
} }
} }
int int
iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) 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);
} }

View File

@@ -359,7 +359,7 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal,
iscsi->socket_status_cb = cb; iscsi->socket_status_cb = cb;
iscsi->connect_data = private_data; 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"); iscsi_set_error(iscsi, "Couldn't connect transport");
freeaddrinfo(ai); freeaddrinfo(ai);
return -1; return -1;
@@ -396,10 +396,10 @@ iscsi_tcp_disconnect(struct iscsi_context *iscsi)
int int
iscsi_disconnect(struct iscsi_context *iscsi) 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) iscsi_tcp_get_fd(struct iscsi_context *iscsi)
{ {
if (iscsi->old_iscsi) { if (iscsi->old_iscsi) {
@@ -411,10 +411,10 @@ iscsi_tcp_get_fd(struct iscsi_context *iscsi)
int int
iscsi_get_fd(struct iscsi_context *iscsi) 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) iscsi_tcp_which_events(struct iscsi_context *iscsi)
{ {
int events = iscsi->is_connected ? POLLIN : POLLOUT; int events = iscsi->is_connected ? POLLIN : POLLOUT;
@@ -438,7 +438,7 @@ iscsi_tcp_which_events(struct iscsi_context *iscsi)
int int
iscsi_which_events(struct iscsi_context *iscsi) iscsi_which_events(struct iscsi_context *iscsi)
{ {
return iscsi->t->which_events(iscsi); return iscsi->drv->which_events(iscsi);
} }
int int
@@ -811,7 +811,7 @@ iscsi_write_to_socket(struct iscsi_context *iscsi)
iscsi->is_corked = 1; iscsi->is_corked = 1;
} }
if (pdu->flags & ISCSI_PDU_DELETE_WHEN_SENT) { if (pdu->flags & ISCSI_PDU_DELETE_WHEN_SENT) {
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
} }
iscsi->outqueue_current = NULL; iscsi->outqueue_current = NULL;
} }
@@ -837,7 +837,7 @@ iscsi_service_reconnect_if_loggedin(struct iscsi_context *iscsi)
return -1; return -1;
} }
int static int
iscsi_tcp_service(struct iscsi_context *iscsi, int revents) iscsi_tcp_service(struct iscsi_context *iscsi, int revents)
{ {
if (iscsi->fd < 0) { if (iscsi->fd < 0) {
@@ -943,7 +943,7 @@ iscsi_tcp_service(struct iscsi_context *iscsi, int revents)
int int
iscsi_service(struct iscsi_context *iscsi, int revents) 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, 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 #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) void iscsi_init_tcp_transport(struct iscsi_context *iscsi)
{ {
iscsi->t->connect = iscsi_tcp_connect; iscsi->drv = &iscsi_transport_tcp;
iscsi->t->queue_pdu = iscsi_tcp_queue_pdu; iscsi->transport = TCP_TRANSPORT;
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;
} }

View File

@@ -83,7 +83,7 @@ iscsi_task_mgmt_async(struct iscsi_context *iscsi,
if (iscsi_queue_pdu(iscsi, pdu) != 0) { if (iscsi_queue_pdu(iscsi, pdu) != 0) {
iscsi_set_error(iscsi, "failed to queue iscsi taskmgmt pdu"); iscsi_set_error(iscsi, "failed to queue iscsi taskmgmt pdu");
iscsi->t->free_pdu(iscsi, pdu); iscsi->drv->free_pdu(iscsi, pdu);
return -1; return -1;
} }