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:
parent
ea1c15791f
commit
50ec73894c
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user