summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Rockai <prockai@redhat.com>2015-04-29 15:00:28 +0200
committerPetr Rockai <prockai@redhat.com>2015-05-20 19:46:14 +0200
commit55f33696928728e60f15dc7a557e55bf910dabdd (patch)
tree09841f33c0c4acc5c17607aface3cceb3e99c5c4
parent611c8b6d29ca164a22270cb9b3dcf7958063c712 (diff)
downloadlvm2-55f33696928728e60f15dc7a557e55bf910dabdd.tar.gz
lvmetad: Provide entire pvmeta sections for outdated_pvs.
-rw-r--r--daemons/lvmetad/lvmetad-core.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/daemons/lvmetad/lvmetad-core.c b/daemons/lvmetad/lvmetad-core.c
index 40cf7d470..449e332f9 100644
--- a/daemons/lvmetad/lvmetad-core.c
+++ b/daemons/lvmetad/lvmetad-core.c
@@ -470,13 +470,29 @@ static void mark_outdated_pv(lvmetad_state *s, const char *vgid, const char *pvi
list->v = v;
}
-static void chain_outdated_pvs(lvmetad_state *s, const char *vgid, struct dm_config_tree *metadata, struct dm_config_node *last)
+static void chain_outdated_pvs(lvmetad_state *s, const char *vgid, struct dm_config_tree *metadata_cft, struct dm_config_node *metadata)
{
- struct dm_config_tree *cft = dm_hash_lookup(s->vgid_to_outdated_pvs, vgid);
- if (!cft)
- return; /* nothing to chain in */
- last->sib = dm_config_clone_node(metadata, dm_config_find_node(cft->root, "outdated_pvs/pv_list"), 0);
- last->sib->key = "outdated_pvs";
+ struct dm_config_tree *cft = dm_hash_lookup(s->vgid_to_outdated_pvs, vgid), *pvmeta;
+ struct dm_config_node *pv, *res, *pvs = cft ? dm_config_find_node(cft->root, "outdated_pvs/pv_list") : NULL;
+ struct dm_config_value *pvs_v = pvs ? pvs->v : NULL;
+ if (!pvs_v)
+ return;
+ if (!(res = make_config_node(metadata_cft, "outdated_pvs", metadata_cft->root, 0)))
+ return; /* oops */
+ res->sib = metadata->child;
+ metadata->child = res;
+ for (; pvs_v && pvs_v->type != DM_CFG_EMPTY_ARRAY; pvs_v = pvs_v->next) {
+ pvmeta = dm_hash_lookup(s->pvid_to_pvmeta, pvs_v->v.str);
+ if (!pvmeta) {
+ WARN(s, "metadata for PV %s not found", pvs_v->v.str);
+ continue;
+ }
+ if (!(pv = dm_config_clone_node(metadata_cft, pvmeta->root, 0)))
+ continue;
+ pv->key = dm_config_find_str(pv, "pvmeta/id", NULL);
+ pv->sib = res->child;
+ res->child = pv;
+ }
}
static response vg_lookup(lvmetad_state *s, request r)