summaryrefslogtreecommitdiffstats
path: root/lib/metadata/merge.c
diff options
context:
space:
mode:
authorAlasdair Kergon <agk@redhat.com>2005-10-27 19:58:22 +0000
committerAlasdair Kergon <agk@redhat.com>2005-10-27 19:58:22 +0000
commit5727a8fa858c086e5785ca94cdc8249e8caa7bdd (patch)
tree9477844ee1f05993e91dc6d1cc2da93297911723 /lib/metadata/merge.c
parent5f5355cbf5103aa0f085b47ce56caf33d8891fe1 (diff)
downloadlvm2-5727a8fa858c086e5785ca94cdc8249e8caa7bdd.tar.gz
lvm2-5727a8fa858c086e5785ca94cdc8249e8caa7bdd.tar.xz
lvm2-5727a8fa858c086e5785ca94cdc8249e8caa7bdd.zip
Add mirror_seg pointer to lv_segment struct. (incomplete & untested)
Diffstat (limited to 'lib/metadata/merge.c')
-rw-r--r--lib/metadata/merge.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/metadata/merge.c b/lib/metadata/merge.c
index 0e0c6d54..a456a1a3 100644
--- a/lib/metadata/merge.c
+++ b/lib/metadata/merge.c
@@ -85,6 +85,40 @@ int check_lv_segments(struct logical_volume *lv)
r = 0;
}
+ if (seg->log_lv) {
+ if (!seg_is_mirrored(seg)) {
+ log_error("LV %s: segment %u has log LV but "
+ "is not mirrored",
+ lv->name, seg_count);
+ r = 0;
+ }
+
+ if (!(seg->log_lv->status & MIRROR_LOG)) {
+ log_error("LV %s: segment %u log LV %s is not "
+ "a mirror log",
+ lv->name, seg_count, seg->log_lv->name);
+ r = 0;
+ }
+
+ if (!find_seg_by_le(seg->log_lv, 0) ||
+ find_seg_by_le(seg->log_lv, 0)->mirror_seg != seg) {
+ log_error("LV %s: segment %u log LV does not "
+ "point back to mirror segment",
+ lv->name, seg_count);
+ r = 0;
+ }
+ }
+
+ if (seg->status & MIRROR_IMAGE) {
+ if (!seg->mirror_seg ||
+ !seg_is_mirrored(seg->mirror_seg)) {
+ log_error("LV %s: segment %u mirror image "
+ "is not mirrored",
+ lv->name, seg_count);
+ r = 0;
+ }
+ }
+
for (s = 0; s < seg->area_count; s++) {
if (seg_type(seg, s) == AREA_UNASSIGNED) {
log_error("LV %s: segment %u has unassigned "
@@ -109,6 +143,18 @@ int check_lv_segments(struct logical_volume *lv)
lv->name, seg_count, s);
r = 0;
}
+
+ if (seg_lv(seg, s) &&
+ (seg_lv(seg, s)->status & MIRROR_IMAGE) &&
+ (find_seg_by_le(seg_lv(seg, s),
+ seg_le(seg, s))->mirror_seg
+ != seg)) {
+ log_error("LV %s: segment %u mirror "
+ "image %u missing mirror ptr",
+ lv->name, seg_count, s);
+ r = 0;
+ }
+
/* FIXME I don't think this ever holds?
if (seg_le(seg, s) != le) {
log_error("LV %s: segment %u has "