[lvm-devel] LVM2/lib/metadata metadata.c
prajnoha at sourceware.org
prajnoha at sourceware.org
Fri Apr 1 14:54:21 UTC 2011
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: prajnoha at sourceware.org 2011-04-01 14:54:21
Modified files:
lib/metadata : metadata.c
Log message:
Cleanup fid finalization code in free_vg and allow exactly the same fid to be set again for a PV/VG.
Actually, we can call vg_set_fid(vg, NULL) instead of calling
destroy_instance for all PV structs and a VG struct - it's the same
code we already have in the vg_set_fid.
Also, allow exactly the same fid to be set again for the same PV/VG
Before, this could end up with the fid destroyed because we destroyed
existing fid first and then we used the new one and we didn't care
whether existing one == new one by chance.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.c.diff?cvsroot=lvm2&r1=1.452&r2=1.453
--- LVM2/lib/metadata/metadata.c 2011/03/30 13:35:51 1.452
+++ LVM2/lib/metadata/metadata.c 2011/04/01 14:54:20 1.453
@@ -3243,19 +3243,10 @@
void free_vg(struct volume_group *vg)
{
- struct pv_list *pvl;
-
if (!vg)
return;
- dm_list_iterate_items(pvl, &vg->pvs)
- pvl->pv->fid->fmt->ops->destroy_instance(pvl->pv->fid);
-
- dm_list_iterate_items(pvl, &vg->removed_pvs)
- pvl->pv->fid->fmt->ops->destroy_instance(pvl->pv->fid);
-
- if (vg->fid)
- vg->fid->fmt->ops->destroy_instance(vg->fid);
+ vg_set_fid(vg, NULL);
if (vg->cmd && vg->vgmem == vg->cmd->mem) {
log_error(INTERNAL_ERROR "global memory pool used for VG %s",
@@ -4048,12 +4039,13 @@
void pv_set_fid(struct physical_volume *pv,
struct format_instance *fid)
{
+ if (fid)
+ fid->ref_count++;
+
if (pv->fid)
pv->fid->fmt->ops->destroy_instance(pv->fid);
pv->fid = fid;
- if (fid)
- fid->ref_count++;
}
void vg_set_fid(struct volume_group *vg,
@@ -4061,15 +4053,19 @@
{
struct pv_list *pvl;
- if (vg->fid)
- vg->fid->fmt->ops->destroy_instance(vg->fid);
-
- vg->fid = fid;
if (fid)
fid->ref_count++;
dm_list_iterate_items(pvl, &vg->pvs)
pv_set_fid(pvl->pv, fid);
+
+ dm_list_iterate_items(pvl, &vg->removed_pvs)
+ pv_set_fid(pvl->pv, fid);
+
+ if (vg->fid)
+ vg->fid->fmt->ops->destroy_instance(vg->fid);
+
+ vg->fid = fid;
}
static int _convert_key_to_string(const char *key, size_t key_len,
More information about the lvm-devel
mailing list