Discovery: Create a list of portals for each discovered target.

Some targets return multiple TargetAddress for individual targets.
Create a linked list of addresses for each target instead of
failing the discovery process when this happens.
This commit is contained in:
Ronnie Sahlberg
2014-01-15 19:37:40 -08:00
parent 25078d0d91
commit 354f00fd4f
4 changed files with 47 additions and 15 deletions

View File

@@ -566,13 +566,13 @@ void discovery_cb(struct iscsi_context *iscsi, int status, void *command_data, v
}
for(addr=command_data; addr; addr=addr->next) {
printf("Target:%s Address:%s\n", addr->target_name, addr->target_address);
printf("Target:%s Address:%s\n", addr->target_name, addr->portals->portal);
}
addr=command_data;
clnt->has_discovered_target = 1;
clnt->target_name = strdup(addr->target_name);
clnt->target_address = strdup(addr->target_address);
clnt->target_address = strdup(addr->portals->portal);
printf("discovery complete, send logout command\n");

View File

@@ -474,10 +474,15 @@ EXTERN int iscsi_logout_sync(struct iscsi_context *iscsi);
EXTERN int iscsi_discovery_async(struct iscsi_context *iscsi, iscsi_command_cb cb,
void *private_data);
struct iscsi_target_portal {
struct iscsi_target_portal *next;
const char *portal;
};
struct iscsi_discovery_address {
struct iscsi_discovery_address *next;
const char *target_name;
const char *target_address;
struct iscsi_target_portal *portals;
};
/*

View File

@@ -93,8 +93,15 @@ iscsi_free_discovery_addresses(struct iscsi_context *iscsi, struct iscsi_discove
iscsi_free(iscsi, discard_const(addresses->target_name));
addresses->target_name = NULL;
iscsi_free(iscsi, discard_const(addresses->target_address));
addresses->target_address = NULL;
while (addresses->portals != NULL) {
struct iscsi_target_portal *next_portal = addresses->portals->next;
iscsi_free(iscsi, discard_const(addresses->portals->portal));
iscsi_free(iscsi, discard_const(addresses->portals));
addresses->portals = next_portal;
}
addresses->portals = NULL;
addresses->next = NULL;
iscsi_free(iscsi, addresses);
@@ -168,7 +175,9 @@ iscsi_process_text_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
target->next = targets;
targets = target;
} else if (!strncmp((char *)ptr, "TargetAddress=", 14)) {
if (targets == NULL || targets->target_address != NULL) {
struct iscsi_target_portal *portal;
if (targets == NULL) {
iscsi_set_error(iscsi, "Invalid discovery "
"reply");
pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL,
@@ -176,8 +185,21 @@ iscsi_process_text_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
iscsi_free_discovery_addresses(iscsi, targets);
return -1;
}
targets->target_address = iscsi_strdup(iscsi, (char *)ptr+14);
if (targets->target_address == NULL) {
portal = iscsi_zmalloc(iscsi, sizeof(struct iscsi_target_portal));
if (portal == NULL) {
iscsi_set_error(iscsi, "Failed to malloc "
"portal structure");
pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL,
pdu->private_data);
iscsi_free_discovery_addresses(iscsi, targets);
return -1;
}
portal->next = targets->portals;
targets->portals = portal;
portal->portal = iscsi_strdup(iscsi, (char *)ptr+14);
if (portal->portal == NULL) {
iscsi_set_error(iscsi, "Failed to allocate "
"data for new discovered "
"target address");

View File

@@ -256,13 +256,18 @@ void discovery_cb(struct iscsi_context *iscsi, int status, void *command_data, v
}
for(addr=command_data; addr; addr=addr->next) {
if (useurls == 1 && showluns == 0) {
printf("iscsi://%s/%s/0\n", addr->target_address, addr->target_name);
} else {
printf("Target:%s Portal:%s\n", addr->target_name, addr->target_address);
}
if (showluns != 0) {
list_luns(private_data, addr->target_name, addr->target_address);
struct iscsi_target_portal *portal = addr->portals;
while (portal != NULL) {
if (useurls == 1 && showluns == 0) {
printf("iscsi://%s/%s/0\n", portal->portal, addr->target_name);
} else {
printf("Target:%s Portal:%s\n", addr->target_name, portal->portal);
}
if (showluns != 0) {
list_luns(private_data, addr->target_name, portal->portal);
}
portal = portal->next;
}
}