summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Rajnoha <prajnoha@redhat.com>2016-03-09 13:00:52 +0100
committerPeter Rajnoha <prajnoha@redhat.com>2016-03-09 13:43:16 +0100
commitce97ea62e951edb194bbf5b253e213119b6cbdf3 (patch)
tree0c2a307bc1bf49d4a16d106b4f6447b2cca8d821
parentf3ef7943426b9d9bddbbc1697aa1cb6e91551e1a (diff)
downloadlvm2-dev-prajnoha-dev-cache-slaves.tar.gz
lv: check PVs used for an LV are consistent with real devices useddev-prajnoha-dev-cache-slaves
-rw-r--r--lib/device/dev-cache.c16
-rw-r--r--lib/device/dev-cache.h6
-rw-r--r--lib/metadata/merge.c7
3 files changed, 29 insertions, 0 deletions
diff --git a/lib/device/dev-cache.c b/lib/device/dev-cache.c
index 6fdc2adf3..c2e81d0db 100644
--- a/lib/device/dev-cache.c
+++ b/lib/device/dev-cache.c
@@ -932,6 +932,22 @@ static int _check_for_open_devices(int close_immediate)
}
/*
+ * * Check if a device contains slave device.
+ * */
+int dev_cache_check_dev_slaves_contains_dev(struct device *dev,
+ struct device *slave_dev)
+{
+ struct slave_list *sl;
+
+ dm_list_iterate_items(sl, &dev->slaves) {
+ if (slave_dev->dev == sl->devno)
+ return 1;
+ }
+
+ return 0;
+}
+
+/*
* Returns number of devices left open.
*/
int dev_cache_check_for_open_devices(void)
diff --git a/lib/device/dev-cache.h b/lib/device/dev-cache.h
index a69091d57..7fb56b8cf 100644
--- a/lib/device/dev-cache.h
+++ b/lib/device/dev-cache.h
@@ -42,6 +42,12 @@ int dev_cache_exit(void);
*/
int dev_cache_check_for_open_devices(void);
+/*
+ * Check if a device contains slave device.
+ */
+int dev_cache_check_dev_slaves_contains_dev(struct device *dev,
+ struct device *slave_dev);
+
/* Trigger(1) or avoid(0) a scan */
void dev_cache_scan(int do_scan);
int dev_cache_has_scanned(void);
diff --git a/lib/metadata/merge.c b/lib/metadata/merge.c
index 17227c173..473c6836e 100644
--- a/lib/metadata/merge.c
+++ b/lib/metadata/merge.c
@@ -84,6 +84,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
int error_count = 0;
struct replicator_site *rsite;
struct replicator_device *rdev;
+ struct device *lv_dev;
/* Check LV flags match first segment type */
if (complete_vg) {
@@ -141,6 +142,8 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
}
}
+ lv_dev = dev_cache_get_by_custom_key(lv->lvid.s);
+
dm_list_iterate_items(seg, &lv->segments) {
seg_count++;
if (seg->le != le) {
@@ -370,6 +373,10 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
lv->name, seg_count, s);
inc_error_count;
}
+ if (lv_dev && !dev_cache_check_dev_slaves_contains_dev(lv_dev, seg_dev(seg,s)))
+ log_warn("WARNING: Active LV %s/%s is inconsistent. "
+ "It's using device %s while real device used is different.",
+ lv->vg->name, lv->name, dev_name(seg_dev(seg, s)));
} else {
if (!seg_lv(seg, s) ||
seg_lv(seg, s)->vg != lv->vg ||