Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F148934460
D48595.id149719.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
16 KB
Referenced Files
None
Subscribers
None
D48595.id149719.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,12 +344,6 @@
void lun_set_size(struct lun *lun, size_t value);
void lun_set_ctl_lun(struct lun *lun, uint32_t value);
-struct option *option_new(struct options *os,
- 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);
int kernel_lun_modify(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,58 +1477,6 @@
lun->l_ctl_lun = value;
}
-struct option *
-option_new(struct options *options, const char *name, const char *value)
-{
- struct option *o;
-
- o = option_find(options, name);
- if (o != NULL) {
- log_warnx("duplicated option \"%s\"", name);
- return (NULL);
- }
-
- 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);
- }
-
- return (NULL);
-}
-
-void
-option_set(struct option *o, const char *value)
-{
-
- free(o->o_value);
- o->o_value = checked_strdup(value);
-}
-
#ifdef ICL_KERNEL_PROXY
static void
@@ -1590,6 +1535,20 @@
}
#if 0
+static void
+options_print(const char *prefix, nvlist_t *nvl)
+{
+ const char *name;
+ void *cookie;
+ int type;
+
+ cookie = NULL;
+ while ((name = nvlist_next(nvl, &type, &cookie)) != NULL) {
+ fprintf(stderr, "%soption %s %s\n", name,
+ nvlist_get_string(nvl, name));
+ }
+}
+
static void
conf_print(struct conf *conf)
{
@@ -1601,7 +1560,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 +1579,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) {
@@ -260,18 +251,8 @@
} 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);
str = NULL;
- STAILQ_INSERT_TAIL(&cur_lun->attr_list, nv, links);
}
free(str);
@@ -309,7 +290,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) {
@@ -386,18 +367,8 @@
} 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);
str = NULL;
- STAILQ_INSERT_TAIL(&cur_port->attr_list, nv, links);
}
free(str);
@@ -422,14 +393,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 len, retval, type;
bzero(&devlist, sizeof(devlist));
STAILQ_INIT(&devlist.lun_list);
@@ -615,26 +587,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 +629,39 @@
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, &type, &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,
- cl->l_name);
+ nvlist_add_string(cl->l_options, key,
+ nvlist_get_string(lun->attr_list, key));
}
}
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 +695,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 +714,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 +742,6 @@
int
kernel_lun_modify(struct lun *lun)
{
- struct option *o;
struct ctl_lun_req req;
int error;
@@ -818,43 +753,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);
- }
- }
+ 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);
}
@@ -862,7 +772,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 +948,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 +963,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 +975,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,13 +433,8 @@
portal_group_option: OPTION STR STR
{
- struct option *o;
-
- o = option_new(&portal_group->pg_options, $2, $3);
+ nvlist_move_string(portal_group->pg_options, $2, $3);
free($2);
- free($3);
- if (o == NULL)
- return (1);
}
;
@@ -1033,13 +1029,8 @@
lun_option: OPTION STR STR
{
- struct option *o;
-
- o = option_new(&lun->l_options, $2, $3);
+ nvlist_move_string(lun->l_options, $2, $3);
free($2);
- free($3);
- if (o == NULL)
- 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,7 +605,7 @@
while ((tmp = ucl_iterate_object(obj, &it2,
true))) {
- option_new(&portal_group->pg_options,
+ nvlist_add_string(portal_group->pg_options,
ucl_object_key(tmp),
ucl_object_tostring_forced(tmp));
}
@@ -937,7 +938,7 @@
while ((child = ucl_iterate_object(obj, &child_it,
true))) {
- option_new(&lun->l_options,
+ nvlist_add_string(lun->l_options,
ucl_object_key(child),
ucl_object_tostring_forced(child));
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Mar 22, 3:32 AM (3 h, 41 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30105504
Default Alt Text
D48595.id149719.diff (16 KB)
Attached To
Mode
D48595: ctld: Use nvlist instead of home-rolled name-value lists
Attached
Detach File
Event Timeline
Log In to Comment