Page MenuHomeFreeBSD

D48595.diff
No OneTemporary

D48595.diff

diff --git a/usr.sbin/ctld/ctld.h b/usr.sbin/ctld/ctld.h
--- a/usr.sbin/ctld/ctld.h
+++ b/usr.sbin/ctld/ctld.h
@@ -31,6 +31,7 @@
#ifndef CTLD_H
#define CTLD_H
+#include <sys/_nv.h>
#include <sys/queue.h>
#ifdef ICL_KERNEL_PROXY
#include <sys/types.h>
@@ -103,8 +104,6 @@
int p_socket;
};
-TAILQ_HEAD(options, option);
-
#define PG_FILTER_UNKNOWN 0
#define PG_FILTER_NONE 1
#define PG_FILTER_PORTAL 2
@@ -114,7 +113,7 @@
struct portal_group {
TAILQ_ENTRY(portal_group) pg_next;
struct conf *pg_conf;
- struct options pg_options;
+ nvlist_t *pg_options;
char *pg_name;
struct auth_group *pg_discovery_auth_group;
int pg_discovery_filter;
@@ -158,16 +157,10 @@
uint32_t p_ctl_port;
};
-struct option {
- TAILQ_ENTRY(option) o_next;
- char *o_name;
- char *o_value;
-};
-
struct lun {
TAILQ_ENTRY(lun) l_next;
struct conf *l_conf;
- struct options l_options;
+ nvlist_t *l_options;
char *l_name;
char *l_backend;
uint8_t l_device_type;
@@ -351,11 +344,8 @@
void lun_set_size(struct lun *lun, int64_t value);
void lun_set_ctl_lun(struct lun *lun, uint32_t value);
-struct option *option_new(struct options *os,
+bool option_new(nvlist_t *nvl,
const char *name, const char *value);
-void option_delete(struct options *os, struct option *co);
-struct option *option_find(const struct options *os, const char *name);
-void option_set(struct option *o, const char *value);
void kernel_init(void);
int kernel_lun_add(struct lun *lun);
diff --git a/usr.sbin/ctld/ctld.c b/usr.sbin/ctld/ctld.c
--- a/usr.sbin/ctld/ctld.c
+++ b/usr.sbin/ctld/ctld.c
@@ -30,6 +30,7 @@
*/
#include <sys/types.h>
+#include <sys/nv.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <sys/stat.h>
@@ -618,7 +619,7 @@
if (pg == NULL)
log_err(1, "calloc");
pg->pg_name = checked_strdup(name);
- TAILQ_INIT(&pg->pg_options);
+ pg->pg_options = nvlist_create(0);
TAILQ_INIT(&pg->pg_portals);
TAILQ_INIT(&pg->pg_ports);
pg->pg_conf = conf;
@@ -635,7 +636,6 @@
{
struct portal *portal, *tmp;
struct port *port, *tport;
- struct option *o, *otmp;
TAILQ_FOREACH_SAFE(port, &pg->pg_ports, p_pgs, tport)
port_delete(port);
@@ -643,8 +643,7 @@
TAILQ_FOREACH_SAFE(portal, &pg->pg_portals, p_next, tmp)
portal_delete(portal);
- TAILQ_FOREACH_SAFE(o, &pg->pg_options, o_next, otmp)
- option_delete(&pg->pg_options, o);
+ nvlist_destroy(pg->pg_options);
free(pg->pg_name);
free(pg->pg_offload);
free(pg->pg_redirection);
@@ -1371,7 +1370,7 @@
log_err(1, "calloc");
lun->l_conf = conf;
lun->l_name = checked_strdup(name);
- TAILQ_INIT(&lun->l_options);
+ lun->l_options = nvlist_create(0);
TAILQ_INSERT_TAIL(&conf->conf_luns, lun, l_next);
lun->l_ctl_lun = -1;
@@ -1382,7 +1381,6 @@
lun_delete(struct lun *lun)
{
struct target *targ;
- struct option *o, *tmp;
int i;
TAILQ_FOREACH(targ, &lun->l_conf->conf_targets, t_next) {
@@ -1393,8 +1391,7 @@
}
TAILQ_REMOVE(&lun->l_conf->conf_luns, lun, l_next);
- TAILQ_FOREACH_SAFE(o, &lun->l_options, o_next, tmp)
- option_delete(&lun->l_options, o);
+ nvlist_destroy(lun->l_options);
free(lun->l_name);
free(lun->l_backend);
free(lun->l_device_id);
@@ -1480,56 +1477,23 @@
lun->l_ctl_lun = value;
}
-struct option *
-option_new(struct options *options, const char *name, const char *value)
+bool
+option_new(nvlist_t *nvl, const char *name, const char *value)
{
- struct option *o;
+ int error;
- o = option_find(options, name);
- if (o != NULL) {
+ if (nvlist_exists_string(nvl, name)) {
log_warnx("duplicated option \"%s\"", name);
- return (NULL);
+ return (false);
}
- o = calloc(1, sizeof(*o));
- if (o == NULL)
- log_err(1, "calloc");
- o->o_name = checked_strdup(name);
- o->o_value = checked_strdup(value);
- TAILQ_INSERT_TAIL(options, o, o_next);
-
- return (o);
-}
-
-void
-option_delete(struct options *options, struct option *o)
-{
-
- TAILQ_REMOVE(options, o, o_next);
- free(o->o_name);
- free(o->o_value);
- free(o);
-}
-
-struct option *
-option_find(const struct options *options, const char *name)
-{
- struct option *o;
-
- TAILQ_FOREACH(o, options, o_next) {
- if (strcmp(o->o_name, name) == 0)
- return (o);
+ nvlist_add_string(nvl, name, value);
+ error = nvlist_error(nvl);
+ if (error != 0) {
+ log_warnc(error, "failed to add option \"%s\"", name);
+ return (false);
}
-
- return (NULL);
-}
-
-void
-option_set(struct option *o, const char *value)
-{
-
- free(o->o_value);
- o->o_value = checked_strdup(value);
+ return (true);
}
#ifdef ICL_KERNEL_PROXY
@@ -1590,6 +1554,19 @@
}
#if 0
+static void
+options_print(const char *prefix, nvlist_t *nvl)
+{
+ const char *name;
+ void *cookie;
+
+ cookie = NULL;
+ while ((name = nvlist_next(nvl, NULL, &cookie)) != NULL) {
+ fprintf(stderr, "%soption %s %s\n", prefix, name,
+ nvlist_get_string(nvl, name));
+ }
+}
+
static void
conf_print(struct conf *conf)
{
@@ -1601,7 +1578,6 @@
struct portal *portal;
struct target *targ;
struct lun *lun;
- struct option *o;
TAILQ_FOREACH(ag, &conf->conf_auth_groups, ag_next) {
fprintf(stderr, "auth-group %s {\n", ag->ag_name);
@@ -1621,14 +1597,13 @@
fprintf(stderr, "portal-group %s {\n", pg->pg_name);
TAILQ_FOREACH(portal, &pg->pg_portals, p_next)
fprintf(stderr, "\t listen %s\n", portal->p_listen);
+ options_print("\t", pg->pg_options);
fprintf(stderr, "}\n");
}
TAILQ_FOREACH(lun, &conf->conf_luns, l_next) {
fprintf(stderr, "\tlun %s {\n", lun->l_name);
fprintf(stderr, "\t\tpath %s\n", lun->l_path);
- TAILQ_FOREACH(o, &lun->l_options, o_next)
- fprintf(stderr, "\t\toption %s %s\n",
- o->o_name, o->o_value);
+ options_print("\t\t", lun->l_options);
fprintf(stderr, "\t}\n");
}
TAILQ_FOREACH(targ, &conf->conf_targets, t_next) {
diff --git a/usr.sbin/ctld/kernel.c b/usr.sbin/ctld/kernel.c
--- a/usr.sbin/ctld/kernel.c
+++ b/usr.sbin/ctld/kernel.c
@@ -105,15 +105,6 @@
#endif
}
-/*
- * Name/value pair used for per-LUN attributes.
- */
-struct cctl_lun_nv {
- char *name;
- char *value;
- STAILQ_ENTRY(cctl_lun_nv) links;
-};
-
/*
* Backend LUN information.
*/
@@ -126,7 +117,7 @@
char *serial_number;
char *device_id;
char *ctld_name;
- STAILQ_HEAD(,cctl_lun_nv) attr_list;
+ nvlist_t *attr_list;
STAILQ_ENTRY(cctl_lun) links;
};
@@ -140,7 +131,7 @@
char *cfiscsi_target;
uint16_t cfiscsi_portal_group_tag;
char *ctld_portal_group_name;
- STAILQ_HEAD(,cctl_lun_nv) attr_list;
+ nvlist_t *attr_list;
STAILQ_ENTRY(cctl_port) links;
};
@@ -187,7 +178,7 @@
devlist->num_luns++;
devlist->cur_lun = cur_lun;
- STAILQ_INIT(&cur_lun->attr_list);
+ cur_lun->attr_list = nvlist_create(0);
STAILQ_INSERT_TAIL(&devlist->lun_list, cur_lun, links);
for (i = 0; attr[i] != NULL; i += 2) {
@@ -207,6 +198,7 @@
struct cctl_devlist_data *devlist;
struct cctl_lun *cur_lun;
char *str;
+ int error;
devlist = (struct cctl_devlist_data *)user_data;
cur_lun = devlist->cur_lun;
@@ -260,18 +252,12 @@
} else if (strcmp(name, "ctllunlist") == 0) {
/* Nothing. */
} else {
- struct cctl_lun_nv *nv;
-
- nv = calloc(1, sizeof(*nv));
- if (nv == NULL)
- log_err(1, "%s: can't allocate %zd bytes for nv pair",
- __func__, sizeof(*nv));
-
- nv->name = checked_strdup(name);
-
- nv->value = str;
+ nvlist_move_string(cur_lun->attr_list, name, str);
+ error = nvlist_error(cur_lun->attr_list);
+ if (error != 0)
+ log_errc(1, error, "%s: failed to add nv pair for %s",
+ __func__, name);
str = NULL;
- STAILQ_INSERT_TAIL(&cur_lun->attr_list, nv, links);
}
free(str);
@@ -309,7 +295,7 @@
devlist->num_ports++;
devlist->cur_port = cur_port;
- STAILQ_INIT(&cur_port->attr_list);
+ cur_port->attr_list = nvlist_create(0);
STAILQ_INSERT_TAIL(&devlist->port_list, cur_port, links);
for (i = 0; attr[i] != NULL; i += 2) {
@@ -329,6 +315,7 @@
struct cctl_devlist_data *devlist;
struct cctl_port *cur_port;
char *str;
+ int error;
devlist = (struct cctl_devlist_data *)user_data;
cur_port = devlist->cur_port;
@@ -386,18 +373,12 @@
} else if (strcmp(name, "ctlportlist") == 0) {
/* Nothing. */
} else {
- struct cctl_lun_nv *nv;
-
- nv = calloc(1, sizeof(*nv));
- if (nv == NULL)
- log_err(1, "%s: can't allocate %zd bytes for nv pair",
- __func__, sizeof(*nv));
-
- nv->name = checked_strdup(name);
-
- nv->value = str;
+ nvlist_move_string(cur_port->attr_list, name, str);
+ error = nvlist_error(cur_port->attr_list);
+ if (error != 0)
+ log_errc(1, error, "%s: failed to add nv pair for %s",
+ __func__, name);
str = NULL;
- STAILQ_INSERT_TAIL(&cur_port->attr_list, nv, links);
}
free(str);
@@ -422,14 +403,15 @@
struct pport *pp;
struct port *cp;
struct lun *cl;
- struct option *o;
struct ctl_lun_list list;
struct cctl_devlist_data devlist;
struct cctl_lun *lun;
struct cctl_port *port;
XML_Parser parser;
+ const char *key;
char *str, *name;
- int len, retval;
+ void *cookie;
+ int error, len, retval;
bzero(&devlist, sizeof(devlist));
STAILQ_INIT(&devlist.lun_list);
@@ -615,26 +597,17 @@
cp->p_ctl_port = port->port_id;
}
while ((port = STAILQ_FIRST(&devlist.port_list))) {
- struct cctl_lun_nv *nv;
-
STAILQ_REMOVE_HEAD(&devlist.port_list, links);
free(port->port_frontend);
free(port->port_name);
free(port->cfiscsi_target);
free(port->ctld_portal_group_name);
- while ((nv = STAILQ_FIRST(&port->attr_list))) {
- STAILQ_REMOVE_HEAD(&port->attr_list, links);
- free(nv->value);
- free(nv->name);
- free(nv);
- }
+ nvlist_destroy(port->attr_list);
free(port);
}
free(name);
STAILQ_FOREACH(lun, &devlist.lun_list, links) {
- struct cctl_lun_nv *nv;
-
if (lun->ctld_name == NULL) {
log_debugx("CTL lun %ju wasn't managed by ctld; "
"ignoring", (uintmax_t)lun->lun_id);
@@ -666,40 +639,45 @@
lun_set_size(cl, lun->size_blocks * cl->l_blocksize);
lun_set_ctl_lun(cl, lun->lun_id);
- STAILQ_FOREACH(nv, &lun->attr_list, links) {
- if (strcmp(nv->name, "file") == 0 ||
- strcmp(nv->name, "dev") == 0) {
- lun_set_path(cl, nv->value);
+ cookie = NULL;
+ while ((key = nvlist_next(lun->attr_list, NULL, &cookie)) !=
+ NULL) {
+ if (strcmp(key, "file") == 0 ||
+ strcmp(key, "dev") == 0) {
+ lun_set_path(cl,
+ nvlist_get_string(lun->attr_list, key));
continue;
}
- o = option_new(&cl->l_options, nv->name, nv->value);
- if (o == NULL)
- log_warnx("unable to add CTL lun option %s "
- "for CTL lun %ju \"%s\"",
- nv->name, (uintmax_t) lun->lun_id,
+ nvlist_add_string(cl->l_options, key,
+ nvlist_get_string(lun->attr_list, key));
+ error = nvlist_error(cl->l_options);
+ if (error != 0)
+ log_warnc(error, "unable to add CTL lun option "
+ "%s for CTL lun %ju \"%s\"",
+ key, (uintmax_t)lun->lun_id,
cl->l_name);
}
}
while ((lun = STAILQ_FIRST(&devlist.lun_list))) {
- struct cctl_lun_nv *nv;
-
STAILQ_REMOVE_HEAD(&devlist.lun_list, links);
- while ((nv = STAILQ_FIRST(&lun->attr_list))) {
- STAILQ_REMOVE_HEAD(&lun->attr_list, links);
- free(nv->value);
- free(nv->name);
- free(nv);
- }
+ nvlist_destroy(lun->attr_list);
free(lun);
}
return (conf);
}
+static void
+nvlist_replace_string(nvlist_t *nvl, const char *name, const char *value)
+{
+ if (nvlist_exists_string(nvl, name))
+ nvlist_free_string(nvl, name);
+ nvlist_add_string(nvl, name, value);
+}
+
int
kernel_lun_add(struct lun *lun)
{
- struct option *o;
struct ctl_lun_req req;
int error;
@@ -733,43 +711,18 @@
req.reqdata.create.flags |= CTL_LUN_FLAG_DEVID;
}
- if (lun->l_path != NULL) {
- o = option_find(&lun->l_options, "file");
- if (o != NULL) {
- option_set(o, lun->l_path);
- } else {
- o = option_new(&lun->l_options, "file", lun->l_path);
- assert(o != NULL);
- }
- }
+ if (lun->l_path != NULL)
+ nvlist_replace_string(lun->l_options, "file", lun->l_path);
- o = option_find(&lun->l_options, "ctld_name");
- if (o != NULL) {
- option_set(o, lun->l_name);
- } else {
- o = option_new(&lun->l_options, "ctld_name", lun->l_name);
- assert(o != NULL);
- }
+ nvlist_replace_string(lun->l_options, "ctld_name", lun->l_name);
- o = option_find(&lun->l_options, "scsiname");
- if (o == NULL && lun->l_scsiname != NULL) {
- o = option_new(&lun->l_options, "scsiname", lun->l_scsiname);
- assert(o != NULL);
- }
+ if (!nvlist_exists_string(lun->l_options, "scsiname") &&
+ lun->l_scsiname != NULL)
+ nvlist_add_string(lun->l_options, "scsiname", lun->l_scsiname);
- if (!TAILQ_EMPTY(&lun->l_options)) {
- req.args_nvl = nvlist_create(0);
- if (req.args_nvl == NULL) {
- log_warn("error allocating nvlist");
- return (1);
- }
-
- TAILQ_FOREACH(o, &lun->l_options, o_next)
- nvlist_add_string(req.args_nvl, o->o_name, o->o_value);
-
- req.args = nvlist_pack(req.args_nvl, &req.args_len);
+ if (!nvlist_empty(lun->l_options)) {
+ req.args = nvlist_pack(lun->l_options, &req.args_len);
if (req.args == NULL) {
- nvlist_destroy(req.args_nvl);
log_warn("error packing nvlist");
return (1);
}
@@ -777,7 +730,6 @@
error = ioctl(ctl_fd, CTL_LUN_REQ, &req);
free(req.args);
- nvlist_destroy(req.args_nvl);
if (error != 0) {
log_warn("error issuing CTL_LUN_REQ ioctl");
@@ -806,7 +758,6 @@
int
kernel_lun_modify(struct lun *lun)
{
- struct option *o;
struct ctl_lun_req req;
int error;
@@ -818,43 +769,18 @@
req.reqdata.modify.lun_id = lun->l_ctl_lun;
req.reqdata.modify.lun_size_bytes = lun->l_size;
- if (lun->l_path != NULL) {
- o = option_find(&lun->l_options, "file");
- if (o != NULL) {
- option_set(o, lun->l_path);
- } else {
- o = option_new(&lun->l_options, "file", lun->l_path);
- assert(o != NULL);
- }
- }
-
- o = option_find(&lun->l_options, "ctld_name");
- if (o != NULL) {
- option_set(o, lun->l_name);
- } else {
- o = option_new(&lun->l_options, "ctld_name", lun->l_name);
- assert(o != NULL);
- }
+ if (lun->l_path != NULL)
+ nvlist_replace_string(lun->l_options, "file", lun->l_path);
- o = option_find(&lun->l_options, "scsiname");
- if (o == NULL && lun->l_scsiname != NULL) {
- o = option_new(&lun->l_options, "scsiname", lun->l_scsiname);
- assert(o != NULL);
- }
+ nvlist_replace_string(lun->l_options, "ctld_name", lun->l_name);
- if (!TAILQ_EMPTY(&lun->l_options)) {
- req.args_nvl = nvlist_create(0);
- if (req.args_nvl == NULL) {
- log_warn("error allocating nvlist");
- return (1);
- }
-
- TAILQ_FOREACH(o, &lun->l_options, o_next)
- nvlist_add_string(req.args_nvl, o->o_name, o->o_value);
+ if (!nvlist_exists_string(lun->l_options, "scsiname") &&
+ lun->l_scsiname != NULL)
+ nvlist_add_string(lun->l_options, "scsiname", lun->l_scsiname);
- req.args = nvlist_pack(req.args_nvl, &req.args_len);
+ if (!nvlist_empty(lun->l_options)) {
+ req.args = nvlist_pack(lun->l_options, &req.args_len);
if (req.args == NULL) {
- nvlist_destroy(req.args_nvl);
log_warn("error packing nvlist");
return (1);
}
@@ -862,7 +788,6 @@
error = ioctl(ctl_fd, CTL_LUN_REQ, &req);
free(req.args);
- nvlist_destroy(req.args_nvl);
if (error != 0) {
log_warn("error issuing CTL_LUN_REQ ioctl");
@@ -1039,7 +964,6 @@
int
kernel_port_add(struct port *port)
{
- struct option *o;
struct ctl_port_entry entry;
struct ctl_req req;
struct ctl_lun_map lm;
@@ -1055,7 +979,7 @@
if (port->p_portal_group) {
strlcpy(req.driver, "iscsi", sizeof(req.driver));
- req.args_nvl = nvlist_create(0);
+ req.args_nvl = nvlist_clone(pg->pg_options);
nvlist_add_string(req.args_nvl, "cfiscsi_target",
targ->t_name);
nvlist_add_string(req.args_nvl,
@@ -1067,10 +991,6 @@
nvlist_add_string(req.args_nvl,
"cfiscsi_target_alias", targ->t_alias);
}
-
- TAILQ_FOREACH(o, &pg->pg_options, o_next)
- nvlist_add_string(req.args_nvl, o->o_name,
- o->o_value);
}
if (port->p_ioctl_port) {
diff --git a/usr.sbin/ctld/parse.y b/usr.sbin/ctld/parse.y
--- a/usr.sbin/ctld/parse.y
+++ b/usr.sbin/ctld/parse.y
@@ -29,8 +29,9 @@
* SUCH DAMAGE.
*/
-#include <sys/queue.h>
#include <sys/types.h>
+#include <sys/nv.h>
+#include <sys/queue.h>
#include <sys/stat.h>
#include <assert.h>
#include <stdio.h>
@@ -432,12 +433,12 @@
portal_group_option: OPTION STR STR
{
- struct option *o;
+ bool ok;
- o = option_new(&portal_group->pg_options, $2, $3);
+ ok = option_new(portal_group->pg_options, $2, $3);
free($2);
free($3);
- if (o == NULL)
+ if (!ok)
return (1);
}
;
@@ -1033,12 +1034,12 @@
lun_option: OPTION STR STR
{
- struct option *o;
+ bool ok;
- o = option_new(&lun->l_options, $2, $3);
+ ok = option_new(lun->l_options, $2, $3);
free($2);
free($3);
- if (o == NULL)
+ if (!ok)
return (1);
}
;
diff --git a/usr.sbin/ctld/uclparse.c b/usr.sbin/ctld/uclparse.c
--- a/usr.sbin/ctld/uclparse.c
+++ b/usr.sbin/ctld/uclparse.c
@@ -29,8 +29,9 @@
* SUCH DAMAGE.
*/
-#include <sys/queue.h>
#include <sys/types.h>
+#include <sys/nv.h>
+#include <sys/queue.h>
#include <assert.h>
#include <stdio.h>
#include <stdint.h>
@@ -604,9 +605,10 @@
while ((tmp = ucl_iterate_object(obj, &it2,
true))) {
- option_new(&portal_group->pg_options,
+ if (!option_new(portal_group->pg_options,
ucl_object_key(tmp),
- ucl_object_tostring_forced(tmp));
+ ucl_object_tostring_forced(tmp)))
+ return (false);
}
}
@@ -937,9 +939,10 @@
while ((child = ucl_iterate_object(obj, &child_it,
true))) {
- option_new(&lun->l_options,
+ if (!option_new(lun->l_options,
ucl_object_key(child),
- ucl_object_tostring_forced(child));
+ ucl_object_tostring_forced(child)))
+ return (false);
}
}

File Metadata

Mime Type
text/plain
Expires
Thu, Feb 27, 12:10 PM (15 h, 59 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16868355
Default Alt Text
D48595.diff (17 KB)

Event Timeline