summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Rajnoha <prajnoha@redhat.com>2015-03-23 13:32:00 +0100
committerPeter Rajnoha <prajnoha@redhat.com>2015-03-23 13:41:34 +0100
commitf4060818825b96efc12b142384dd862838ac4e4e (patch)
tree3f0c70c464b5e97690054ba9d45b9deae7fd55fb
parent27dec73e8804538250cfb8f52191a92ef427d341 (diff)
downloadlvm2-dev-prajnoha-process-each-lv-list.tar.gz
metadata: vg: add removed_lvs field to collect LVs which have been removeddev-prajnoha-process-each-lv-list
-rw-r--r--lib/metadata/lv_manip.c2
-rw-r--r--lib/metadata/metadata-exported.h5
-rw-r--r--lib/metadata/metadata.c14
-rw-r--r--lib/metadata/vg.c1
-rw-r--r--lib/metadata/vg.h5
-rw-r--r--tools/toollib.c5
6 files changed, 30 insertions, 2 deletions
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index b9cd056d2..99fb91f49 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -5350,7 +5350,7 @@ int unlink_lv_from_vg(struct logical_volume *lv)
if (!(lvl = find_lv_in_vg(lv->vg, lv->name)))
return_0;
- dm_list_del(&lvl->list);
+ dm_list_move(&lv->vg->removed_lvs, &lvl->list);
lv->status |= LV_REMOVED;
return 1;
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index a336769b2..5d6fb5867 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -123,7 +123,10 @@
#define PV_ALLOCATION_PROHIBITED UINT64_C(0x0010000000000000) /* PV - internal use only - allocation prohibited
e.g. to prohibit allocation of a RAID image
on a PV already holing an image of the RAID set */
-#define LV_REMOVED UINT64_C(0x0040000000000000) /* LV - Internal use only */
+#define LV_REMOVED UINT64_C(0x0040000000000000) /* LV - Internal use only
+ FIXME: Remove this flag once we have
+ indexed vg->removed_lvs
+ */
/* Next unused flag: UINT64_C(0x0080000000000000) */
/* Format features flags */
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index 33ce3708d..a1a31eb27 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -2568,12 +2568,26 @@ int vg_validate(struct volume_group *vg)
r = 0;
}
+ dm_list_iterate_items(lvl, &vg->removed_lvs) {
+ if (!(lvl->lv->status & LV_REMOVED)) {
+ log_error(INTERNAL_ERROR "LV %s is not marked as removed while it's part "
+ "of removed LV list for VG %s", lvl->lv->name, vg->name);
+ r = 0;
+ }
+ }
+
/*
* Count all non-snapshot invisible LVs
*/
dm_list_iterate_items(lvl, &vg->lvs) {
lv_count++;
+ if (lvl->lv->status & LV_REMOVED) {
+ log_error(INTERNAL_ERROR "LV %s is marked as removed while it's "
+ "still part of the VG %s", lvl->lv->name, vg->name);
+ r = 0;
+ }
+
if (lvl->lv->status & LVM_WRITE_LOCKED) {
log_error(INTERNAL_ERROR "LV %s has external flag LVM_WRITE_LOCKED set internally.",
lvl->lv->name);
diff --git a/lib/metadata/vg.c b/lib/metadata/vg.c
index 404cc6fa6..c9a7e9e1b 100644
--- a/lib/metadata/vg.c
+++ b/lib/metadata/vg.c
@@ -63,6 +63,7 @@ struct volume_group *alloc_vg(const char *pool_name, struct cmd_context *cmd,
dm_list_init(&vg->pvs_to_create);
dm_list_init(&vg->lvs);
dm_list_init(&vg->tags);
+ dm_list_init(&vg->removed_lvs);
dm_list_init(&vg->removed_pvs);
log_debug_mem("Allocated VG %s at %p.", vg->name, vg);
diff --git a/lib/metadata/vg.h b/lib/metadata/vg.h
index 67a04a05f..b0ab12217 100644
--- a/lib/metadata/vg.h
+++ b/lib/metadata/vg.h
@@ -113,6 +113,11 @@ struct volume_group {
*/
/*
+ * List of removed logical volumes by _lv_reduce.
+ */
+ struct dm_list removed_lvs;
+
+ /*
* List of removed physical volumes by pvreduce.
* They have to get cleared on vg_commit.
*/
diff --git a/tools/toollib.c b/tools/toollib.c
index be8945019..142ff3373 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -2061,6 +2061,11 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
}
dm_list_iterate_items(lvl, &final_lvs) {
+ /*
+ * FIXME: Once we have index over vg->removed_lvs, check directly
+ * LV presence there and remove LV_REMOVE flag/lv_is_removed fn
+ * as they won't be needed anymore.
+ */
if (lv_is_removed(lvl->lv))
continue;