Version 2.02.79 -
===================================
+ Add const for struct config_node usage.
Fix NULL pointer check in error path in clvmd do_command(). (2.02.78)
Fix device.c #include to ensure 64-bit fopen64 use. (2.02.51)
Create /var/run/lvm directory during clvmd initialisation if missing.
struct logical_volume *lv)
{
const struct config_node *cn;
- struct config_value *cv;
- char *str;
+ const struct config_value *cv;
+ const char *str;
char path[PATH_MAX];
if (!(cn = find_config_tree_node(cmd, "activation/volume_list"))) {
const char *read_ahead;
struct stat st;
const struct config_node *cn;
- struct config_value *cv;
+ const struct config_value *cv;
/* umask */
cmd->default_settings.umask = find_config_tree_int(cmd,
return 1;
}
-static int _check_host_filters(struct cmd_context *cmd, struct config_node *hn,
+static int _check_host_filters(struct cmd_context *cmd, const struct config_node *hn,
int *passes)
{
- struct config_node *cn;
- struct config_value *cv;
+ const struct config_node *cn;
+ const struct config_value *cv;
*passes = 1;
static int _init_dev_cache(struct cmd_context *cmd)
{
const struct config_node *cn;
- struct config_value *cv;
+ const struct config_value *cv;
init_dev_disable_after_error_count(
find_config_tree_int(cmd, "devices/disable_after_error_count",
if (!is_static() &&
(cn = find_config_tree_node(cmd, "global/format_libraries"))) {
- struct config_value *cv;
+ const struct config_value *cv;
struct format_type *(*init_format_fn) (struct cmd_context *);
void *lib;
if (!is_static() &&
(cn = find_config_tree_node(cmd, "global/segment_libraries"))) {
- struct config_value *cv;
+ const struct config_value *cv;
int (*init_multiple_segtypes_fn) (struct cmd_context *,
struct segtype_library *);
return 1;
}
-static int _write_value(struct output_line *outline, struct config_value *v)
+static int _write_value(struct output_line *outline, const struct config_value *v)
{
char *buf;
line_append("%s}", space);
} else {
/* it's a value */
- struct config_value *v = n->v;
+ const struct config_value *v = n->v;
line_append("=");
if (v->next) {
line_append("[");
int write_config_file(struct config_tree *cft, const char *file,
int argc, char **argv)
{
- struct config_node *cn;
+ const struct config_node *cn;
int r = 1;
struct output_line outline;
outline.fp = NULL;
{
/* [+-]{0,1}[0-9]+ | [0-9]*\.[0-9]* | ".*" */
struct config_value *v = _create_value(p->mem);
+ char *str;
if (!v)
return NULL;
v->type = CFG_STRING;
p->tb++, p->te--; /* strip "'s */
- if (!(v->v.str = _dup_tok(p)))
+ if (!(str = _dup_tok(p)))
return_0;
- unescape_double_quotes(v->v.str);
+ unescape_double_quotes(str);
+ v->v.str = str;
p->te++;
match(TOK_STRING_ESCAPED);
break;
/*
* utility functions
*/
-static struct config_node *_find_config_node(const struct config_node *cn,
- const char *path)
+static const struct config_node *_find_config_node(const struct config_node *cn,
+ const char *path)
{
const char *e;
const struct config_node *cn_found = NULL;
path = e;
}
- return (struct config_node *) cn_found;
+ return cn_found;
}
-static struct config_node *_find_first_config_node(const struct config_node *cn1,
- const struct config_node *cn2,
- const char *path)
+static const struct config_node *_find_first_config_node(const struct config_node *cn1,
+ const struct config_node *cn2,
+ const char *path)
{
- struct config_node *cn;
+ const struct config_node *cn;
if (cn1 && (cn = _find_config_node(cn1, path)))
return cn;
return NULL;
}
-struct config_node *find_config_node(const struct config_node *cn,
- const char *path)
+const struct config_node *find_config_node(const struct config_node *cn,
+ const char *path)
{
return _find_config_node(cn, path);
}
return _find_config_float(cn, NULL, path, fail);
}
-struct config_node *find_config_tree_node(struct cmd_context *cmd,
+const struct config_node *find_config_tree_node(struct cmd_context *cmd,
const char *path)
{
return _find_first_config_node(cmd->cft_override ? cmd->cft_override->root : NULL, cmd->cft->root, path);
const char *path, int fail)
{
const struct config_node *n = _find_first_config_node(cn1, cn2, path);
- struct config_value *v;
+ const struct config_value *v;
if (!n)
return fail;
}
int get_config_str(const struct config_node *cn, const char *path,
- char **result)
+ const char **result)
{
const struct config_node *n;
/* Ignore - we don't have any of these yet */
continue;
/* Not already present? */
- if (!(oldn = find_config_node(cn1->child, cn->key))) {
+ if (!(oldn = (struct config_node*)find_config_node(cn1->child, cn->key))) {
_insert_config_node(&cn1->child, cn);
continue;
}
}
}
-static int _match_host_tags(struct dm_list *tags, struct config_node *tn)
+static int _match_host_tags(struct dm_list *tags, const struct config_node *tn)
{
- struct config_value *tv;
+ const struct config_value *tv;
const char *str;
for (tv = tn->v; tv; tv = tv->next) {
int merge_config_tree(struct cmd_context *cmd, struct config_tree *cft,
struct config_tree *newdata)
{
- struct config_node *root = cft->root;
- struct config_node *cn, *nextn, *oldn, *tn, *cn2;
+ const struct config_node *root = cft->root;
+ struct config_node *cn, *nextn, *oldn, *cn2;
+ const struct config_node *tn;
for (cn = newdata->root; cn; cn = nextn) {
nextn = cn->sib;
if (!_match_host_tags(&cmd->tags, tn))
continue;
}
- if (!(oldn = find_config_node(root, cn->key))) {
+ if (!(oldn = (struct config_node *)find_config_node(root, cn->key))) {
_insert_config_node(&cft->root, cn);
/* Remove any "tags" nodes */
for (cn2 = cn->child; cn2; cn2 = cn2->sib) {
union {
int64_t i;
float r;
- char *str;
+ const char *str;
} v;
struct config_value *next; /* for arrays */
};
struct config_node {
- char *key;
+ const char *key;
struct config_node *parent, *sib, *child;
struct config_value *v;
};
int merge_config_tree(struct cmd_context *cmd, struct config_tree *cft,
struct config_tree *newdata);
-struct config_node *find_config_node(const struct config_node *cn,
- const char *path);
+const struct config_node *find_config_node(const struct config_node *cn,
+ const char *path);
const char *find_config_str(const struct config_node *cn, const char *path,
const char *fail);
int find_config_int(const struct config_node *cn, const char *path, int fail);
/*
* These versions check an override tree, if present, first.
*/
-struct config_node *find_config_tree_node(struct cmd_context *cmd,
- const char *path);
+const struct config_node *find_config_tree_node(struct cmd_context *cmd,
+ const char *path);
const char *find_config_tree_str(struct cmd_context *cmd,
const char *path, const char *fail);
int find_config_tree_int(struct cmd_context *cmd, const char *path,
uint64_t *result);
int get_config_str(const struct config_node *cn, const char *path,
- char **result);
+ const char **result);
unsigned maybe_config_section(const char *str, unsigned len);
static int _init_preferred_names(struct cmd_context *cmd)
{
const struct config_node *cn;
- struct config_value *v;
+ const struct config_value *v;
struct dm_pool *scratch = NULL;
char **regex;
unsigned count = 0;
const char *path, void *data)
{
const struct config_node *cn;
- struct config_value *cv;
+ const struct config_value *cv;
if (!(cn = find_config_node(cft->root, path))) {
log_very_verbose("Couldn't find %s array in '%s'",
return 1;
}
-static int _build_matcher(struct rfilter *rf, struct config_value *val)
+static int _build_matcher(struct rfilter *rf, const struct config_value *val)
{
struct dm_pool *scratch;
- struct config_value *v;
+ const struct config_value *v;
char **regex;
unsigned count = 0;
int i, r = 0;
dm_pool_destroy(rf->mem);
}
-struct dev_filter *regex_filter_create(struct config_value *patterns)
+struct dev_filter *regex_filter_create(const struct config_value *patterns)
{
struct dm_pool *mem = dm_pool_create("filter regex", 10 * 1024);
struct rfilter *rf;
* r|.*| - reject everything else
*/
-struct dev_filter *regex_filter_create(struct config_value *patterns);
+struct dev_filter *regex_filter_create(const struct config_value *patterns);
#endif
int line_maj = 0;
int blocksection = 0;
size_t dev_len = 0;
- struct config_value *cv;
- char *name;
+ const struct config_value *cv;
+ const char *name;
if (!*proc) {
return 1;
}
-int read_flags(uint64_t *status, int type, struct config_value *cv)
+int read_flags(uint64_t *status, int type, const struct config_value *cv)
{
int f;
uint64_t s = UINT64_C(0);
}
static int _get_config_disk_area(struct cmd_context *cmd,
- struct config_node *cn, struct dm_list *raw_list)
+ const struct config_node *cn, struct dm_list *raw_list)
{
struct device_area dev_area;
- char *id_str;
+ const char *id_str;
struct id id;
if (!(cn = cn->child)) {
struct format_type *create_text_format(struct cmd_context *cmd)
{
struct format_type *fmt;
- struct config_node *cn;
- struct config_value *cv;
+ const struct config_node *cn;
+ const struct config_value *cv;
struct mda_lists *mda_lists;
if (!(fmt = dm_malloc(sizeof(*fmt))))
};
struct text_vg_version_ops {
- int (*check_version) (struct config_tree * cf);
+ int (*check_version) (const struct config_tree * cf);
struct volume_group *(*read_vg) (struct format_instance * fid,
- struct config_tree * cf,
+ const struct config_tree *cf,
unsigned use_cached_pvs);
- void (*read_desc) (struct dm_pool * mem, struct config_tree * cf,
+ void (*read_desc) (struct dm_pool * mem, const struct config_tree *cf,
time_t *when, char **desc);
const char *(*read_vgname) (const struct format_type *fmt,
- struct config_tree *cft,
+ const struct config_tree *cft,
struct id *vgid, uint64_t *vgstatus,
char **creation_host);
};
struct text_vg_version_ops *text_vg_vsn1_init(void);
int print_flags(uint64_t status, int type, char *buffer, size_t size);
-int read_flags(uint64_t *status, int type, struct config_value *cv);
+int read_flags(uint64_t *status, int type, const struct config_value *cv);
char *alloc_printed_tags(struct dm_list *tags);
-int read_tags(struct dm_pool *mem, struct dm_list *tags, struct config_value *cv);
+int read_tags(struct dm_pool *mem, struct dm_list *tags, const struct config_value *cv);
int text_vg_export_file(struct volume_group *vg, const char *desc, FILE *fp);
int text_vg_export_raw(struct volume_group *vg, const char *desc, char **buf);
#include "defaults.h"
typedef int (*section_fn) (struct format_instance * fid, struct dm_pool * mem,
- struct volume_group * vg, struct config_node * pvn,
- struct config_node * vgn,
+ struct volume_group * vg, const struct config_node * pvn,
+ const struct config_node * vgn,
struct dm_hash_table * pv_hash,
struct dm_hash_table * lv_hash,
unsigned *scan_done_once,
* Checks that the config file contains vg metadata, and that it
* we recognise the version number,
*/
-static int _check_version(struct config_tree *cft)
+static int _check_version(const struct config_tree *cft)
{
- struct config_node *cn;
- struct config_value *cv;
+ const struct config_node *cn;
+ const struct config_value *cv;
/*
* Check the contents field.
return 0;
}
-static int _read_id(struct id *id, struct config_node *cn, const char *path)
+static int _read_id(struct id *id, const struct config_node *cn, const char *path)
{
- struct config_value *cv;
+ const struct config_value *cv;
if (!(cn = find_config_node(cn, path))) {
log_error("Couldn't find uuid.");
return 1;
}
-static int _read_flag_config(struct config_node *n, uint64_t *status, int type)
+static int _read_flag_config(const struct config_node *n, uint64_t *status, int type)
{
- struct config_node *cn;
+ const struct config_node *cn;
*status = 0;
if (!(cn = find_config_node(n, "status"))) {
}
static int _read_pv(struct format_instance *fid, struct dm_pool *mem,
- struct volume_group *vg, struct config_node *pvn,
- struct config_node *vgn __attribute__((unused)),
+ struct volume_group *vg, const struct config_node *pvn,
+ const struct config_node *vgn __attribute__((unused)),
struct dm_hash_table *pv_hash,
struct dm_hash_table *lv_hash __attribute__((unused)),
unsigned *scan_done_once,
{
struct physical_volume *pv;
struct pv_list *pvl;
- struct config_node *cn;
+ const struct config_node *cn;
uint64_t size;
if (!(pvl = dm_pool_zalloc(mem, sizeof(*pvl))) ||
}
static int _read_segment(struct dm_pool *mem, struct volume_group *vg,
- struct logical_volume *lv, struct config_node *sn,
+ struct logical_volume *lv, const struct config_node *sn,
struct dm_hash_table *pv_hash)
{
uint32_t area_count = 0u;
struct lv_segment *seg;
- struct config_node *cn, *sn_child = sn->child;
- struct config_value *cv;
+ const struct config_node *cn, *sn_child = sn->child;
+ const struct config_value *cv;
uint32_t start_extent, extent_count;
struct segment_type *segtype;
const char *segtype_str;
uint64_t status)
{
unsigned int s;
- struct config_value *cv;
+ const struct config_value *cv;
struct logical_volume *lv1;
struct physical_volume *pv;
const char *seg_name = config_parent_name(sn);
}
static int _read_segments(struct dm_pool *mem, struct volume_group *vg,
- struct logical_volume *lv, struct config_node *lvn,
+ struct logical_volume *lv, const struct config_node *lvn,
struct dm_hash_table *pv_hash)
{
- struct config_node *sn;
+ const struct config_node *sn;
int count = 0, seg_count;
for (sn = lvn; sn; sn = sn->sib) {
static int _read_lvnames(struct format_instance *fid __attribute__((unused)),
struct dm_pool *mem,
- struct volume_group *vg, struct config_node *lvn,
- struct config_node *vgn __attribute__((unused)),
+ struct volume_group *vg, const struct config_node *lvn,
+ const struct config_node *vgn __attribute__((unused)),
struct dm_hash_table *pv_hash __attribute__((unused)),
struct dm_hash_table *lv_hash,
unsigned *scan_done_once __attribute__((unused)),
unsigned report_missing_devices __attribute__((unused)))
{
struct logical_volume *lv;
- struct config_node *cn;
+ const struct config_node *cn;
if (!(lv = alloc_lv(mem)))
return_0;
lv->alloc = ALLOC_INHERIT;
if ((cn = find_config_node(lvn, "allocation_policy"))) {
- struct config_value *cv = cn->v;
+ const struct config_value *cv = cn->v;
if (!cv || !cv->v.str) {
log_error("allocation_policy must be a string.");
return 0;
static int _read_lvsegs(struct format_instance *fid __attribute__((unused)),
struct dm_pool *mem,
- struct volume_group *vg, struct config_node *lvn,
- struct config_node *vgn __attribute__((unused)),
+ struct volume_group *vg, const struct config_node *lvn,
+ const struct config_node *vgn __attribute__((unused)),
struct dm_hash_table *pv_hash,
struct dm_hash_table *lv_hash,
unsigned *scan_done_once __attribute__((unused)),
static int _read_sections(struct format_instance *fid,
const char *section, section_fn fn,
struct dm_pool *mem,
- struct volume_group *vg, struct config_node *vgn,
+ struct volume_group *vg, const struct config_node *vgn,
struct dm_hash_table *pv_hash,
struct dm_hash_table *lv_hash,
int optional,
unsigned *scan_done_once)
{
- struct config_node *n;
+ const struct config_node *n;
/* Only report missing devices when doing a scan */
unsigned report_missing_devices = scan_done_once ? !*scan_done_once : 1;
}
for (n = n->child; n; n = n->sib) {
- if (!fn(fid, mem, vg, n, vgn, pv_hash, lv_hash, scan_done_once, report_missing_devices))
+ if (!fn(fid, mem, vg, n, vgn, pv_hash, lv_hash,
+ scan_done_once, report_missing_devices))
return_0;
}
}
static struct volume_group *_read_vg(struct format_instance *fid,
- struct config_tree *cft,
+ const struct config_tree *cft,
unsigned use_cached_pvs)
{
- struct config_node *vgn, *cn;
+ const struct config_node *vgn, *cn;
struct volume_group *vg;
struct dm_hash_table *pv_hash = NULL, *lv_hash = NULL;
struct dm_pool *mem = dm_pool_create("lvm2 vg_read", VG_MEMPOOL_CHUNK);
vg->alloc = ALLOC_NORMAL;
if ((cn = find_config_node(vgn, "allocation_policy"))) {
- struct config_value *cv = cn->v;
+ const struct config_value *cv = cn->v;
if (!cv || !cv->v.str) {
log_error("allocation_policy must be a string.");
goto bad;
}
static void _read_desc(struct dm_pool *mem,
- struct config_tree *cft, time_t *when, char **desc)
+ const struct config_tree *cft, time_t *when, char **desc)
{
const char *d;
unsigned int u = 0u;
}
static const char *_read_vgname(const struct format_type *fmt,
- struct config_tree *cft, struct id *vgid,
+ const struct config_tree *cft, struct id *vgid,
uint64_t *vgstatus, char **creation_host)
{
- struct config_node *vgn;
+ const struct config_node *vgn;
struct dm_pool *mem = fmt->cmd->mem;
char *vgname;
int old_suppress;
return_NULL;
}
-int read_tags(struct dm_pool *mem, struct dm_list *tags, struct config_value *cv)
+int read_tags(struct dm_pool *mem, struct dm_list *tags, const struct config_value *cv)
{
if (cv->type == CFG_EMPTY_ARRAY)
return 1;
*/
static int _has_matching_pv_tag(struct pv_match *pvmatch, struct pv_segment *pvseg, struct pv_area *pva)
{
- struct config_value *cv;
- char *str;
+ const struct config_value *cv;
+ const char *str;
const char *tag_matched;
for (cv = pvmatch->cling_tag_list_cn->v; cv; cv = cv->next) {
void (*display) (const struct lv_segment * seg);
int (*text_export) (const struct lv_segment * seg,
struct formatter * f);
- int (*text_import_area_count) (struct config_node * sn,
+ int (*text_import_area_count) (const struct config_node * sn,
uint32_t *area_count);
int (*text_import) (struct lv_segment * seg,
const struct config_node * sn,
log_print(" ");
}
-static int _mirrored_text_import_area_count(struct config_node *sn, uint32_t *area_count)
+static int _mirrored_text_import_area_count(const struct config_node *sn, uint32_t *area_count)
{
if (!get_config_uint32(sn, "mirror_count", area_count)) {
log_error("Couldn't read 'mirror_count' for "
struct dm_hash_table *pv_hash)
{
const struct config_node *cn;
- char *logname = NULL;
+ const char *logname = NULL;
if (find_config_node(sn, "extents_moved")) {
if (get_config_uint32(sn, "extents_moved",
static int _maps_line(const struct config_node *cn, lvmlock_t lock,
const char* line, size_t* mstats)
{
- struct config_value *cv;
+ const struct config_value *cv;
long from, to;
int pos, i;
char fr, fw, fx, fp;
static replicator_state_t _get_state(const struct config_node *sn,
const char *path, replicator_state_t def)
{
- char *str;
+ const char *str;
unsigned i;
if (get_config_str(sn, path, &str)) {
static dm_replicator_mode_t _get_op_mode(const struct config_node *sn,
const char *path, dm_replicator_mode_t def)
{
- char *str;
+ const char *str;
unsigned i;
if (get_config_str(sn, path, &str)) {
log_print(" ");
}
-static int _striped_text_import_area_count(struct config_node *sn, uint32_t *area_count)
+static int _striped_text_import_area_count(const struct config_node *sn, uint32_t *area_count)
{
if (!get_config_uint32(sn, "stripe_count", area_count)) {
log_error("Couldn't read 'stripe_count' for "