summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Rockai <prockai@redhat.com>2013-02-19 03:13:59 +0100
committerPetr Rockai <prockai@redhat.com>2013-04-11 15:25:40 +0200
commitc01cff6d9430a78afc859a9a614422427b39da6b (patch)
tree21fe557c9bd2dd3f613405908d2e9bf274e719bb
parent37a069066d13761119d48b1c7e7df66a9df9193c (diff)
downloadlvm2-c01cff6d9430a78afc859a9a614422427b39da6b.tar.gz
metadata: Fix handling of orphan PV linking & re-linking.
-rw-r--r--lib/metadata/metadata.c31
1 files changed, 28 insertions, 3 deletions
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index 7484069ad..67e6b98f9 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -271,6 +271,12 @@ int add_pv_to_vg(struct volume_group *vg, const char *pv_name,
vg->extent_count += pv->pe_count;
vg->free_count += pv->pe_count;
+ dm_list_iterate_items(pvl, &fid->fmt->orphan_vg->pvs)
+ if (pv == pvl->pv) { /* unlink from orphan */
+ dm_list_del(&pvl->list);
+ break;
+ }
+
if (pv->status & UNLABELLED_PV) {
if (!(pvc = dm_pool_zalloc(mem, sizeof(*pvc)))) {
log_error("pv_to_create allocation for '%s' failed", pv_name);
@@ -2798,8 +2804,10 @@ static struct volume_group *_vg_read_orphans(struct cmd_context *cmd,
struct lvmcache_vginfo *vginfo;
struct volume_group *vg = NULL;
struct _vg_read_orphan_baton baton;
- struct pv_list *pvl;
+ struct pv_list *pvl, *pvl_;
+ struct pv_list head;
+ dm_list_init(&head.list);
lvmcache_label_scan(cmd, 0);
lvmcache_seed_infos_from_lvmetad(cmd);
@@ -2810,14 +2818,31 @@ static struct volume_group *_vg_read_orphans(struct cmd_context *cmd,
return_NULL;
vg = fmt->orphan_vg;
- dm_list_iterate_items(pvl, &vg->pvs)
- pv_set_fid(pvl->pv, NULL);
+restart:
+ dm_list_iterate_items(pvl, &vg->pvs) {
+ if (pvl->pv->status & UNLABELLED_PV ) {
+ dm_list_del(&pvl->list);
+ dm_list_add(&head.list, &pvl->list);
+ goto restart;
+ } else
+ pv_set_fid(pvl->pv, NULL);
+ }
dm_list_init(&vg->pvs);
vg->pv_count = 0;
+ vg->extent_count = 0;
+ vg->free_count = 0;
baton.warnings = warnings;
baton.vg = vg;
+ while (!dm_list_empty(&head.list)) {
+ pvl = (struct pv_list *) dm_list_first(&head.list);
+ dm_list_del(&pvl->list);
+ add_pvl_to_vgs(vg, pvl);
+ vg->extent_count += pvl->pv->pe_count;
+ vg->free_count += pvl->pv->pe_count;
+ }
+
if (!lvmcache_foreach_pv(vginfo, _vg_read_orphan_pv, &baton))
return_NULL;