summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2015-06-28 09:41:10 +0000
committermav <mav@FreeBSD.org>2015-06-28 09:41:10 +0000
commit5c19f61c8d2600959b85f93785ff6d027486888c (patch)
treef34a3a3040c300004ea74434e2ec693154b9421f
parentffe8bc5e2d502fc2d027ef4e53b5e9904ae747df (diff)
downloadFreeBSD-src-5c19f61c8d2600959b85f93785ff6d027486888c.zip
FreeBSD-src-5c19f61c8d2600959b85f93785ff6d027486888c.tar.gz
MFC r284765, r284875:
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.
-rw-r--r--usr.sbin/ctld/ctl.conf.56
-rw-r--r--usr.sbin/ctld/kernel.c28
2 files changed, 27 insertions, 7 deletions
diff --git a/usr.sbin/ctld/ctl.conf.5 b/usr.sbin/ctld/ctl.conf.5
index 131f399..af50c0a 100644
--- a/usr.sbin/ctld/ctl.conf.5
+++ b/usr.sbin/ctld/ctl.conf.5
@@ -27,7 +27,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd April 19, 2015
+.Dd June 24, 2015
.Dt CTL.CONF 5
.Os
.Sh NAME
@@ -321,7 +321,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 Aq Ar address
diff --git a/usr.sbin/ctld/kernel.c b/usr.sbin/ctld/kernel.c
index 9638613..cde4486 100644
--- a/usr.sbin/ctld/kernel.c
+++ b/usr.sbin/ctld/kernel.c
@@ -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,28 @@ retry_port:
conf = conf_new();
+ name = NULL;
STAILQ_FOREACH(port, &devlist.port_list, links) {
+ if (name)
+ free(name);
+ 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 +576,8 @@ retry_port:
}
cp->p_ctl_port = port->port_id;
}
+ if (name)
+ free(name);
STAILQ_FOREACH(lun, &devlist.lun_list, links) {
struct cctl_lun_nv *nv;
OpenPOWER on IntegriCloud