diff --git a/include/spdk/scsi.h b/include/spdk/scsi.h index 0aa6c7954..39d9fb0c4 100644 --- a/include/spdk/scsi.h +++ b/include/spdk/scsi.h @@ -170,18 +170,7 @@ struct spdk_scsi_port { char name[SPDK_SCSI_PORT_MAX_NAME_LENGTH]; }; -struct spdk_scsi_dev { - int id; - int is_allocated; - - char name[SPDK_SCSI_DEV_MAX_NAME]; - - int maxlun; - struct spdk_scsi_lun *lun[SPDK_SCSI_DEV_MAX_LUN]; - - int num_ports; - struct spdk_scsi_port port[SPDK_SCSI_DEV_MAX_PORTS]; -}; +struct spdk_scsi_dev; /** * \brief Represents a SCSI LUN. @@ -197,6 +186,10 @@ struct spdk_scsi_lun; int spdk_scsi_lun_get_id(const struct spdk_scsi_lun *lun); const char *spdk_scsi_lun_get_name(const struct spdk_scsi_lun *lun); +const char *spdk_scsi_dev_get_name(const struct spdk_scsi_dev *dev); +int spdk_scsi_dev_get_id(const struct spdk_scsi_dev *dev); +int spdk_scsi_dev_get_max_lun(const struct spdk_scsi_dev *dev); +struct spdk_scsi_lun *spdk_scsi_dev_get_lun(struct spdk_scsi_dev *dev, int lun_id); void spdk_scsi_dev_destruct(struct spdk_scsi_dev *dev); void spdk_scsi_dev_queue_mgmt_task(struct spdk_scsi_dev *dev, struct spdk_scsi_task *task); void spdk_scsi_dev_queue_task(struct spdk_scsi_dev *dev, struct spdk_scsi_task *task); diff --git a/lib/iscsi/iscsi.c b/lib/iscsi/iscsi.c index c559048a5..738d7cc52 100644 --- a/lib/iscsi/iscsi.c +++ b/lib/iscsi/iscsi.c @@ -2961,11 +2961,7 @@ spdk_iscsi_op_scsi(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu) spdk_iscsi_task_associate_pdu(task, pdu); lun_i = spdk_islun2lun(lun); dev = conn->dev; - if (lun_i < dev->maxlun && lun_i < SPDK_SCSI_DEV_MAX_LUN) { - task->scsi.lun = dev->lun[lun_i]; - } else { - task->scsi.lun = NULL; - } + task->scsi.lun = spdk_scsi_dev_get_lun(dev, lun_i); if ((R_bit != 0) && (W_bit != 0)) { SPDK_ERRLOG("Bidirectional CDB is not supported\n"); @@ -3283,9 +3279,7 @@ spdk_iscsi_op_task(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu) task->scsi.target_port = conn->target_port; task->scsi.initiator_port = conn->initiator_port; task->scsi.id = task_tag; - if (lun_i < dev->maxlun && lun_i < SPDK_SCSI_DEV_MAX_LUN) { - task->scsi.lun = dev->lun[lun_i]; - } + task->scsi.lun = spdk_scsi_dev_get_lun(dev, lun_i); switch (function) { /* abort task identified by Referenced Task Tag field */ diff --git a/lib/iscsi/iscsi_rpc.c b/lib/iscsi/iscsi_rpc.c index 9e6eb8455..33faaa151 100644 --- a/lib/iscsi/iscsi_rpc.c +++ b/lib/iscsi/iscsi_rpc.c @@ -299,7 +299,7 @@ spdk_rpc_get_target_nodes(struct spdk_jsonrpc_server_conn *conn, struct spdk_iscsi_globals *iscsi = &g_spdk_iscsi; struct spdk_json_write_ctx *w; size_t tgt_idx; - int i; + int i, maxlun; if (params != NULL) { spdk_jsonrpc_send_error_response(conn, id, SPDK_JSONRPC_ERROR_INVALID_PARAMS, @@ -345,13 +345,16 @@ spdk_rpc_get_target_nodes(struct spdk_jsonrpc_server_conn *conn, spdk_json_write_name(w, "luns"); spdk_json_write_array_begin(w); - for (i = 0; i < tgtnode->dev->maxlun; i++) { - if (tgtnode->dev->lun[i]) { + maxlun = spdk_scsi_dev_get_max_lun(tgtnode->dev); + for (i = 0; i < maxlun; i++) { + struct spdk_scsi_lun *lun = spdk_scsi_dev_get_lun(tgtnode->dev, i); + + if (lun) { spdk_json_write_object_begin(w); spdk_json_write_name(w, "name"); - spdk_json_write_string(w, spdk_scsi_lun_get_name(tgtnode->dev->lun[i])); + spdk_json_write_string(w, spdk_scsi_lun_get_name(lun)); spdk_json_write_name(w, "id"); - spdk_json_write_int32(w, spdk_scsi_lun_get_id(tgtnode->dev->lun[i])); + spdk_json_write_int32(w, spdk_scsi_lun_get_id(lun)); spdk_json_write_object_end(w); } } diff --git a/lib/iscsi/iscsi_subsystem.c b/lib/iscsi/iscsi_subsystem.c index 2e9471c30..befe14e0a 100644 --- a/lib/iscsi/iscsi_subsystem.c +++ b/lib/iscsi/iscsi_subsystem.c @@ -234,6 +234,7 @@ static void spdk_iscsi_config_dump_target_nodes(FILE *fp) { int t = 0, l = 0, m = 0; + int maxlun; struct spdk_scsi_dev *dev = NULL; struct spdk_iscsi_tgt_node *target = NULL; @@ -250,7 +251,7 @@ spdk_iscsi_config_dump_target_nodes(FILE *fp) if (NULL == dev) continue; idx = target->num; - fprintf(fp, TARGET_NODE_TMPL, idx, idx, target->name, dev->name); + fprintf(fp, TARGET_NODE_TMPL, idx, idx, target->name, spdk_scsi_dev_get_name(dev)); for (m = 0; m < target->maxmap; m++) { if (NULL == target->map[m].pg) continue; @@ -285,12 +286,17 @@ spdk_iscsi_config_dump_target_nodes(FILE *fp) fprintf(fp, TARGET_NODE_AUTH_TMPL, authmethod, authgroup, usedigest); - for (l = 0; l < dev->maxlun; l++) { - if (NULL == dev->lun[l]) continue; + maxlun = spdk_scsi_dev_get_max_lun(dev); + for (l = 0; l < maxlun; l++) { + struct spdk_scsi_lun *lun = spdk_scsi_dev_get_lun(dev, l); + + if (!lun) { + continue; + } fprintf(fp, TARGET_NODE_LUN_TMPL, - spdk_scsi_lun_get_id(dev->lun[l]), - spdk_scsi_lun_get_name(dev->lun[l])); + spdk_scsi_lun_get_id(lun), + spdk_scsi_lun_get_name(lun)); } fprintf(fp, TARGET_NODE_QD_TMPL, diff --git a/lib/iscsi/tgt_node.c b/lib/iscsi/tgt_node.c index da2865ec5..b4d16626a 100644 --- a/lib/iscsi/tgt_node.c +++ b/lib/iscsi/tgt_node.c @@ -1067,11 +1067,14 @@ int spdk_iscsi_tgt_node_cleanup_luns(struct spdk_iscsi_conn *conn, struct spdk_iscsi_tgt_node *target) { - int i; + int i, maxlun; struct spdk_iscsi_task *task; - for (i = 0; i < target->dev->maxlun; i++) { - if (!target->dev->lun[i]) + maxlun = spdk_scsi_dev_get_max_lun(target->dev); + for (i = 0; i < maxlun; i++) { + struct spdk_scsi_lun *lun = spdk_scsi_dev_get_lun(target->dev, i); + + if (!lun) continue; /* we create a fake management task per LUN to cleanup */ @@ -1084,7 +1087,7 @@ spdk_iscsi_tgt_node_cleanup_luns(struct spdk_iscsi_conn *conn, task->scsi.type = SPDK_SCSI_TASK_TYPE_MANAGE; task->scsi.target_port = conn->target_port; task->scsi.initiator_port = conn->initiator_port; - task->scsi.lun = target->dev->lun[i]; + task->scsi.lun = lun; task->scsi.function = SPDK_SCSI_TASK_FUNC_LUN_RESET; task->scsi.cb_event = spdk_event_allocate(spdk_env_get_current_core(), diff --git a/lib/scsi/dev.c b/lib/scsi/dev.c index 41624fc55..f9d181208 100644 --- a/lib/scsi/dev.c +++ b/lib/scsi/dev.c @@ -304,3 +304,31 @@ spdk_scsi_dev_allocate_io_channels(struct spdk_scsi_dev *dev) return 0; } + +const char * +spdk_scsi_dev_get_name(const struct spdk_scsi_dev *dev) +{ + return dev->name; +} + +int +spdk_scsi_dev_get_id(const struct spdk_scsi_dev *dev) +{ + return dev->id; +} + +int +spdk_scsi_dev_get_max_lun(const struct spdk_scsi_dev *dev) +{ + return dev->maxlun; +} + +struct spdk_scsi_lun * +spdk_scsi_dev_get_lun(struct spdk_scsi_dev *dev, int lun_id) +{ + if (lun_id < 0 || lun_id > dev->maxlun) { + return NULL; + } + + return dev->lun[lun_id]; +} diff --git a/lib/scsi/scsi_internal.h b/lib/scsi/scsi_internal.h index 9ed03451e..0c5bf1951 100644 --- a/lib/scsi/scsi_internal.h +++ b/lib/scsi/scsi_internal.h @@ -62,6 +62,19 @@ enum { SPDK_SCSI_TASK_PENDING, }; +struct spdk_scsi_dev { + int id; + int is_allocated; + + char name[SPDK_SCSI_DEV_MAX_NAME]; + + int maxlun; + struct spdk_scsi_lun *lun[SPDK_SCSI_DEV_MAX_LUN]; + + int num_ports; + struct spdk_scsi_port port[SPDK_SCSI_DEV_MAX_PORTS]; +}; + struct spdk_scsi_lun { /** LUN id for this logical unit. */ int id; diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c index f9d714712..2686f8ab9 100644 --- a/lib/vhost/vhost.c +++ b/lib/vhost/vhost.c @@ -303,7 +303,11 @@ get_scsi_lun(struct spdk_scsi_dev *scsi_dev, const __u8 *lun) uint16_t lun_id = (((uint16_t)lun[2] << 8) | lun[3]) & 0x3FFF; /* For now only one LUN per controller is allowed so no need to search LUN IDs */ - return likely(scsi_dev != NULL && lun_id < scsi_dev->maxlun) ? scsi_dev->lun[lun_id] : NULL; + if (likely(scsi_dev != NULL)) { + return spdk_scsi_dev_get_lun(scsi_dev, lun_id); + } + + return NULL; } static void diff --git a/lib/vhost/vhost_rpc.c b/lib/vhost/vhost_rpc.c index 54aa03b8e..fabe0ffce 100644 --- a/lib/vhost/vhost_rpc.c +++ b/lib/vhost/vhost_rpc.c @@ -43,27 +43,31 @@ static void json_scsi_dev_write(struct spdk_json_write_ctx *ctx, struct spdk_scsi_dev *dev) { - int l; + int l, maxlun; spdk_json_write_name(ctx, "id"); - spdk_json_write_int32(ctx, (int32_t)dev->id); + spdk_json_write_int32(ctx, spdk_scsi_dev_get_id(dev)); spdk_json_write_name(ctx, "device_name"); - spdk_json_write_string(ctx, dev->name); + spdk_json_write_string(ctx, spdk_scsi_dev_get_name(dev)); spdk_json_write_name(ctx, "luns"); spdk_json_write_array_begin(ctx); - for (l = 0; l < dev->maxlun; l++) { - if (NULL == dev->lun[l]) + maxlun = spdk_scsi_dev_get_max_lun(dev); + for (l = 0; l < maxlun; l++) { + struct spdk_scsi_lun *lun = spdk_scsi_dev_get_lun(dev, l); + + if (!lun) { continue; + } spdk_json_write_object_begin(ctx); spdk_json_write_name(ctx, "id"); - spdk_json_write_int32(ctx, spdk_scsi_lun_get_id(dev->lun[l])); + spdk_json_write_int32(ctx, spdk_scsi_lun_get_id(lun)); spdk_json_write_name(ctx, "name"); - spdk_json_write_string(ctx, spdk_scsi_lun_get_name(dev->lun[l])); + spdk_json_write_string(ctx, spdk_scsi_lun_get_name(lun)); spdk_json_write_object_end(ctx); } diff --git a/test/lib/iscsi/pdu/pdu.c b/test/lib/iscsi/pdu/pdu.c index 68200e24e..d6720244f 100644 --- a/test/lib/iscsi/pdu/pdu.c +++ b/test/lib/iscsi/pdu/pdu.c @@ -89,6 +89,16 @@ spdk_scsi_lun_get_id(const struct spdk_scsi_lun *lun) return lun->id; } +struct spdk_scsi_lun * +spdk_scsi_dev_get_lun(struct spdk_scsi_dev *dev, int lun_id) +{ + if (lun_id < 0 || lun_id > dev->maxlun) { + return NULL; + } + + return dev->lun[lun_id]; +} + static void maxburstlength_test(void) { diff --git a/test/lib/iscsi/target_node/target_node_ut.c b/test/lib/iscsi/target_node/target_node_ut.c index 7f09c4912..34b419ce7 100644 --- a/test/lib/iscsi/target_node/target_node_ut.c +++ b/test/lib/iscsi/target_node/target_node_ut.c @@ -41,6 +41,7 @@ #include "../common.c" #include "iscsi/tgt_node.c" +#include "scsi/scsi_internal.h" struct spdk_iscsi_globals g_spdk_iscsi; @@ -64,6 +65,22 @@ spdk_iscsi_portal_grp_find_by_tag(int tag) return NULL; } +int +spdk_scsi_dev_get_max_lun(const struct spdk_scsi_dev *dev) +{ + return dev->maxlun; +} + +struct spdk_scsi_lun * +spdk_scsi_dev_get_lun(struct spdk_scsi_dev *dev, int lun_id) +{ + if (lun_id < 0 || lun_id > dev->maxlun) { + return NULL; + } + + return dev->lun[lun_id]; +} + static void config_file_fail_cases(void) {