summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2016-03-30 11:14:13 +0200
committerZdenek Kabelac <zkabelac@redhat.com>2016-03-31 12:20:43 +0200
commitfc7dacaa4c6bf0af4c5a457c098da26d7cc71f9c (patch)
tree92d98d1a61120e7c7ea2090488ebe2d62edf8d97
parent8bbec41bd482175ee61478bef65cc58c7e814abf (diff)
downloadlvm2-fc7dacaa4c6bf0af4c5a457c098da26d7cc71f9c.tar.gz
thin: display highest mapped sector
Use meta% to expose highest mapped sector in thinLV. so showing there 100.00% means thinLV maps latest sector. Currently using a 'trick' with total_numerator to pass-in device size when 'seg==NULL' TODO: Improve device status API per target - current 'percentage' is not really extensible.
-rw-r--r--WHATS_NEW1
-rw-r--r--lib/activate/dev_manager.c4
-rw-r--r--lib/thin/thin.c15
3 files changed, 14 insertions, 6 deletions
diff --git a/WHATS_NEW b/WHATS_NEW
index 3237e0a91..2ad2d69d2 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.149 -
==================================
+ Report highest mapping for thin volume as Meta%.
Do not flush thin-pool when checking metadata fullness.
Remove spurious error about no value in /sys/dev/block/major:minor/dm/uuid.
Fix device mismatch detection for LV if persistent .cache file is used.
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index 2696c5604..40e4086d7 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -938,6 +938,10 @@ static int _percent_run(struct dev_manager *dm, const char *name,
if (!segtype->ops->target_percent)
continue;
+ /* For thin volume pass device size via 'total_numerator' */
+ if (!seg && segtype_is_thin_volume(segtype))
+ total_numerator = length - 1; /* highest mapped is 0 .. (length - 1) */
+
if (!segtype->ops->target_percent(&dm->target_state,
&percent, dm->mem,
dm->cmd, seg, params,
diff --git a/lib/thin/thin.c b/lib/thin/thin.c
index a85075739..c07859ae8 100644
--- a/lib/thin/thin.c
+++ b/lib/thin/thin.c
@@ -613,7 +613,7 @@ static int _thin_add_target_line(struct dev_manager *dm,
static int _thin_target_percent(void **target_state __attribute__((unused)),
dm_percent_t *percent,
struct dm_pool *mem,
- struct cmd_context *cmd __attribute__((unused)),
+ struct cmd_context *cmd,
struct lv_segment *seg,
char *params,
uint64_t *total_numerator,
@@ -643,15 +643,18 @@ static int _thin_target_percent(void **target_state __attribute__((unused)),
*percent = dm_make_percent(s->mapped_sectors, csize);
*total_denominator += csize;
+ *total_numerator += s->mapped_sectors;
} else {
- /* No lv_segment info here */
- *percent = DM_PERCENT_INVALID;
- /* FIXME: Using denominator to pass the mapped info upward? */
+ /* Using denominator to pass the mapped info upward? */
+ if (s->highest_mapped_sector > *total_numerator) {
+ log_warn("WARNING: highest mapped sector %s is above device size.",
+ display_size(cmd, s->highest_mapped_sector));
+ s->highest_mapped_sector = *total_numerator;
+ }
+ *percent = dm_make_percent(s->highest_mapped_sector, *total_numerator);
*total_denominator += s->highest_mapped_sector;
}
- *total_numerator += s->mapped_sectors;
-
return 1;
}