summaryrefslogtreecommitdiffstats
path: root/usr.sbin/ctld/ctld.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/ctld/ctld.c')
-rw-r--r--usr.sbin/ctld/ctld.c56
1 files changed, 37 insertions, 19 deletions
diff --git a/usr.sbin/ctld/ctld.c b/usr.sbin/ctld/ctld.c
index 24a1d41..90c7db8 100644
--- a/usr.sbin/ctld/ctld.c
+++ b/usr.sbin/ctld/ctld.c
@@ -59,7 +59,7 @@ static volatile bool sigterm_received = false;
static volatile bool sigalrm_received = false;
static int nchildren = 0;
-static uint16_t last_portal_group_tag = 0;
+static uint16_t last_portal_group_tag = 0xff;
static void
usage(void)
@@ -1132,7 +1132,7 @@ valid_iscsi_name(const char *name)
}
} else {
log_warnx("invalid target name \"%s\"; should start with "
- "either \".iqn\", \"eui.\", or \"naa.\"",
+ "either \"iqn.\", \"eui.\", or \"naa.\"",
name);
}
return (true);
@@ -1212,6 +1212,7 @@ port_new(struct conf *conf, struct target *target, struct portal_group *pg)
port->p_target = target;
TAILQ_INSERT_TAIL(&pg->pg_ports, port, p_pgs);
port->p_portal_group = pg;
+ port->p_foreign = pg->pg_foreign;
return (port);
}
@@ -1379,6 +1380,7 @@ lun_new(struct conf *conf, const char *name)
lun->l_name = checked_strdup(name);
TAILQ_INIT(&lun->l_options);
TAILQ_INSERT_TAIL(&conf->conf_luns, lun, l_next);
+ lun->l_ctl_lun = -1;
return (lun);
}
@@ -1437,6 +1439,13 @@ lun_set_blocksize(struct lun *lun, size_t value)
}
void
+lun_set_device_type(struct lun *lun, uint8_t value)
+{
+
+ lun->l_device_type = value;
+}
+
+void
lun_set_device_id(struct lun *lun, const char *value)
{
free(lun->l_device_id);
@@ -1635,7 +1644,10 @@ conf_verify_lun(struct lun *lun)
}
}
if (lun->l_blocksize == 0) {
- lun_set_blocksize(lun, DEFAULT_BLOCKSIZE);
+ if (lun->l_device_type == 5)
+ lun_set_blocksize(lun, DEFAULT_CD_BLOCKSIZE);
+ else
+ lun_set_blocksize(lun, DEFAULT_BLOCKSIZE);
} else if (lun->l_blocksize < 0) {
log_warnx("invalid blocksize for lun \"%s\"; "
"must be larger than 0", lun->l_name);
@@ -1717,14 +1729,16 @@ conf_verify(struct conf *conf)
if (pg->pg_discovery_filter == PG_FILTER_UNKNOWN)
pg->pg_discovery_filter = PG_FILTER_NONE;
- if (!TAILQ_EMPTY(&pg->pg_ports)) {
- if (pg->pg_redirection != NULL) {
+ if (pg->pg_redirection != NULL) {
+ if (!TAILQ_EMPTY(&pg->pg_ports)) {
log_debugx("portal-group \"%s\" assigned "
"to target, but configured "
"for redirection",
pg->pg_name);
}
pg->pg_unassigned = false;
+ } else if (!TAILQ_EMPTY(&pg->pg_ports)) {
+ pg->pg_unassigned = false;
} else {
if (strcmp(pg->pg_name, "default") != 0)
log_warnx("portal-group \"%s\" not assigned "
@@ -1818,6 +1832,8 @@ conf_apply(struct conf *oldconf, struct conf *newconf)
* Go through the new portal groups, assigning tags or preserving old.
*/
TAILQ_FOREACH(newpg, &newconf->conf_portal_groups, pg_next) {
+ if (newpg->pg_tag != 0)
+ continue;
oldpg = portal_group_find(oldconf, newpg->pg_name);
if (oldpg != NULL)
newpg->pg_tag = oldpg->pg_tag;
@@ -1847,8 +1863,10 @@ conf_apply(struct conf *oldconf, struct conf *newconf)
* and missing in the new one.
*/
TAILQ_FOREACH_SAFE(oldport, &oldconf->conf_ports, p_next, tmpport) {
+ if (oldport->p_foreign)
+ continue;
newport = port_find(newconf, oldport->p_name);
- if (newport != NULL)
+ if (newport != NULL && !newport->p_foreign)
continue;
log_debugx("removing port \"%s\"", oldport->p_name);
error = kernel_port_remove(oldport);
@@ -1944,18 +1962,14 @@ conf_apply(struct conf *oldconf, struct conf *newconf)
TAILQ_FOREACH_SAFE(newlun, &newconf->conf_luns, l_next, tmplun) {
oldlun = lun_find(oldconf, newlun->l_name);
if (oldlun != NULL) {
- if (newlun->l_size != oldlun->l_size ||
- newlun->l_size == 0) {
- log_debugx("resizing lun \"%s\", CTL lun %d",
+ log_debugx("modifying lun \"%s\", CTL lun %d",
+ newlun->l_name, newlun->l_ctl_lun);
+ error = kernel_lun_modify(newlun);
+ if (error != 0) {
+ log_warnx("failed to "
+ "modify lun \"%s\", CTL lun %d",
newlun->l_name, newlun->l_ctl_lun);
- error = kernel_lun_resize(newlun);
- if (error != 0) {
- log_warnx("failed to "
- "resize lun \"%s\", CTL lun %d",
- newlun->l_name,
- newlun->l_ctl_lun);
- cumulated_error++;
- }
+ cumulated_error++;
}
continue;
}
@@ -1972,15 +1986,17 @@ conf_apply(struct conf *oldconf, struct conf *newconf)
* Now add new ports or modify existing ones.
*/
TAILQ_FOREACH(newport, &newconf->conf_ports, p_next) {
+ if (newport->p_foreign)
+ continue;
oldport = port_find(oldconf, newport->p_name);
- if (oldport == NULL) {
+ if (oldport == NULL || oldport->p_foreign) {
log_debugx("adding port \"%s\"", newport->p_name);
error = kernel_port_add(newport);
} else {
log_debugx("updating port \"%s\"", newport->p_name);
newport->p_ctl_port = oldport->p_ctl_port;
- error = kernel_port_update(newport);
+ error = kernel_port_update(newport, oldport);
}
if (error != 0) {
log_warnx("failed to %s port %s",
@@ -1998,6 +2014,8 @@ conf_apply(struct conf *oldconf, struct conf *newconf)
* Go through the new portals, opening the sockets as neccessary.
*/
TAILQ_FOREACH(newpg, &newconf->conf_portal_groups, pg_next) {
+ if (newpg->pg_foreign)
+ continue;
if (newpg->pg_unassigned) {
log_debugx("not listening on portal-group \"%s\", "
"not assigned to any target",
OpenPOWER on IntegriCloud