summaryrefslogtreecommitdiffstats
path: root/usr.sbin
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2015-02-03 16:17:54 +0000
committermav <mav@FreeBSD.org>2015-02-03 16:17:54 +0000
commit4bbf5a53e0ad410f119cb2cb19979a6500a78d0b (patch)
treebc047d38b772f9e2084581fa32500f8f36a703ec /usr.sbin
parent4a166f3239c983d5729d90512ccfbf660c4f53d1 (diff)
downloadFreeBSD-src-4bbf5a53e0ad410f119cb2cb19979a6500a78d0b.zip
FreeBSD-src-4bbf5a53e0ad410f119cb2cb19979a6500a78d0b.tar.gz
Bring some more order into iSCSI portal group tags support.
While ctld(8) still does not allow multiple portal groups per target to be configured, kernel should now be able to handle it. MFC after: 2 weeks Sponsored by: iXsystems, Inc.
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/ctladm/ctladm.c1
-rw-r--r--usr.sbin/ctld/ctld.c17
-rw-r--r--usr.sbin/ctld/ctld.h1
-rw-r--r--usr.sbin/ctld/kernel.c8
4 files changed, 17 insertions, 10 deletions
diff --git a/usr.sbin/ctladm/ctladm.c b/usr.sbin/ctladm/ctladm.c
index 3351e3c..f2e933a 100644
--- a/usr.sbin/ctladm/ctladm.c
+++ b/usr.sbin/ctladm/ctladm.c
@@ -3542,6 +3542,7 @@ cctl_islist_end_element(void *user_data, const char *name)
} else if (strcmp(name, "target_alias") == 0) {
cur_conn->target_alias = str;
str = NULL;
+ } else if (strcmp(name, "target_portal_group_tag") == 0) {
} else if (strcmp(name, "header_digest") == 0) {
cur_conn->header_digest = str;
str = NULL;
diff --git a/usr.sbin/ctld/ctld.c b/usr.sbin/ctld/ctld.c
index 08e2905..c19b55a 100644
--- a/usr.sbin/ctld/ctld.c
+++ b/usr.sbin/ctld/ctld.c
@@ -59,6 +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 void
usage(void)
@@ -609,8 +610,7 @@ portal_group_new(struct conf *conf, const char *name)
pg->pg_name = checked_strdup(name);
TAILQ_INIT(&pg->pg_portals);
pg->pg_conf = conf;
- conf->conf_last_portal_group_tag++;
- pg->pg_tag = conf->conf_last_portal_group_tag;
+ pg->pg_tag = 0; /* Assigned later in conf_apply(). */
TAILQ_INSERT_TAIL(&conf->conf_portal_groups, pg, pg_next);
return (pg);
@@ -1655,6 +1655,17 @@ 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) {
+ oldpg = portal_group_find(oldconf, newpg->pg_name);
+ if (oldpg != NULL)
+ newpg->pg_tag = oldpg->pg_tag;
+ else
+ newpg->pg_tag = ++last_portal_group_tag;
+ }
+
/* Deregister on removed iSNS servers. */
TAILQ_FOREACH(oldns, &oldconf->conf_isns, i_next) {
TAILQ_FOREACH(newns, &newconf->conf_isns, i_next) {
@@ -2372,7 +2383,7 @@ main(int argc, char **argv)
log_debugx("exiting on signal; "
"reloading empty configuration");
- log_debugx("disabling CTL iSCSI port "
+ log_debugx("removing CTL iSCSI ports "
"and terminating all connections");
oldconf = newconf;
diff --git a/usr.sbin/ctld/ctld.h b/usr.sbin/ctld/ctld.h
index e082a41..251351d 100644
--- a/usr.sbin/ctld/ctld.h
+++ b/usr.sbin/ctld/ctld.h
@@ -180,7 +180,6 @@ struct conf {
int conf_timeout;
int conf_maxproc;
- uint16_t conf_last_portal_group_tag;
#ifdef ICL_KERNEL_PROXY
int conf_portal_id;
#endif
diff --git a/usr.sbin/ctld/kernel.c b/usr.sbin/ctld/kernel.c
index ae1b11d..0c5d2ce 100644
--- a/usr.sbin/ctld/kernel.c
+++ b/usr.sbin/ctld/kernel.c
@@ -913,12 +913,8 @@ kernel_port_remove(struct target *targ)
req.num_args = 2;
req.args = malloc(req.num_args * sizeof(*req.args));
str_arg(&req.args[0], "cfiscsi_target", targ->t_name);
- if (targ->t_portal_group) {
- snprintf(tagstr, sizeof(tagstr), "%d",
- targ->t_portal_group->pg_tag);
- str_arg(&req.args[1], "cfiscsi_portal_group_tag", tagstr);
- } else
- req.num_args--;
+ snprintf(tagstr, sizeof(tagstr), "%d", targ->t_portal_group->pg_tag);
+ str_arg(&req.args[1], "cfiscsi_portal_group_tag", tagstr);
error = ioctl(ctl_fd, CTL_PORT_REQ, &req);
free(req.args);
OpenPOWER on IntegriCloud