diff options
author | Bryn M. Reeves <bmr@redhat.com> | 2016-12-19 21:27:31 +0000 |
---|---|---|
committer | Bryn M. Reeves <bmr@redhat.com> | 2017-02-10 17:09:24 +0000 |
commit | 95cd54447710ac9c5b6a55292a8996439f5fb4e7 (patch) | |
tree | 9cf906730c1adb1db79c6a9a9ce69204dcaed3ac | |
parent | f0f2083e673e22c80a22877e9b33fcdbce211c34 (diff) | |
download | lvm2-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_138 | 1 | ||||
-rw-r--r-- | libdm/libdevmapper.h | 8 | ||||
-rw-r--r-- | libdm/libdm-stats.c | 45 |
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; |