iscsi: Support SCSI port removal when PG map is removed

Currently even if PG mapping is removed from iSCSI target,
corresponding SCSI port is not removed. Hence dynamic
reconfiguration of PG to existing iSCSI target is not supported.

This patch supports dynamic SCSI port removal when the
corresponding PG mapping is removed from the existing target.

Some refactoring for SCSI port addition is also done

Change-Id: Ib06bc10743eb088d023f425742e39bb24f1b0df1
Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-on: https://review.gerrithub.io/389056
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Shuhei Matsumoto 2017-12-05 15:42:37 +09:00 committed by Jim Harris
parent ea1c15791f
commit 50ec73894c
3 changed files with 60 additions and 19 deletions

View File

@ -523,16 +523,32 @@ spdk_iscsi_tgt_node_add_pg_map(struct spdk_iscsi_tgt_node *target,
struct spdk_iscsi_portal_grp *pg)
{
struct spdk_iscsi_pg_map *pg_map;
char port_name[MAX_TMPBUF];
int rc;
if (spdk_iscsi_tgt_node_find_pg_map(target, pg) != NULL) {
return NULL;
}
if (target->num_pg_maps >= SPDK_SCSI_DEV_MAX_PORTS) {
SPDK_ERRLOG("Number of PG maps is more than allowed (max=%d)\n",
SPDK_SCSI_DEV_MAX_PORTS);
return NULL;
}
pg_map = malloc(sizeof(*pg_map));
if (pg_map == NULL) {
return NULL;
}
snprintf(port_name, sizeof(port_name), "%s,t,0x%4.4x",
spdk_scsi_dev_get_name(target->dev), pg->tag);
rc = spdk_scsi_dev_add_port(target->dev, pg->tag, port_name);
if (rc != 0) {
free(pg_map);
return NULL;
}
TAILQ_INIT(&pg_map->ig_map_head);
pg_map->num_ig_maps = 0;
pg->ref++;
@ -550,6 +566,9 @@ _spdk_iscsi_tgt_node_delete_pg_map(struct spdk_iscsi_tgt_node *target,
TAILQ_REMOVE(&target->pg_map_head, pg_map, tailq);
target->num_pg_maps--;
pg_map->pg->ref--;
spdk_scsi_dev_delete_port(target->dev, pg_map->pg->tag);
free(pg_map);
}
@ -716,11 +735,8 @@ spdk_iscsi_tgt_node_construct(int target_index,
int auth_chap_disabled, int auth_chap_required, int auth_chap_mutual, int auth_group,
int header_digest, int data_digest)
{
char fullname[MAX_TMPBUF], port_name[MAX_TMPBUF];
char fullname[MAX_TMPBUF];
struct spdk_iscsi_tgt_node *target;
struct spdk_iscsi_portal_grp *pg;
struct spdk_iscsi_pg_map *pg_map;
int num_unique_portal_groups;
int i, rc;
if (auth_chap_disabled && auth_chap_required) {
@ -807,21 +823,6 @@ spdk_iscsi_tgt_node_construct(int target_index,
}
}
num_unique_portal_groups = 0;
TAILQ_FOREACH(pg_map, &target->pg_map_head, tailq) {
if (++num_unique_portal_groups > SPDK_SCSI_DEV_MAX_PORTS) {
SPDK_ERRLOG("too many unique portal groups\n");
spdk_iscsi_tgt_node_destruct(target);
return NULL;
}
pg = pg_map->pg;
snprintf(port_name, sizeof(port_name), "%s,t,0x%4.4x",
name, pg->tag);
spdk_scsi_dev_add_port(target->dev, pg->tag, port_name);
}
target->auth_chap_disabled = auth_chap_disabled;
target->auth_chap_required = auth_chap_required;
target->auth_chap_mutual = auth_chap_mutual;

View File

@ -89,6 +89,16 @@ spdk_scsi_dev_queue_mgmt_task(struct spdk_scsi_dev *dev,
{
}
const char *
spdk_scsi_dev_get_name(const struct spdk_scsi_dev *dev)
{
if (dev != NULL) {
return dev->name;
}
return NULL;
}
uint32_t
spdk_env_get_current_core(void)
{
@ -128,6 +138,12 @@ spdk_iscsi_drop_conns(struct spdk_iscsi_conn *conn, const char *conn_match,
return 0;
}
int
spdk_scsi_dev_delete_port(struct spdk_scsi_dev *dev, uint64_t id)
{
return 0;
}
void
spdk_shutdown_iscsi_conns(void)
{

View File

@ -186,6 +186,7 @@ node_access_allowed(void)
struct spdk_iscsi_portal portal;
struct spdk_iscsi_initiator_name iname;
struct spdk_iscsi_initiator_netmask imask;
struct spdk_scsi_dev scsi_dev;
struct spdk_iscsi_pg_map *pg_map;
char *iqn, *addr;
bool result;
@ -212,6 +213,11 @@ node_access_allowed(void)
memset(&tgtnode, 0, sizeof(struct spdk_iscsi_tgt_node));
tgtnode.name = "iqn.2017-10.spdk.io:0001";
TAILQ_INIT(&tgtnode.pg_map_head);
memset(&scsi_dev, 0, sizeof(struct spdk_scsi_dev));
strncpy(scsi_dev.name, "iqn.2017-10.spdk.io:0001", SPDK_SCSI_DEV_MAX_NAME);
tgtnode.dev = &scsi_dev;
pg_map = spdk_iscsi_tgt_node_add_pg_map(&tgtnode, &pg);
spdk_iscsi_pg_map_add_ig_map(pg_map, &ig);
@ -244,6 +250,7 @@ node_access_denied_by_empty_netmask(void)
struct spdk_iscsi_conn conn;
struct spdk_iscsi_portal portal;
struct spdk_iscsi_initiator_name iname;
struct spdk_scsi_dev scsi_dev;
struct spdk_iscsi_pg_map *pg_map;
char *iqn, *addr;
bool result;
@ -268,6 +275,11 @@ node_access_denied_by_empty_netmask(void)
memset(&tgtnode, 0, sizeof(struct spdk_iscsi_tgt_node));
tgtnode.name = "iqn.2017-10.spdk.io:0001";
TAILQ_INIT(&tgtnode.pg_map_head);
memset(&scsi_dev, 0, sizeof(struct spdk_scsi_dev));
strncpy(scsi_dev.name, "iqn.2017-10.spdk.io:0001", SPDK_SCSI_DEV_MAX_NAME);
tgtnode.dev = &scsi_dev;
pg_map = spdk_iscsi_tgt_node_add_pg_map(&tgtnode, &pg);
spdk_iscsi_pg_map_add_ig_map(pg_map, &ig);
@ -307,6 +319,7 @@ node_access_multi_initiator_groups_cases(void)
struct spdk_iscsi_init_grp ig1, ig2;
struct spdk_iscsi_initiator_name iname1, iname2;
struct spdk_iscsi_initiator_netmask imask1, imask2;
struct spdk_scsi_dev scsi_dev;
struct spdk_iscsi_pg_map *pg_map;
char *iqn, *addr;
bool result;
@ -315,6 +328,11 @@ node_access_multi_initiator_groups_cases(void)
memset(&tgtnode, 0, sizeof(struct spdk_iscsi_tgt_node));
tgtnode.name = IQN1;
TAILQ_INIT(&tgtnode.pg_map_head);
memset(&scsi_dev, 0, sizeof(struct spdk_scsi_dev));
strncpy(scsi_dev.name, IQN1, SPDK_SCSI_DEV_MAX_NAME);
tgtnode.dev = &scsi_dev;
pg_map = spdk_iscsi_tgt_node_add_pg_map(&tgtnode, &pg);
spdk_iscsi_pg_map_add_ig_map(pg_map, &ig1);
spdk_iscsi_pg_map_add_ig_map(pg_map, &ig2);
@ -553,12 +571,18 @@ allow_iscsi_name_multi_maps_case(void)
struct spdk_iscsi_init_grp ig;
struct spdk_iscsi_initiator_name iname;
struct spdk_iscsi_pg_map *pg_map1, *pg_map2;
struct spdk_scsi_dev scsi_dev;
char *iqn;
bool result;
/* target initialization */
memset(&tgtnode, 0, sizeof(struct spdk_iscsi_tgt_node));
TAILQ_INIT(&tgtnode.pg_map_head);
memset(&scsi_dev, 0, sizeof(struct spdk_scsi_dev));
strncpy(scsi_dev.name, IQN1, SPDK_SCSI_DEV_MAX_NAME);
tgtnode.dev = &scsi_dev;
pg_map1 = spdk_iscsi_tgt_node_add_pg_map(&tgtnode, &pg1);
pg_map2 = spdk_iscsi_tgt_node_add_pg_map(&tgtnode, &pg2);
spdk_iscsi_pg_map_add_ig_map(pg_map1, &ig);