summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlasdair G Kergon <agk@redhat.com>2016-01-18 22:04:43 +0000
committerAlasdair G Kergon <agk@redhat.com>2016-01-18 22:04:43 +0000
commita3f484f812bfb89063fbc25e378f34cacd50bf7d (patch)
treec445465cf98d5b8c7a6efb4e49e8d4a85f9e33d5
parent6d7dc87cb356162f912b13c8a0cd198037c0226b (diff)
downloadlvm2-a3f484f812bfb89063fbc25e378f34cacd50bf7d.tar.gz
report: Fix seg_pe_ranges LV sizes.
When reporting on LVs, take the end of the range from the size of the underlying (hidden) LV rather than the logical size of the current segment (that PVs use).
-rw-r--r--WHATS_NEW1
-rw-r--r--lib/metadata/lv.c6
2 files changed, 6 insertions, 1 deletions
diff --git a/WHATS_NEW b/WHATS_NEW
index 04994690f..5a16d1660 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.141 -
====================================
+ Change LV sizes in seg_pe_ranges report field to match underlying devices.
Add kernel_cache_settings report field for cache LV settings used in kernel.
Version 2.02.140 - 16th January 2016
diff --git a/lib/metadata/lv.c b/lib/metadata/lv.c
index 49c195fee..6d52577a1 100644
--- a/lib/metadata/lv.c
+++ b/lib/metadata/lv.c
@@ -36,6 +36,7 @@ static char *_format_pvsegs(struct dm_pool *mem, const struct lv_segment *seg,
unsigned int s;
const char *name = NULL;
uint32_t extent = 0;
+ uint32_t seg_len = 0;
char extent_str[32];
struct logical_volume *lv;
int visible = 1;
@@ -52,6 +53,7 @@ static char *_format_pvsegs(struct dm_pool *mem, const struct lv_segment *seg,
switch (metadata_areas_only ? seg_metatype(seg, s) : seg_type(seg, s)) {
case AREA_LV:
lv = metadata_areas_only ? seg_metalv(seg, s) : seg_lv(seg, s);
+ seg_len = metadata_areas_only ? seg_metalv(seg, s)->le_count - 1 : seg_lv(seg, s)->le_count;
visible = lv_is_visible(lv);
name = lv->name;
extent = metadata_areas_only ? seg_le(seg, s) : 0;
@@ -62,10 +64,12 @@ static char *_format_pvsegs(struct dm_pool *mem, const struct lv_segment *seg,
continue;
name = dev_name(seg_dev(seg, s));
extent = seg_pe(seg, s);
+ seg_len = seg->area_len;
break;
case AREA_UNASSIGNED:
name = "unassigned";
extent = 0;
+ seg_len = 0;
break;
default:
log_error(INTERNAL_ERROR "Unknown area segtype.");
@@ -101,7 +105,7 @@ static char *_format_pvsegs(struct dm_pool *mem, const struct lv_segment *seg,
if (range_format) {
if (dm_snprintf(extent_str, sizeof(extent_str),
- FMTu32, metadata_areas_only ? extent + seg_metalv(seg, s)->le_count - 1 : extent + seg->area_len - 1) < 0) {
+ FMTu32, extent + seg_len - 1) < 0) {
log_error("Extent number dm_snprintf failed");
return NULL;
}