scsi: make spdk_scsi_dev definition private

Change-Id: I62b36a22e11e845045f190886ae00aa644f96ec6
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Daniel Verkamp 2017-05-02 10:56:08 -07:00
parent 2686067166
commit a3738d9031
11 changed files with 117 additions and 42 deletions

View File

@ -170,18 +170,7 @@ struct spdk_scsi_port {
char name[SPDK_SCSI_PORT_MAX_NAME_LENGTH]; char name[SPDK_SCSI_PORT_MAX_NAME_LENGTH];
}; };
struct spdk_scsi_dev { 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];
};
/** /**
* \brief Represents a SCSI LUN. * \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); 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_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_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_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); void spdk_scsi_dev_queue_task(struct spdk_scsi_dev *dev, struct spdk_scsi_task *task);

View File

@ -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); spdk_iscsi_task_associate_pdu(task, pdu);
lun_i = spdk_islun2lun(lun); lun_i = spdk_islun2lun(lun);
dev = conn->dev; dev = conn->dev;
if (lun_i < dev->maxlun && lun_i < SPDK_SCSI_DEV_MAX_LUN) { task->scsi.lun = spdk_scsi_dev_get_lun(dev, lun_i);
task->scsi.lun = dev->lun[lun_i];
} else {
task->scsi.lun = NULL;
}
if ((R_bit != 0) && (W_bit != 0)) { if ((R_bit != 0) && (W_bit != 0)) {
SPDK_ERRLOG("Bidirectional CDB is not supported\n"); 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.target_port = conn->target_port;
task->scsi.initiator_port = conn->initiator_port; task->scsi.initiator_port = conn->initiator_port;
task->scsi.id = task_tag; task->scsi.id = task_tag;
if (lun_i < dev->maxlun && lun_i < SPDK_SCSI_DEV_MAX_LUN) { task->scsi.lun = spdk_scsi_dev_get_lun(dev, lun_i);
task->scsi.lun = dev->lun[lun_i];
}
switch (function) { switch (function) {
/* abort task identified by Referenced Task Tag field */ /* abort task identified by Referenced Task Tag field */

View File

@ -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_iscsi_globals *iscsi = &g_spdk_iscsi;
struct spdk_json_write_ctx *w; struct spdk_json_write_ctx *w;
size_t tgt_idx; size_t tgt_idx;
int i; int i, maxlun;
if (params != NULL) { if (params != NULL) {
spdk_jsonrpc_send_error_response(conn, id, SPDK_JSONRPC_ERROR_INVALID_PARAMS, 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_name(w, "luns");
spdk_json_write_array_begin(w); spdk_json_write_array_begin(w);
for (i = 0; i < tgtnode->dev->maxlun; i++) { maxlun = spdk_scsi_dev_get_max_lun(tgtnode->dev);
if (tgtnode->dev->lun[i]) { 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_object_begin(w);
spdk_json_write_name(w, "name"); 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_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); spdk_json_write_object_end(w);
} }
} }

View File

@ -234,6 +234,7 @@ static void
spdk_iscsi_config_dump_target_nodes(FILE *fp) spdk_iscsi_config_dump_target_nodes(FILE *fp)
{ {
int t = 0, l = 0, m = 0; int t = 0, l = 0, m = 0;
int maxlun;
struct spdk_scsi_dev *dev = NULL; struct spdk_scsi_dev *dev = NULL;
struct spdk_iscsi_tgt_node *target = NULL; struct spdk_iscsi_tgt_node *target = NULL;
@ -250,7 +251,7 @@ spdk_iscsi_config_dump_target_nodes(FILE *fp)
if (NULL == dev) continue; if (NULL == dev) continue;
idx = target->num; 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++) { for (m = 0; m < target->maxmap; m++) {
if (NULL == target->map[m].pg) continue; 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, fprintf(fp, TARGET_NODE_AUTH_TMPL,
authmethod, authgroup, usedigest); authmethod, authgroup, usedigest);
for (l = 0; l < dev->maxlun; l++) { maxlun = spdk_scsi_dev_get_max_lun(dev);
if (NULL == dev->lun[l]) continue; 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, fprintf(fp, TARGET_NODE_LUN_TMPL,
spdk_scsi_lun_get_id(dev->lun[l]), spdk_scsi_lun_get_id(lun),
spdk_scsi_lun_get_name(dev->lun[l])); spdk_scsi_lun_get_name(lun));
} }
fprintf(fp, TARGET_NODE_QD_TMPL, fprintf(fp, TARGET_NODE_QD_TMPL,

View File

@ -1067,11 +1067,14 @@ int
spdk_iscsi_tgt_node_cleanup_luns(struct spdk_iscsi_conn *conn, spdk_iscsi_tgt_node_cleanup_luns(struct spdk_iscsi_conn *conn,
struct spdk_iscsi_tgt_node *target) struct spdk_iscsi_tgt_node *target)
{ {
int i; int i, maxlun;
struct spdk_iscsi_task *task; struct spdk_iscsi_task *task;
for (i = 0; i < target->dev->maxlun; i++) { maxlun = spdk_scsi_dev_get_max_lun(target->dev);
if (!target->dev->lun[i]) for (i = 0; i < maxlun; i++) {
struct spdk_scsi_lun *lun = spdk_scsi_dev_get_lun(target->dev, i);
if (!lun)
continue; continue;
/* we create a fake management task per LUN to cleanup */ /* 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.type = SPDK_SCSI_TASK_TYPE_MANAGE;
task->scsi.target_port = conn->target_port; task->scsi.target_port = conn->target_port;
task->scsi.initiator_port = conn->initiator_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.function = SPDK_SCSI_TASK_FUNC_LUN_RESET;
task->scsi.cb_event = spdk_event_allocate(spdk_env_get_current_core(), task->scsi.cb_event = spdk_event_allocate(spdk_env_get_current_core(),

View File

@ -304,3 +304,31 @@ spdk_scsi_dev_allocate_io_channels(struct spdk_scsi_dev *dev)
return 0; 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];
}

View File

@ -62,6 +62,19 @@ enum {
SPDK_SCSI_TASK_PENDING, 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 { struct spdk_scsi_lun {
/** LUN id for this logical unit. */ /** LUN id for this logical unit. */
int id; int id;

View File

@ -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; 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 */ /* 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 static void

View File

@ -43,27 +43,31 @@
static void static void
json_scsi_dev_write(struct spdk_json_write_ctx *ctx, struct spdk_scsi_dev *dev) 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_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_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_name(ctx, "luns");
spdk_json_write_array_begin(ctx); spdk_json_write_array_begin(ctx);
for (l = 0; l < dev->maxlun; l++) { maxlun = spdk_scsi_dev_get_max_lun(dev);
if (NULL == dev->lun[l]) for (l = 0; l < maxlun; l++) {
struct spdk_scsi_lun *lun = spdk_scsi_dev_get_lun(dev, l);
if (!lun) {
continue; continue;
}
spdk_json_write_object_begin(ctx); spdk_json_write_object_begin(ctx);
spdk_json_write_name(ctx, "id"); 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_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); spdk_json_write_object_end(ctx);
} }

View File

@ -89,6 +89,16 @@ spdk_scsi_lun_get_id(const struct spdk_scsi_lun *lun)
return lun->id; 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 static void
maxburstlength_test(void) maxburstlength_test(void)
{ {

View File

@ -41,6 +41,7 @@
#include "../common.c" #include "../common.c"
#include "iscsi/tgt_node.c" #include "iscsi/tgt_node.c"
#include "scsi/scsi_internal.h"
struct spdk_iscsi_globals g_spdk_iscsi; struct spdk_iscsi_globals g_spdk_iscsi;
@ -64,6 +65,22 @@ spdk_iscsi_portal_grp_find_by_tag(int tag)
return NULL; 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 static void
config_file_fail_cases(void) config_file_fail_cases(void)
{ {