diff --git a/WHATS_NEW b/WHATS_NEW index a26e50d02..c09d08a67 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.92 - ==================================== + Add free_orphan_vg. Skip pv/vg_set_fid processing if the fid is same. Check for foreach loop errors in _vg_read_orphans() (2.02.91). Clean error paths for format instance creation (2.02.91). diff --git a/lib/format1/format1.c b/lib/format1/format1.c index 30b79b5aa..0c59a7e32 100644 --- a/lib/format1/format1.c +++ b/lib/format1/format1.c @@ -546,12 +546,8 @@ static void _format1_destroy_instance(struct format_instance *fid) static void _format1_destroy(struct format_type *fmt) { - /* FIXME out of place, but the main (cmd) pool has been already - * destroyed and touching the fid (also via release_vg) will crash the - * program */ - dm_hash_destroy(fmt->orphan_vg->hostnames); - dm_pool_destroy(fmt->orphan_vg->fid->mem); - dm_pool_destroy(fmt->orphan_vg->vgmem); + if (fmt->orphan_vg) + free_orphan_vg(fmt->orphan_vg); dm_free(fmt); } diff --git a/lib/format_pool/format_pool.c b/lib/format_pool/format_pool.c index 1e742eaf0..4e0600e99 100644 --- a/lib/format_pool/format_pool.c +++ b/lib/format_pool/format_pool.c @@ -259,12 +259,8 @@ static void _pool_destroy_instance(struct format_instance *fid) static void _pool_destroy(struct format_type *fmt) { - /* FIXME out of place, but the main (cmd) pool has been already - * destroyed and touching the fid (also via release_vg) will crash the - * program */ - dm_hash_destroy(fmt->orphan_vg->hostnames); - dm_pool_destroy(fmt->orphan_vg->fid->mem); - dm_pool_destroy(fmt->orphan_vg->vgmem); + if (fmt->orphan_vg) + free_orphan_vg(fmt->orphan_vg); dm_free(fmt); } diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c index 717db7491..12e7a2ead 100644 --- a/lib/format_text/format-text.c +++ b/lib/format_text/format-text.c @@ -1541,13 +1541,8 @@ static void _free_raws(struct dm_list *raw_list) static void _text_destroy(struct format_type *fmt) { - /* FIXME out of place, but the main (cmd) pool has been already - * destroyed and touching the fid (also via release_vg) will crash the - * program */ - dm_hash_destroy(fmt->orphan_vg->fid->metadata_areas_index); - dm_hash_destroy(fmt->orphan_vg->hostnames); - dm_pool_destroy(fmt->orphan_vg->fid->mem); - dm_pool_destroy(fmt->orphan_vg->vgmem); + if (fmt->orphan_vg) + free_orphan_vg(fmt->orphan_vg); if (fmt->private) { _free_dirs(&((struct mda_lists *) fmt->private)->dirs); diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index 005f17d44..7def88513 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -1551,7 +1551,6 @@ struct physical_volume * pvcreate_single(struct cmd_context *cmd, return pv; bad: - free_pv_fid(pv); return NULL; } @@ -1575,6 +1574,7 @@ static struct physical_volume *_alloc_pv(struct dm_pool *mem, struct device *dev /** * pv_create - initialize a physical volume for use with a volume group + * created PV belongs to Orphan VG. * * @fmt: format type * @dev: PV device to initialize @@ -1609,9 +1609,10 @@ struct physical_volume *pv_create(const struct cmd_context *cmd, unsigned metadataignore) { const struct format_type *fmt = cmd->fmt; - struct dm_pool *mem = fmt->cmd->mem; + struct dm_pool *mem = fmt->orphan_vg->vgmem; struct physical_volume *pv = _alloc_pv(mem, dev); unsigned mda_index; + struct pv_list *pvl; if (!pv) return_NULL; @@ -1650,7 +1651,6 @@ struct physical_volume *pv_create(const struct cmd_context *cmd, goto bad; } - struct pv_list *pvl; if (!(pvl = dm_pool_zalloc(mem, sizeof(*pvl)))) { log_error("pv_list allocation in pv_create failed"); goto bad; @@ -1687,8 +1687,9 @@ struct physical_volume *pv_create(const struct cmd_context *cmd, return pv; bad: - free_pv_fid(pv); - dm_pool_free(mem, pv); + // FIXME: detach from orphan in error path + //free_pv_fid(pv); + //dm_pool_free(mem, pv); return NULL; } diff --git a/lib/metadata/vg.c b/lib/metadata/vg.c index 42cb48cfb..bae22dc8f 100644 --- a/lib/metadata/vg.c +++ b/lib/metadata/vg.c @@ -90,6 +90,18 @@ void release_vg(struct volume_group *vg) _free_vg(vg); } +/* + * FIXME out of place, but the main (cmd) pool has been already + * destroyed and touching the fid (also via release_vg) will crash the + * program + * + * For now quick wrapper to allow destroy of orphan vg + */ +void free_orphan_vg(struct volume_group *vg) +{ + _free_vg(vg); +} + char *vg_fmt_dup(const struct volume_group *vg) { if (!vg->fid || !vg->fid->fmt) diff --git a/lib/metadata/vg.h b/lib/metadata/vg.h index f0437113d..f876968c3 100644 --- a/lib/metadata/vg.h +++ b/lib/metadata/vg.h @@ -121,6 +121,7 @@ struct volume_group *alloc_vg(const char *pool_name, struct cmd_context *cmd, * by vg_create() or vg_read_internal() to free it when no longer required. */ void release_vg(struct volume_group *vg); +void free_orphan_vg(struct volume_group *vg); char *vg_fmt_dup(const struct volume_group *vg); char *vg_name_dup(const struct volume_group *vg); diff --git a/tools/pvcreate.c b/tools/pvcreate.c index da3862d53..761fb18f3 100644 --- a/tools/pvcreate.c +++ b/tools/pvcreate.c @@ -117,7 +117,6 @@ int pvcreate(struct cmd_context *cmd, int argc, char **argv) ret = ECMD_FAILED; } - free_pv_fid(pv); unlock_vg(cmd, VG_ORPHANS); if (sigint_caught()) return ret; diff --git a/tools/vgconvert.c b/tools/vgconvert.c index 76da0d836..0a8b9bf50 100644 --- a/tools/vgconvert.c +++ b/tools/vgconvert.c @@ -146,7 +146,6 @@ static int vgconvert_single(struct cmd_context *cmd, const char *vg_name, pv_dev_name(pv)); log_error("Use pvcreate and vgcfgrestore to repair " "from archived metadata."); - free_pv_fid(pv); return ECMD_FAILED; } @@ -157,13 +156,10 @@ static int vgconvert_single(struct cmd_context *cmd, const char *vg_name, pv_dev_name(pv)); log_error("Use pvcreate and vgcfgrestore to repair " "from archived metadata."); - free_pv_fid(pv); return ECMD_FAILED; } log_verbose("Physical volume \"%s\" successfully created", pv_dev_name(pv)); - - free_pv_fid(pv); } log_verbose("Deleting existing metadata for VG %s", vg_name);