From 5d7fd713732c7225fc030726bc7477d844c6ce7b Mon Sep 17 00:00:00 2001 From: Dave Wysochanski Date: Tue, 13 Apr 2010 17:26:36 +0000 Subject: [PATCH] Add pv->vg to solidify link between a pv and a vg. lvm2app needs a link back to the vg in order to use the vg handle for memory allocations as well as other things. This patch adds the field to struct physical_volume, and sets pv->vg when reading a vg from disk or extending a vg by using the helper function previously added, add_pvl_to_vgs(). Moves and renames are handled with separate code inside move_pv() and vgmerge(). Add pv->vg check to vg_validate(). A NULL value in pv->vg signifies membership in the orphan VG. Note though in the case of pv_read() on a device with metadatacopies == 0, more devices may need to be read for an authoritative answer. Signed-off-by: Dave Wysochanski --- lib/metadata/metadata-exported.h | 11 +++++++++++ lib/metadata/metadata.c | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h index 6fcfb221c..8f285bc51 100644 --- a/lib/metadata/metadata-exported.h +++ b/lib/metadata/metadata-exported.h @@ -181,9 +181,20 @@ struct physical_volume { struct id id; struct device *dev; const struct format_type *fmt; + + /* + * vg_name and vgid are used before the parent VG struct exists. + * FIXME: Investigate removal/substitution with 'vg' fields. + */ const char *vg_name; struct id vgid; + /* + * 'vg' is set and maintained when the PV belongs to a 'pvs' + * list in a parent VG struct. + */ + struct volume_group *vg; + uint64_t status; uint64_t size; diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index 8e2faad9c..5ba0849b4 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -143,12 +143,14 @@ void add_pvl_to_vgs(struct volume_group *vg, struct pv_list *pvl) { dm_list_add(&vg->pvs, &pvl->list); vg->pv_count++; + pvl->pv->vg = vg; } void del_pvl_from_vgs(struct volume_group *vg, struct pv_list *pvl) { vg->pv_count--; dm_list_del(&pvl->list); + pvl->pv->vg = NULL; /* orphan */ } @@ -2158,6 +2160,12 @@ int vg_validate(struct volume_group *vg) /* FIXME Dump list structure? */ r = 0; } + if (pvl->pv->vg != vg) { + log_error(INTERNAL_ERROR "VG %s PV list entry points " + "to different VG %s", vg->name, + pvl->pv->vg ? pvl->pv->vg->name : "NULL"); + r = 0; + } } loop_counter1 = loop_counter2 = 0; -- 2.43.5