Commit 50ec7389 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Jim Harris
Browse files

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: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-on: https://review.gerrithub.io/389056


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent ea1c1579
Loading
Loading
Loading
Loading
+20 −19
Original line number Diff line number Diff line
@@ -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;
+16 −0
Original line number Diff line number Diff line
@@ -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)
{
+24 −0
Original line number Diff line number Diff line
@@ -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);