Teach ctld about CTL's physical_port and virtual_port fields.

This allows ctld to work with isp(4) virtual ports, specifying them as
isp0/1, isp0/2, etc.  There are still problems on isp(4) layer with
disabling those ports after enabling, but hopefully they can be fixed.

MFC after:	3 days
Sponsored by:	iXsystems, Inc.
This commit is contained in:
Alexander Motin 2015-06-24 15:13:27 +00:00
parent ae1860cb89
commit d83595b2a8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=284765
2 changed files with 25 additions and 7 deletions

View File

@ -27,7 +27,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd April 19, 2015
.Dd June 24, 2015
.Dt CTL.CONF 5
.Os
.Sh NAME
@ -324,7 +324,9 @@ Optional second argument specifies auth group name for connections
to this specific portal group.
If second argument is not specified, target auth group is used.
.It Ic port Ar name
Assign specified CTL port (such as "isp0") to the target.
.It Ic port Ar name/pp
.It Ic port Ar name/pp/vp
Assign specified CTL port (such as "isp0" or "isp2/1") to the target.
On startup ctld configures LUN mapping and enables all assigned ports.
Each port can be assigned to only one target.
.It Ic redirect Ar address

View File

@ -122,6 +122,8 @@ struct cctl_lun {
struct cctl_port {
uint32_t port_id;
char *port_name;
int pp;
int vp;
int cfiscsi_state;
char *cfiscsi_target;
uint16_t cfiscsi_portal_group_tag;
@ -334,6 +336,10 @@ cctl_end_pelement(void *user_data, const char *name)
if (strcmp(name, "port_name") == 0) {
cur_port->port_name = str;
str = NULL;
} else if (strcmp(name, "physical_port") == 0) {
cur_port->pp = strtoul(str, NULL, 0);
} else if (strcmp(name, "virtual_port") == 0) {
cur_port->vp = strtoul(str, NULL, 0);
} else if (strcmp(name, "cfiscsi_target") == 0) {
cur_port->cfiscsi_target = str;
str = NULL;
@ -391,7 +397,7 @@ conf_new_from_kernel(void)
struct cctl_lun *lun;
struct cctl_port *port;
XML_Parser parser;
char *str;
char *str, *name;
int len, retval;
bzero(&devlist, sizeof(devlist));
@ -500,18 +506,26 @@ conf_new_from_kernel(void)
conf = conf_new();
name = NULL;
STAILQ_FOREACH(port, &devlist.port_list, links) {
if (port->pp == 0 && port->vp == 0)
name = checked_strdup(port->port_name);
else if (port->vp == 0)
asprintf(&name, "%s/%d", port->port_name, port->pp);
else
asprintf(&name, "%s/%d/%d", port->port_name, port->pp,
port->vp);
if (port->cfiscsi_target == NULL) {
log_debugx("CTL port %u \"%s\" wasn't managed by ctld; ",
port->port_id, port->port_name);
pp = pport_find(conf, port->port_name);
port->port_id, name);
pp = pport_find(conf, name);
if (pp == NULL) {
#if 0
log_debugx("found new kernel port %u \"%s\"",
port->port_id, port->port_name);
port->port_id, name);
#endif
pp = pport_new(conf, port->port_name, port->port_id);
pp = pport_new(conf, name, port->port_id);
if (pp == NULL) {
log_warnx("pport_new failed");
continue;
@ -560,6 +574,8 @@ conf_new_from_kernel(void)
}
cp->p_ctl_port = port->port_id;
}
if (name)
free(name);
STAILQ_FOREACH(lun, &devlist.lun_list, links) {
struct cctl_lun_nv *nv;