Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F111034108
D48595.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
17 KB
Referenced Files
None
Subscribers
None
D48595.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D48595: ctld: Use nvlist instead of home-rolled name-value lists
Attached
Detach File
Event Timeline
Log In to Comment