aboutsummaryrefslogtreecommitdiff
path: root/stand/common
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2023-01-13 21:19:30 +0000
committerWarner Losh <imp@FreeBSD.org>2023-01-13 21:22:38 +0000
commitd1ea5017141ffecdb7ce97a3d97b27a6aabf8c4a (patch)
tree16d640e90e47ea425c7667a781c93f1d5c0e931c /stand/common
parentfd02192c3acaefeb62db11e0c10ab36240b79ba2 (diff)
stand: Separate base and cli parts of nvstore
zfs lives in libsa. However, it depends on nvstore (and other things) that are in common. Fix part of this layering violation by splitting nvstore into a libsa piece (which is the base implementation) and keeping a much smaller common piece (to implement the nvstore command). This just leaves zfs' knowledge of device names that's specific to common and its calling platform specific init code to resolve. Add a nvstore.h file for these two parts to communicate private things and move the public nvstore api from bootstrap.h to stand.h. Sponsored by: Netflix Reviewed by: tsoome, kevans Differential Revision: https://reviews.freebsd.org/D38043
Diffstat (limited to 'stand/common')
-rw-r--r--stand/common/bootstrap.h31
-rw-r--r--stand/common/nvstore.c132
2 files changed, 3 insertions, 160 deletions
diff --git a/stand/common/bootstrap.h b/stand/common/bootstrap.h
index 261eefaac943..cc22cbcb729d 100644
--- a/stand/common/bootstrap.h
+++ b/stand/common/bootstrap.h
@@ -381,37 +381,6 @@ extern struct arch_switch archsw;
/* This must be provided by the MD code, but should it be in the archsw? */
void delay(int delay);
-/*
- * nvstore API.
- */
-typedef int (nvstore_getter_cb_t)(void *, const char *, void **);
-typedef int (nvstore_setter_cb_t)(void *, int, const char *,
- const void *, size_t);
-typedef int (nvstore_setter_str_cb_t)(void *, const char *, const char *,
- const char *);
-typedef int (nvstore_unset_cb_t)(void *, const char *);
-typedef int (nvstore_print_cb_t)(void *, void *);
-typedef int (nvstore_iterate_cb_t)(void *, int (*)(void *, void *));
-
-typedef struct nvs_callbacks {
- nvstore_getter_cb_t *nvs_getter;
- nvstore_setter_cb_t *nvs_setter;
- nvstore_setter_str_cb_t *nvs_setter_str;
- nvstore_unset_cb_t *nvs_unset;
- nvstore_print_cb_t *nvs_print;
- nvstore_iterate_cb_t *nvs_iterate;
-} nvs_callbacks_t;
-
-int nvstore_init(const char *, nvs_callbacks_t *, void *);
-int nvstore_fini(const char *);
-void *nvstore_get_store(const char *);
-int nvstore_print(void *);
-int nvstore_get_var(void *, const char *, void **);
-int nvstore_set_var(void *, int, const char *, void *, size_t);
-int nvstore_set_var_from_string(void *, const char *, const char *,
- const char *);
-int nvstore_unset_var(void *, const char *);
-
/* common code to set currdev variable. */
int gen_setcurrdev(struct env_var *ev, int flags, const void *value);
int mount_currdev(struct env_var *, int, const void *);
diff --git a/stand/common/nvstore.c b/stand/common/nvstore.c
index c6d230584f9d..3cdb094c858f 100644
--- a/stand/common/nvstore.c
+++ b/stand/common/nvstore.c
@@ -29,138 +29,12 @@
* nvstore is abstraction layer to implement data read/write to different
* types of non-volatile storage.
*
- * User interfaces:
- * Provide mapping via environment: setenv/unsetenv/putenv. Access via
- * environment functions/commands is available once nvstore has
- * attached the backend and stored textual data is mapped to environment.
- *
- * Provide command "nvstore" to create new data instances.
- *
- * API: TBD.
- * nvstore_init(): attach new backend and create the environment mapping.
- * nvstore_fini: detach backend and unmap the related environment.
- *
- * The disk based storage, such as UFS file or ZFS bootenv label area, is
- * only accessible after root file system is set. Root file system change
- * will switch the back end storage.
+ * Provides cli command 'nvostre'
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdbool.h>
-#include <sys/queue.h>
-#include <bootstrap.h>
#include "stand.h"
-
-typedef struct nvstore {
- char *nvs_name;
- void *nvs_data;
- nvs_callbacks_t *nvs_cb;
- STAILQ_ENTRY(nvstore) nvs_next;
-} nvstore_t;
-
-typedef STAILQ_HEAD(store_list, nvstore) nvstore_list_t;
-
-nvstore_list_t stores = STAILQ_HEAD_INITIALIZER(stores);
-
-void *
-nvstore_get_store(const char *name)
-{
- nvstore_t *st;
-
- st = NULL;
-
- STAILQ_FOREACH(st, &stores, nvs_next) {
- if (strcmp(name, st->nvs_name) == 0)
- break;
- }
-
- return (st);
-}
-
-int
-nvstore_init(const char *name, nvs_callbacks_t *cb, void *data)
-{
- nvstore_t *st;
-
- st = nvstore_get_store(name);
- if (st != NULL)
- return (EEXIST);
-
- if ((st = malloc(sizeof (*st))) == NULL)
- return (ENOMEM);
-
- if ((st->nvs_name = strdup(name)) == NULL) {
- free(st);
- return (ENOMEM);
- }
-
- st->nvs_data = data;
- st->nvs_cb = cb;
-
- STAILQ_INSERT_TAIL(&stores, st, nvs_next);
- return (0);
-}
-
-int
-nvstore_fini(const char *name)
-{
- nvstore_t *st;
-
- st = nvstore_get_store(name);
- if (st == NULL)
- return (ENOENT);
-
- STAILQ_REMOVE(&stores, st, nvstore, nvs_next);
-
- free(st->nvs_name);
- free(st->nvs_data);
- free(st);
- return (0);
-}
-
-int
-nvstore_print(void *ptr)
-{
- nvstore_t *st = ptr;
-
- return (st->nvs_cb->nvs_iterate(st->nvs_data, st->nvs_cb->nvs_print));
-}
-
-int
-nvstore_get_var(void *ptr, const char *name, void **data)
-{
- nvstore_t *st = ptr;
-
- return (st->nvs_cb->nvs_getter(st->nvs_data, name, data));
-}
-
-int
-nvstore_set_var(void *ptr, int type, const char *name,
- void *data, size_t size)
-{
- nvstore_t *st = ptr;
-
- return (st->nvs_cb->nvs_setter(st->nvs_data, type, name, data, size));
-}
-
-int
-nvstore_set_var_from_string(void *ptr, const char *type, const char *name,
- const char *data)
-{
- nvstore_t *st = ptr;
-
- return (st->nvs_cb->nvs_setter_str(st->nvs_data, type, name, data));
-}
-
-int
-nvstore_unset_var(void *ptr, const char *name)
-{
- nvstore_t *st = ptr;
-
- return (st->nvs_cb->nvs_unset(st->nvs_data, name));
-}
+#include "nvstore.h"
+#include "bootstrap.h"
COMMAND_SET(nvstore, "nvstore", "manage non-volatile data", command_nvstore);