summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Rajnoha <prajnoha@redhat.com>2015-03-12 14:49:10 +0100
committerPeter Rajnoha <prajnoha@redhat.com>2016-02-15 12:44:46 +0100
commit10128c9bd67a027b480e0f0637745f97fb39ecfa (patch)
treeb6f73070894a4163c2fe38d8d26115b6e2cf0eca
parent2950adc2ab67fd14173807164f9829f5f53cd33c (diff)
downloadlvm2-10128c9bd67a027b480e0f0637745f97fb39ecfa.tar.gz
metadata: schedule PV for header rewrite if adding a PV to VG or restoring VG
When adding PV to VG, we need to rewrite PV header as there's a flip in PV_EXT_USED flag. The same applies if we're restoring VG from backup.
-rw-r--r--lib/format_text/archiver.c10
-rw-r--r--lib/metadata/metadata.c3
2 files changed, 12 insertions, 1 deletions
diff --git a/lib/format_text/archiver.c b/lib/format_text/archiver.c
index 0efe5c57d..56eb1ca5e 100644
--- a/lib/format_text/archiver.c
+++ b/lib/format_text/archiver.c
@@ -335,6 +335,7 @@ int backup_restore_vg(struct cmd_context *cmd, struct volume_group *vg, int drop
struct pv_list *pvl;
struct format_instance *fid;
struct format_instance_ctx fic;
+ struct pv_to_write *pvw;
uint32_t tmp;
/*
@@ -363,6 +364,15 @@ int backup_restore_vg(struct cmd_context *cmd, struct volume_group *vg, int drop
/* Add any metadata areas on the PVs */
dm_list_iterate_items(pvl, &vg->pvs) {
+ if (pvl->pv->fmt->features & FMT_PV_FLAGS) {
+ if (!(pvw = dm_pool_zalloc(vg->vgmem, sizeof(*pvw)))) {
+ log_error("pv_to_write allocation for '%s' failed", pv_dev_name(pvl->pv));
+ return 0;
+ }
+ pvw->pv = pvl->pv;
+ dm_list_add(&vg->pvs_to_write, &pvw->list);
+ }
+
tmp = vg->extent_size;
vg->extent_size = 0;
if (!vg->fid->fmt->ops->pv_setup(vg->fid->fmt, pvl->pv, vg)) {
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index 981bfbc96..9c0423eef 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -279,7 +279,8 @@ int add_pv_to_vg(struct volume_group *vg, const char *pv_name,
break;
}
- if (pv->status & UNLABELLED_PV) {
+ if ((pv->fmt->features & FMT_PV_FLAGS) ||
+ (pv->status & UNLABELLED_PV)) {
if (!(pvw = dm_pool_zalloc(mem, sizeof(*pvw)))) {
log_error("pv_to_write allocation for '%s' failed", pv_name);
return 0;