diff options
author | Peter Rajnoha <prajnoha@redhat.com> | 2016-03-09 13:00:52 +0100 |
---|---|---|
committer | Peter Rajnoha <prajnoha@redhat.com> | 2016-03-09 13:43:16 +0100 |
commit | ce97ea62e951edb194bbf5b253e213119b6cbdf3 (patch) | |
tree | 0c2a307bc1bf49d4a16d106b4f6447b2cca8d821 | |
parent | f3ef7943426b9d9bddbbc1697aa1cb6e91551e1a (diff) | |
download | lvm2-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.c | 16 | ||||
-rw-r--r-- | lib/device/dev-cache.h | 6 | ||||
-rw-r--r-- | lib/metadata/merge.c | 7 |
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 || |