summaryrefslogtreecommitdiff
path: root/usr/src/lib/libpool/common/pool_internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libpool/common/pool_internal.h')
-rw-r--r--usr/src/lib/libpool/common/pool_internal.h476
1 files changed, 476 insertions, 0 deletions
diff --git a/usr/src/lib/libpool/common/pool_internal.h b/usr/src/lib/libpool/common/pool_internal.h
new file mode 100644
index 0000000..e172d23
--- /dev/null
+++ b/usr/src/lib/libpool/common/pool_internal.h
@@ -0,0 +1,476 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _POOL_INTERNAL_H
+#define _POOL_INTERNAL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <libnvpair.h>
+#include <stdarg.h>
+#include <sys/pool.h>
+#include <sys/pool_impl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This file contains the libpool internal definitions which are not
+ * directly related to the data access abstraction logic.
+ */
+
+/*
+ * Define the various query specifiers for use in the
+ * pool_connection_t query function, pc_exec_query.
+ */
+
+#define PEC_QRY_ANY (PEC_QRY_SYSTEM | PEC_QRY_POOL | PEC_QRY_RES | \
+ PEC_QRY_COMP)
+#define PEC_QRY_SYSTEM (1 << PEC_SYSTEM)
+#define PEC_QRY_POOL (1 << PEC_POOL)
+#define PEC_QRY_RES (PEC_QRY_RES_COMP | PEC_QRY_RES_AGG)
+#define PEC_QRY_RES_COMP (1 << PEC_RES_COMP)
+#define PEC_QRY_RES_AGG (1 << PEC_RES_AGG)
+#define PEC_QRY_COMP (1 << PEC_COMP)
+#define PEC_QRY_ELEM(e) (1 << pool_elem_class(e))
+
+/*
+ * Internal type conversion macros
+ */
+#define TO_ELEM(s) ((pool_elem_t *)s)
+/*
+ * Get the configuration to which the supplied element belongs.
+ */
+#define TO_CONF(s) (s->pe_conf)
+
+/*
+ * Known Data Store Types
+ */
+
+#define XML_DATA_STORE 0
+#define KERNEL_DATA_STORE 1
+
+/*
+ * Limits on pool values names and strings
+ */
+#define PV_NAME_MAX_LEN 1024
+#define PV_VALUE_MAX_LEN 1024
+
+/*
+ * CB_TAB_BUF_SIZE represents the maximum number of indents to which a
+ * char_buf_t is expected to grow. This value would need to be raised
+ * if it was ever exceeded. It is an arbitrary limit, but currently
+ * the implementation does not exceed a depth of 4.
+ */
+
+#define CB_TAB_BUF_SIZE 8
+#define CB_DEFAULT_LEN 256
+
+/*
+ * Helpful pset macros
+ */
+#define PSID_IS_SYSSET(psid) (psid == PS_NONE)
+#define POOL_SYSID_BAD (-2)
+#define POOL_SYSID_BAD_STRING "-2"
+
+/*
+ * Size of generated ref_id buffer
+ */
+
+#define KEY_BUFFER_SIZE 48
+
+/*
+ * Various useful constant strings which are often encountered
+ */
+extern const char *c_a_dtype;
+extern const char *c_name;
+extern const char *c_type;
+extern const char *c_ref_id;
+extern const char *c_max_prop;
+extern const char *c_min_prop;
+extern const char *c_size_prop;
+extern const char *c_sys_prop;
+
+/*
+ * The char_buf_t type is a very simple string implementation which
+ * makes it easier to manipulate complex character data.
+ */
+typedef struct char_buf
+{
+ size_t cb_size;
+ char *cb_buf;
+ char cb_tab_buf[CB_TAB_BUF_SIZE];
+} char_buf_t;
+
+/*
+ * libpool uses an opaque discriminated union type, pool_value_t, to
+ * contain values which are used to get/set properties on
+ * configuration components. Each value is strictly typed and the
+ * functions to manipulate these types are exported through the
+ * external interface.
+ */
+
+/*
+ * Initialize a pool_value_t
+ */
+#define POOL_VALUE_INITIALIZER /* = DEFAULT POOL VALUE */ \
+ {POC_INVAL, NULL, NULL }
+
+struct pool_value {
+ pool_value_class_t pv_class; /* Value type */
+ const char *pv_name; /* Value name */
+ union
+ {
+ uint64_t u;
+ int64_t i;
+ double d;
+ uchar_t b;
+ const char *s;
+ } pv_u;
+};
+
+/*
+ * The pool_prop_op_t structure is used to perform property specific validation
+ * when setting the values of properties in a plugin and when getting a property
+ * value which is not stored (i.e. it is generated dynamically by the plugin at
+ * access.
+ *
+ * - ppo_get_value will provide a value for the specified property
+ * - ppo_set_value will allow a provider to validate a value before setting it
+ */
+typedef struct pool_prop_op {
+ int (*ppo_get_value)(const pool_elem_t *, pool_value_t *);
+ int (*ppo_set_value)(pool_elem_t *, const pool_value_t *);
+} pool_prop_op_t;
+
+/*
+ * The pool_prop_t structure is used to hold all property related information
+ * for each property that a provider is interested in.
+ *
+ * - pp_pname is the name of the property
+ * - pp_value is the initial value of the property
+ * - pp_perms is an OR'd bitmap of the access characteristics for the property
+ * - pp_init is a function which initialises the value member of the property
+ * - pp_op is optional and supports access and validation of property values
+ */
+typedef struct pool_prop {
+ const char *pp_pname;
+ pool_value_t pp_value;
+ uint_t pp_perms;
+ int (*pp_init)(struct pool_prop *);
+ pool_prop_op_t pp_op;
+} pool_prop_t;
+
+/*
+ * log state
+ */
+enum log_state {
+ LS_DO,
+ LS_UNDO,
+ LS_RECOVER,
+ LS_FAIL
+};
+
+/*
+ * Forward declaration
+ */
+typedef struct log log_t;
+
+/*
+ * log item.
+ *
+ * Used to describe each operation which needs to be logged. When
+ * modifications are desired to the kernel, they are logged in the
+ * configuration log file. If the user commits the changes, then the
+ * log entries are processed in sequence. If rollback is called, the
+ * log is dismissed without being processed. If the commit operation
+ * fails, then the log is "rolled back" to undo the previously
+ * successful operations.
+ */
+typedef struct log_item {
+ log_t *li_log; /* Log containing this item */
+ int li_op; /* Type of operation */
+ void *li_details; /* Operation details */
+ struct log_item *li_next; /* List of log items */
+ struct log_item *li_prev; /* List of log items */
+ enum log_state li_state; /* Item state */
+} log_item_t;
+
+/*
+ * log.
+ *
+ * This maintains a list of log items. The sentinel is used to
+ * simplify processing around the "empty list". The state of the log
+ * indicates whether transactions are being processed normally, or
+ * whether recovery is in progress.
+ */
+struct log
+{
+ pool_conf_t *l_conf; /* Configuration for this log */
+ log_item_t *l_sentinel; /* Log sentinel */
+ enum log_state l_state; /* Log state */
+};
+
+
+/*
+ * log item action function type
+ */
+typedef int (*log_item_action_t)(log_item_t *);
+
+/*
+ * Get the max/min/size property value of a resource.
+ */
+extern int resource_get_max(const pool_resource_t *, uint64_t *);
+extern int resource_get_min(const pool_resource_t *, uint64_t *);
+extern int resource_get_size(const pool_resource_t *, uint64_t *);
+extern int resource_get_pinned(const pool_resource_t *,
+ uint64_t *);
+
+/*
+ * Element utility operations.
+ */
+extern char *elem_get_name(const pool_elem_t *);
+extern id_t elem_get_sysid(const pool_elem_t *);
+extern int elem_is_default(const pool_elem_t *);
+extern boolean_t elem_is_tmp(const pool_elem_t *);
+extern const pool_elem_t *get_default_elem(const pool_elem_t *);
+extern int qsort_elem_compare(const void *, const void *);
+
+/*
+ * Get the class of the supplied element.
+ */
+extern const char *pool_elem_class_string(const pool_elem_t *);
+extern const char *pool_resource_type_string(pool_resource_elem_class_t);
+extern const char *pool_component_type_string(pool_component_elem_class_t);
+
+/*
+ * Commit the supplied configuration to the system. This function
+ * attempts to make the system look like the supplied configuration.
+ */
+extern int pool_conf_commit_sys(pool_conf_t *, int);
+
+/*
+ * Allocate an XML/kernel connection to a data representation.
+ */
+extern int pool_xml_connection_alloc(pool_conf_t *, int);
+extern int pool_knl_connection_alloc(pool_conf_t *, int);
+
+/*
+ * Create/Destroy a pool component belonging to the supplied resource
+ */
+extern pool_component_t *pool_component_create(pool_conf_t *,
+ const pool_resource_t *, int64_t);
+extern int pool_component_destroy(pool_component_t *);
+
+/*
+ * Get/Set the owner (container) of a particular configuration
+ * element.
+ */
+extern pool_elem_t *pool_get_container(const pool_elem_t *);
+extern int pool_set_container(pool_elem_t *, pool_elem_t *);
+
+/*
+ * These functions are used for debugging. Setting the environment
+ * variable LIBPOOL_DEBUG to 1, enables these functions.
+ */
+extern void do_dprintf(const char *, va_list);
+extern void dprintf(const char *, ...);
+
+/*
+ * libpool maintains it's own error value, rather than further pollute
+ * errno, this function is used to set the current error value for
+ * retrieval.
+ */
+extern void pool_seterror(int);
+
+/*
+ * Element Class
+ */
+extern pool_elem_class_t pool_elem_class(const pool_elem_t *);
+extern pool_resource_elem_class_t pool_resource_elem_class(const pool_elem_t *);
+extern pool_component_elem_class_t pool_component_elem_class(const
+ pool_elem_t *);
+extern int pool_elem_same_class(const pool_elem_t *, const pool_elem_t *);
+extern pool_elem_class_t pool_elem_class_from_string(const char *);
+extern pool_resource_elem_class_t pool_resource_elem_class_from_string(const
+ char *);
+extern pool_component_elem_class_t pool_component_elem_class_from_string(const
+ char *);
+
+/*
+ * Element Equivalency
+ */
+extern int pool_elem_compare(const pool_elem_t *,
+ const pool_elem_t *);
+extern int pool_elem_compare_name(const pool_elem_t *,
+ const pool_elem_t *);
+
+/*
+ * Dynamic character buffers. Limited functionality but enough for our
+ * purposes.
+ */
+extern char_buf_t *alloc_char_buf(size_t);
+extern void free_char_buf(char_buf_t *);
+extern int set_char_buf(char_buf_t *, const char *, ...);
+extern int append_char_buf(char_buf_t *, const char *, ...);
+
+/*
+ * Internal functions for use with pool values.
+ */
+extern int pool_value_equal(pool_value_t *, pool_value_t *);
+extern int pool_value_from_nvpair(pool_value_t *, nvpair_t *);
+
+/*
+ * Check to ensure that the supplied string is a valid name for a pool
+ * element.
+ */
+extern int is_valid_name(const char *);
+
+/*
+ * Functions related to element prefix manipulation. You can get the
+ * prefix for a supplied element or find out if a supplied string is a
+ * valid prefix for a certain class of element.
+ */
+extern const char *elem_get_prefix(const pool_elem_t *);
+extern const char *is_a_known_prefix(pool_elem_class_t, const char *);
+
+/*
+ * Internal property manipulators
+ */
+extern int pool_put_ns_property(pool_elem_t *, const char *,
+ const pool_value_t *);
+extern int pool_put_any_property(pool_elem_t *, const char *,
+ const pool_value_t *);
+extern int pool_put_any_ns_property(pool_elem_t *, const char *,
+ const pool_value_t *);
+extern pool_value_class_t pool_get_ns_property(const pool_elem_t *,
+ const char *, pool_value_t *);
+extern int pool_walk_any_properties(pool_conf_t *, pool_elem_t *,
+ void *, int (*)(pool_conf_t *, pool_elem_t *, const char *,
+ pool_value_t *, void *), int);
+extern int pool_set_temporary(pool_conf_t *, pool_elem_t *);
+
+/*
+ * Namespace aware utility functions.
+ */
+extern const char *is_ns_property(const pool_elem_t *, const char *);
+extern const char *property_name_minus_ns(const pool_elem_t *,
+ const char *);
+
+/*
+ * Initialisation routines.
+ */
+extern void internal_init(void);
+
+/*
+ * Is the supplied configuration the dynamic configuration?
+ */
+extern int conf_is_dynamic(const pool_conf_t *);
+
+/*
+ * Update the library snapshot from the kernel
+ */
+extern int pool_knl_update(pool_conf_t *, int *);
+
+/*
+ * Resource property functions
+ */
+extern int resource_is_default(const pool_resource_t *);
+extern int resource_is_system(const pool_resource_t *);
+extern int resource_can_associate(const pool_resource_t *);
+extern const pool_resource_t *get_default_resource(const pool_resource_t *);
+extern pool_resource_t *resource_by_sysid(const pool_conf_t *, id_t,
+ const char *);
+
+/*
+ * Resource property provider functions
+ */
+extern uint_t pool_get_provider_count(void);
+extern const pool_prop_t *provider_get_props(const pool_elem_t *);
+extern const pool_prop_t *provider_get_prop(const pool_elem_t *,
+ const char *);
+extern int prop_is_stored(const pool_prop_t *);
+extern int prop_is_readonly(const pool_prop_t *);
+extern int prop_is_init(const pool_prop_t *);
+extern int prop_is_hidden(const pool_prop_t *);
+extern int prop_is_optional(const pool_prop_t *);
+
+/*
+ * Component property functions
+ */
+extern int cpu_is_requested(pool_component_t *);
+
+/*
+ * Simple initialisation routines for values used when initialising the
+ * property arrays for each plugin
+ * Return PO_SUCCESS/PO_FAIL to indicate success/failure
+ */
+extern int uint_init(pool_prop_t *, uint64_t);
+extern int int_init(pool_prop_t *, int64_t);
+extern int double_init(pool_prop_t *, double);
+extern int bool_init(pool_prop_t *, uchar_t);
+extern int string_init(pool_prop_t *, const char *);
+
+
+/*
+ * log functions
+ */
+extern log_t *log_alloc(pool_conf_t *);
+extern void log_free(log_t *);
+extern void log_empty(log_t *);
+extern int log_walk(log_t *, log_item_action_t);
+extern int log_reverse_walk(log_t *, log_item_action_t);
+extern uint_t log_size(log_t *);
+extern int log_append(log_t *, int, void *);
+
+/*
+ * log item functions
+ */
+extern log_item_t *log_item_alloc(log_t *, int, void *);
+extern int log_item_free(log_item_t *);
+
+extern int pool_validate_resource(const pool_conf_t *,
+ const char *, const char *, int64_t);
+
+/*
+ * String atom functions
+ */
+extern const char *atom_string(const char *);
+extern void atom_free(const char *);
+/*
+ * debugging functions
+ */
+#ifdef DEBUG
+extern void log_item_dprintf(log_item_t *);
+extern void pool_value_dprintf(const pool_value_t *);
+extern void pool_elem_dprintf(const pool_elem_t *);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _POOL_INTERNAL_H */