summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryn M. Reeves <bmr@redhat.com>2016-12-19 21:27:31 +0000
committerBryn M. Reeves <bmr@redhat.com>2017-02-10 17:09:24 +0000
commit95cd54447710ac9c5b6a55292a8996439f5fb4e7 (patch)
tree9cf906730c1adb1db79c6a9a9ce69204dcaed3ac
parentf0f2083e673e22c80a22877e9b33fcdbce211c34 (diff)
downloadlvm2-95cd54447710ac9c5b6a55292a8996439f5fb4e7.tar.gz
libdm: add dm_stats_resize_region()
Add support for resizing statistics regions. This depends on the (not yet upstream) @stats_resize message which allows a region to be grown in-place without losing counter values. FIXME: test for driver version once known.
-rw-r--r--libdm/.exported_symbols.DM_1_02_1381
-rw-r--r--libdm/libdevmapper.h8
-rw-r--r--libdm/libdm-stats.c45
3 files changed, 54 insertions, 0 deletions
diff --git a/libdm/.exported_symbols.DM_1_02_138 b/libdm/.exported_symbols.DM_1_02_138
index 60d4f208f..537a6dd71 100644
--- a/libdm/.exported_symbols.DM_1_02_138
+++ b/libdm/.exported_symbols.DM_1_02_138
@@ -6,4 +6,5 @@ dm_bitset_parse_list
dm_message_supports_stats_resize
dm_stats_bind_from_fd
dm_stats_driver_supports_resize
+dm_stats_resize_region
dm_stats_start_filemapd
diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h
index 7c3e7ca65..4a08492d1 100644
--- a/libdm/libdevmapper.h
+++ b/libdm/libdevmapper.h
@@ -690,6 +690,14 @@ int dm_stats_create_region(struct dm_stats *dms, uint64_t *region_id,
const char *program_id, const char *user_data);
/*
+ * Atomically resize an existing statistics region, retaining any
+ * accumulated counter data. This can be used to grow a statistics
+ * region to account for changes in the object it represents.
+ */
+int dm_stats_resize_region(struct dm_stats *dms, uint64_t region_id,
+ int64_t size_change);
+
+/*
* Delete the specified statistics region. This will also mark the
* region as not-present and discard any existing statistics data.
*/
diff --git a/libdm/libdm-stats.c b/libdm/libdm-stats.c
index d5ae7faec..5296b823b 100644
--- a/libdm/libdm-stats.c
+++ b/libdm/libdm-stats.c
@@ -2035,6 +2035,51 @@ out:
return r;
}
+static int _stats_resize_region(struct dm_stats *dms, uint64_t region_id,
+ int64_t size_change)
+{
+ struct dm_stats_region *region = &dms->regions[region_id];
+ char msg[STATS_MSG_BUF_LEN];
+ struct dm_task *dmt = NULL;
+
+ if (!_stats_bound(dms))
+ return_0;
+
+ if (!dm_stats_driver_supports_resize()) {
+ log_error("Driver does not support stats resize message.");
+ return 0;
+ }
+
+ if ((dm_snprintf(msg, sizeof(msg), "@stats_resize " FMTu64 " " FMTu64,
+ region_id, size_change)) < 0) {
+ log_error("Could not format @stats_resize message.");
+ return 0;
+ }
+
+ if (!(dmt = _stats_send_message(dms, msg)))
+ return_0;
+
+ if (dms->regions && _stats_region_present(region)) {
+ if (region->step == region->len)
+ region->step = region->len = region->len + size_change;
+ else
+ region->len += size_change;
+ }
+
+ return 1;
+}
+
+int dm_stats_resize_region(struct dm_stats *dms, uint64_t region_id,
+ int64_t size_change)
+{
+ if (size_change < 0) {
+ log_error("Shrinking statistics regions is currently "
+ "unsupported.");
+ return 0;
+ }
+ return _stats_resize_region(dms, region_id, size_change);
+}
+
static void _stats_clear_group_regions(struct dm_stats *dms, uint64_t group_id)
{
struct dm_stats_group *group;