diff --git a/include/spdk/scsi.h b/include/spdk/scsi.h index 39d9fb0c4..fd05eabe0 100644 --- a/include/spdk/scsi.h +++ b/include/spdk/scsi.h @@ -163,12 +163,7 @@ struct spdk_scsi_task { TAILQ_HEAD(subtask_list, spdk_scsi_task) subtask_list; }; -struct spdk_scsi_port { - struct spdk_scsi_dev *dev; - uint64_t id; - uint16_t index; - char name[SPDK_SCSI_PORT_MAX_NAME_LENGTH]; -}; +struct spdk_scsi_port; struct spdk_scsi_dev; @@ -221,8 +216,9 @@ struct spdk_scsi_dev *spdk_scsi_dev_construct(const char *name, void spdk_scsi_dev_delete_lun(struct spdk_scsi_dev *dev, struct spdk_scsi_lun *lun); -int spdk_scsi_port_construct(struct spdk_scsi_port *port, uint64_t id, - uint16_t index, const char *name); +struct spdk_scsi_port *spdk_scsi_port_create(uint64_t id, uint16_t index, const char *name); +void spdk_scsi_port_free(struct spdk_scsi_port **pport); +const char *spdk_scsi_port_get_name(const struct spdk_scsi_port *port); void spdk_scsi_task_construct(struct spdk_scsi_task *task, uint32_t *owner_task_ctr, diff --git a/lib/iscsi/conn.c b/lib/iscsi/conn.c index 06d485cce..da7dcd000 100644 --- a/lib/iscsi/conn.c +++ b/lib/iscsi/conn.c @@ -772,7 +772,7 @@ spdk_iscsi_drop_conns(struct spdk_iscsi_conn *conn, const char *conn_match, continue; xconn_match = - drop_all ? xconn->initiator_name : xconn->initiator_port->name; + drop_all ? xconn->initiator_name : spdk_scsi_port_get_name(xconn->initiator_port); if (!strcasecmp(conn_match, xconn_match) && conn->target == xconn->target) { @@ -1206,8 +1206,8 @@ spdk_iscsi_conn_handle_incoming_pdus(struct spdk_iscsi_conn *conn) spdk_put_pdu(pdu); if (rc != 0) { SPDK_ERRLOG("spdk_iscsi_execute() fatal error on %s(%s)\n", - conn->target_port != NULL ? conn->target_port->name : "NULL", - conn->initiator_port != NULL ? conn->initiator_port->name : "NULL"); + conn->target_port != NULL ? spdk_scsi_port_get_name(conn->target_port) : "NULL", + conn->initiator_port != NULL ? spdk_scsi_port_get_name(conn->initiator_port) : "NULL"); return rc; } } diff --git a/lib/iscsi/iscsi.c b/lib/iscsi/iscsi.c index 738d7cc52..38e216d08 100644 --- a/lib/iscsi/iscsi.c +++ b/lib/iscsi/iscsi.c @@ -1613,9 +1613,8 @@ spdk_iscsi_op_login_set_conn_info(struct spdk_iscsi_conn *conn, /* initialize parameters */ conn->StatSN = from_be32(&rsph->stat_sn); - spdk_scsi_port_construct(&conn->sess->initiator_port, - spdk_iscsi_get_isid(rsph->isid), 0, - initiator_port_name); + conn->sess->initiator_port = spdk_scsi_port_create(spdk_iscsi_get_isid(rsph->isid), 0, + initiator_port_name); conn->sess->isid = spdk_iscsi_get_isid(rsph->isid); conn->sess->target = target; @@ -1633,7 +1632,7 @@ spdk_iscsi_op_login_set_conn_info(struct spdk_iscsi_conn *conn, conn->sess->MaxCmdSN = rsp_pdu->cmd_sn + conn->sess->queue_depth - 1; } - conn->initiator_port = &conn->sess->initiator_port; + conn->initiator_port = conn->sess->initiator_port; return 0; } @@ -4437,6 +4436,7 @@ void spdk_free_sess(struct spdk_iscsi_sess *sess) sess->session_type = SESSION_TYPE_INVALID; spdk_iscsi_param_free(sess->params); free(sess->conns); + spdk_scsi_port_free(&sess->initiator_port); rte_mempool_put(g_spdk_iscsi.session_pool, (void *)sess); } @@ -4632,7 +4632,7 @@ spdk_append_iscsi_sess(struct spdk_iscsi_conn *conn, return -1; } if ((conn->portal->group->tag != sess->tag) || - (strcasecmp(initiator_port_name, sess->initiator_port.name) != 0) || + (strcasecmp(initiator_port_name, spdk_scsi_port_get_name(sess->initiator_port)) != 0) || (conn->target != sess->target)) { /* no match */ SPDK_ERRLOG("no MCS session for init port name=%s, tsih=%d, cid=%d\n", diff --git a/lib/iscsi/iscsi.h b/lib/iscsi/iscsi.h index 0a07bc450..03b03a2ef 100644 --- a/lib/iscsi/iscsi.h +++ b/lib/iscsi/iscsi.h @@ -232,7 +232,7 @@ struct spdk_iscsi_sess { uint32_t connections; struct spdk_iscsi_conn **conns; - struct spdk_scsi_port initiator_port; + struct spdk_scsi_port *initiator_port; int tag; uint64_t isid; diff --git a/lib/scsi/port.c b/lib/scsi/port.c index 14fc4a93d..fcee92d8b 100644 --- a/lib/scsi/port.c +++ b/lib/scsi/port.c @@ -34,6 +34,39 @@ #include "scsi_internal.h" +struct spdk_scsi_port * +spdk_scsi_port_create(uint64_t id, uint16_t index, const char *name) +{ + struct spdk_scsi_port *port; + + port = calloc(1, sizeof(struct spdk_scsi_port)); + + if (!port) { + return NULL; + } + + if (spdk_scsi_port_construct(port, id, index, name) != 0) { + spdk_scsi_port_free(&port); + return NULL; + } + + return port; +} + +void +spdk_scsi_port_free(struct spdk_scsi_port **pport) +{ + struct spdk_scsi_port *port; + + if (!pport) { + return; + } + + port = *pport; + *pport = NULL; + free(port); +} + int spdk_scsi_port_construct(struct spdk_scsi_port *port, uint64_t id, uint16_t index, const char *name) @@ -48,3 +81,9 @@ spdk_scsi_port_construct(struct spdk_scsi_port *port, uint64_t id, uint16_t inde snprintf(port->name, sizeof(port->name), "%s", name); return 0; } + +const char * +spdk_scsi_port_get_name(const struct spdk_scsi_port *port) +{ + return port->name; +} diff --git a/lib/scsi/scsi_internal.h b/lib/scsi/scsi_internal.h index 0c5bf1951..bce6d6a50 100644 --- a/lib/scsi/scsi_internal.h +++ b/lib/scsi/scsi_internal.h @@ -62,6 +62,13 @@ enum { SPDK_SCSI_TASK_PENDING, }; +struct spdk_scsi_port { + struct spdk_scsi_dev *dev; + uint64_t id; + uint16_t index; + char name[SPDK_SCSI_PORT_MAX_NAME_LENGTH]; +}; + struct spdk_scsi_dev { int id; int is_allocated; @@ -148,6 +155,9 @@ struct spdk_scsi_lun *spdk_lun_db_get_lun(const char *lun_name); struct spdk_scsi_dev *spdk_scsi_dev_get_list(void); +int spdk_scsi_port_construct(struct spdk_scsi_port *port, uint64_t id, + uint16_t index, const char *name); + int spdk_bdev_scsi_execute(struct spdk_bdev *bdev, struct spdk_scsi_task *task); int spdk_bdev_scsi_reset(struct spdk_bdev *bdev, struct spdk_scsi_task *task); diff --git a/test/lib/iscsi/common.c b/test/lib/iscsi/common.c index b7f78cfbf..63d44ea38 100644 --- a/test/lib/iscsi/common.c +++ b/test/lib/iscsi/common.c @@ -7,6 +7,8 @@ #include "spdk_internal/log.h" +#include "scsi/scsi_internal.h" + SPDK_LOG_REGISTER_TRACE_FLAG("iscsi", SPDK_TRACE_ISCSI) struct spdk_iscsi_task * @@ -77,13 +79,6 @@ spdk_scsi_dev_find_port_by_id(struct spdk_scsi_dev *dev, uint64_t id) return NULL; } -int -spdk_scsi_port_construct(struct spdk_scsi_port *port, uint64_t id, uint16_t index, - const char *name) -{ - return 0; -} - void spdk_scsi_dev_queue_mgmt_task(struct spdk_scsi_dev *dev, struct spdk_scsi_task *task) diff --git a/test/lib/iscsi/pdu/Makefile b/test/lib/iscsi/pdu/Makefile index 2f9d5d330..c0d28eaa4 100644 --- a/test/lib/iscsi/pdu/Makefile +++ b/test/lib/iscsi/pdu/Makefile @@ -42,7 +42,9 @@ CFLAGS += -I$(SPDK_ROOT_DIR)/test CFLAGS += -I$(SPDK_ROOT_DIR)/lib LIBS += $(SPDK_LIB_LINKER_ARGS) $(ENV_LINKER_ARGS) LIBS += -lcunit -lcrypto +SCSI_OBJS = port ISCSI_OBJS = iscsi crc32c md5 param +OBJS += $(SCSI_OBJS:%=$(SPDK_ROOT_DIR)/lib/scsi/%.o) OBJS += $(ISCSI_OBJS:%=$(SPDK_ROOT_DIR)/lib/iscsi/%.o) APP = pdu