diff --git a/WHATS_NEW b/WHATS_NEW index d317abca7..8facd0851 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,7 @@ Version 2.02.49 - ================================ + Fix segment metadata read function errors to use proper segment name. + Add parent node to config_node structure. Fix segment import functions to print segment name and logical volume name. Update vgsplit and vgcreate to call the new vg_create, then call 'set' fns. Change vg_create to take minimal parameters, obtain a lock, and return vg_t. diff --git a/lib/config/config.c b/lib/config/config.c index 224f2ced4..a32fd9fa7 100644 --- a/lib/config/config.c +++ b/lib/config/config.c @@ -546,6 +546,7 @@ static struct config_node *_file(struct parser *p) root = n; else l->sib = n; + n->parent = root; l = n; } return root; @@ -573,6 +574,7 @@ static struct config_node *_section(struct parser *p) root->child = n; else l->sib = n; + n->parent = root; l = n; } match(TOK_SECTION_E); @@ -1251,6 +1253,10 @@ static unsigned _count_tokens(const char *str, unsigned len, int type) return count_chars(str, len, c); } +const char *config_parent_name(const struct config_node *n) +{ + return (n->parent ? n->parent->key : "(root)"); +} /* * Heuristic function to make a quick guess as to whether a text * region probably contains a valid config "section". (Useful for diff --git a/lib/config/config.h b/lib/config/config.h index 57f6c3282..1e4bc2929 100644 --- a/lib/config/config.h +++ b/lib/config/config.h @@ -40,7 +40,7 @@ struct config_value { struct config_node { char *key; - struct config_node *sib, *child; + struct config_node *parent, *sib, *child; struct config_value *v; }; @@ -110,4 +110,6 @@ int get_config_str(const struct config_node *cn, const char *path, unsigned maybe_config_section(const char *str, unsigned len); +const char *config_parent_name(const struct config_node *n); + #endif diff --git a/lib/mirror/mirrored.c b/lib/mirror/mirrored.c index b243ebb34..6e7bc68e5 100644 --- a/lib/mirror/mirrored.c +++ b/lib/mirror/mirrored.c @@ -78,7 +78,7 @@ static int _mirrored_text_import_area_count(struct config_node *sn, uint32_t *ar { if (!get_config_uint32(sn, "mirror_count", area_count)) { log_error("Couldn't read 'mirror_count' for " - "segment '%s'.", sn->key); + "segment '%s'.", config_parent_name(sn)); return 0; } @@ -97,7 +97,8 @@ static int _mirrored_text_import(struct lv_segment *seg, const struct config_nod seg->status |= PVMOVE; else { log_error("Couldn't read 'extents_moved' for " - "segment '%s'.", sn->key); + "segment %s of logical volume %s.", + config_parent_name(sn), seg->lv->name); return 0; } } @@ -106,7 +107,8 @@ static int _mirrored_text_import(struct lv_segment *seg, const struct config_nod if (!get_config_uint32(sn, "region_size", &seg->region_size)) { log_error("Couldn't read 'region_size' for " - "segment '%s'.", sn->key); + "segment %s of logical volume %s.", + config_parent_name(sn), seg->lv->name); return 0; } } @@ -118,22 +120,25 @@ static int _mirrored_text_import(struct lv_segment *seg, const struct config_nod } logname = cn->v->v.str; if (!(seg->log_lv = find_lv(seg->lv->vg, logname))) { - log_error("Unrecognised mirror log in segment %s.", - sn->key); + log_error("Unrecognised mirror log in " + "segment %s of logical volume %s.", + config_parent_name(sn), seg->lv->name); return 0; } seg->log_lv->status |= MIRROR_LOG; } if (logname && !seg->region_size) { - log_error("Missing region size for mirror log for segment " - "'%s'.", sn->key); + log_error("Missing region size for mirror log for " + "segment %s of logical volume %s.", + config_parent_name(sn), seg->lv->name); return 0; } if (!(cn = find_config_node(sn, "mirrors"))) { - log_error("Couldn't find mirrors array for segment " - "'%s'.", sn->key); + log_error("Couldn't find mirrors array for " + "segment %s of logical volume %s.", + config_parent_name(sn), seg->lv->name); return 0; } diff --git a/lib/striped/striped.c b/lib/striped/striped.c index 78129aff1..0e1ca2d35 100644 --- a/lib/striped/striped.c +++ b/lib/striped/striped.c @@ -54,7 +54,7 @@ static int _striped_text_import_area_count(struct config_node *sn, uint32_t *are { if (!get_config_uint32(sn, "stripe_count", area_count)) { log_error("Couldn't read 'stripe_count' for " - "segment '%s'.", sn->key); + "segment '%s'.", config_parent_name(sn)); return 0; } @@ -68,14 +68,14 @@ static int _striped_text_import(struct lv_segment *seg, const struct config_node if ((seg->area_count != 1) && !get_config_uint32(sn, "stripe_size", &seg->stripe_size)) { - log_error("Couldn't read stripe_size for segment '%s'.", - sn->key); + log_error("Couldn't read stripe_size for segment %s " + "of logical volume %s.", config_parent_name(sn), seg->lv->name); return 0; } if (!(cn = find_config_node(sn, "stripes"))) { - log_error("Couldn't find stripes array for segment " - "'%s'.", sn->key); + log_error("Couldn't find stripes array for segment %s " + "of logical volume %s.", config_parent_name(sn), seg->lv->name); return 0; }