|
|
9db2f0 |
From e7b6438f17f5f2870477c0ebd2ff3ac7b02f6ca7 Mon Sep 17 00:00:00 2001
|
|
|
9db2f0 |
From: Zdenek Kabelac <zkabelac@redhat.com>
|
|
|
9db2f0 |
Date: Thu, 9 Sep 2021 14:59:38 +0200
|
|
|
9db2f0 |
Subject: [PATCH 2/3] vdo: read new sysfs path
|
|
|
9db2f0 |
|
|
|
9db2f0 |
New versions of kvdo module exposes statistics at new location:
|
|
|
9db2f0 |
/sys/block/dm-XXX/vdo/statistics/...
|
|
|
9db2f0 |
|
|
|
9db2f0 |
Enhance lvm2 to access this location first.
|
|
|
9db2f0 |
Also if the statistic info is missing - make it 'debug' level info,
|
|
|
9db2f0 |
so it is not failing 'lvs' command.
|
|
|
9db2f0 |
|
|
|
9db2f0 |
(cherry picked from commit e6f735d411e5911de186a610932c9bb9638275eb)
|
|
|
9db2f0 |
|
|
|
9db2f0 |
Conflicts:
|
|
|
9db2f0 |
WHATS_NEW
|
|
|
9db2f0 |
---
|
|
|
9db2f0 |
WHATS_NEW | 4 ++++
|
|
|
9db2f0 |
lib/activate/dev_manager.c | 7 +++---
|
|
|
9db2f0 |
lib/metadata/metadata-exported.h | 3 ++-
|
|
|
9db2f0 |
lib/metadata/vdo_manip.c | 46 ++++++++++++++++++++++------------------
|
|
|
9db2f0 |
4 files changed, 35 insertions(+), 25 deletions(-)
|
|
|
9db2f0 |
|
|
|
9db2f0 |
diff --git a/WHATS_NEW b/WHATS_NEW
|
|
|
9db2f0 |
index d5c9669..958e745 100644
|
|
|
9db2f0 |
--- a/WHATS_NEW
|
|
|
9db2f0 |
+++ b/WHATS_NEW
|
|
|
9db2f0 |
@@ -1,3 +1,7 @@
|
|
|
9db2f0 |
+Version 2.03.14 -
|
|
|
9db2f0 |
+==================================
|
|
|
9db2f0 |
+ Support newer location for VDO statistics.
|
|
|
9db2f0 |
+
|
|
|
9db2f0 |
Version 2.03.13 - 11th August 2021
|
|
|
9db2f0 |
==================================
|
|
|
9db2f0 |
Changes in udev support:
|
|
|
9db2f0 |
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
|
|
|
9db2f0 |
index c4a6739..0d954d1 100644
|
|
|
9db2f0 |
--- a/lib/activate/dev_manager.c
|
|
|
9db2f0 |
+++ b/lib/activate/dev_manager.c
|
|
|
9db2f0 |
@@ -157,6 +157,7 @@ out:
|
|
|
9db2f0 |
|
|
|
9db2f0 |
static int _get_segment_status_from_target_params(const char *target_name,
|
|
|
9db2f0 |
const char *params,
|
|
|
9db2f0 |
+ const struct dm_info *dminfo,
|
|
|
9db2f0 |
struct lv_seg_status *seg_status)
|
|
|
9db2f0 |
{
|
|
|
9db2f0 |
const struct lv_segment *seg = seg_status->seg;
|
|
|
9db2f0 |
@@ -216,7 +217,7 @@ static int _get_segment_status_from_target_params(const char *target_name,
|
|
|
9db2f0 |
return_0;
|
|
|
9db2f0 |
seg_status->type = SEG_STATUS_SNAPSHOT;
|
|
|
9db2f0 |
} else if (segtype_is_vdo_pool(segtype)) {
|
|
|
9db2f0 |
- if (!parse_vdo_pool_status(seg_status->mem, seg->lv, params, &seg_status->vdo_pool))
|
|
|
9db2f0 |
+ if (!parse_vdo_pool_status(seg_status->mem, seg->lv, params, dminfo, &seg_status->vdo_pool))
|
|
|
9db2f0 |
return_0;
|
|
|
9db2f0 |
seg_status->type = SEG_STATUS_VDO_POOL;
|
|
|
9db2f0 |
} else if (segtype_is_writecache(segtype)) {
|
|
|
9db2f0 |
@@ -320,7 +321,7 @@ static int _info_run(const char *dlid, struct dm_info *dminfo,
|
|
|
9db2f0 |
} while (target);
|
|
|
9db2f0 |
|
|
|
9db2f0 |
if (!target_name ||
|
|
|
9db2f0 |
- !_get_segment_status_from_target_params(target_name, target_params, seg_status))
|
|
|
9db2f0 |
+ !_get_segment_status_from_target_params(target_name, target_params, dminfo, seg_status))
|
|
|
9db2f0 |
stack;
|
|
|
9db2f0 |
}
|
|
|
9db2f0 |
|
|
|
9db2f0 |
@@ -1886,7 +1887,7 @@ int dev_manager_vdo_pool_status(struct dev_manager *dm,
|
|
|
9db2f0 |
goto out;
|
|
|
9db2f0 |
}
|
|
|
9db2f0 |
|
|
|
9db2f0 |
- if (!parse_vdo_pool_status(dm->mem, lv, params, *status))
|
|
|
9db2f0 |
+ if (!parse_vdo_pool_status(dm->mem, lv, params, &info, *status))
|
|
|
9db2f0 |
goto_out;
|
|
|
9db2f0 |
|
|
|
9db2f0 |
(*status)->mem = dm->mem;
|
|
|
9db2f0 |
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
|
|
|
9db2f0 |
index 96a9533..7bac5b9 100644
|
|
|
9db2f0 |
--- a/lib/metadata/metadata-exported.h
|
|
|
9db2f0 |
+++ b/lib/metadata/metadata-exported.h
|
|
|
9db2f0 |
@@ -1365,7 +1365,8 @@ const char *get_vdo_write_policy_name(enum dm_vdo_write_policy policy);
|
|
|
9db2f0 |
uint64_t get_vdo_pool_virtual_size(const struct lv_segment *vdo_pool_seg);
|
|
|
9db2f0 |
int update_vdo_pool_virtual_size(struct lv_segment *vdo_pool_seg);
|
|
|
9db2f0 |
int parse_vdo_pool_status(struct dm_pool *mem, const struct logical_volume *vdo_pool_lv,
|
|
|
9db2f0 |
- const char *params, struct lv_status_vdo *status);
|
|
|
9db2f0 |
+ const char *params, const struct dm_info *dminfo,
|
|
|
9db2f0 |
+ struct lv_status_vdo *status);
|
|
|
9db2f0 |
struct logical_volume *convert_vdo_pool_lv(struct logical_volume *data_lv,
|
|
|
9db2f0 |
const struct dm_vdo_target_params *vtp,
|
|
|
9db2f0 |
uint32_t *virtual_extents,
|
|
|
9db2f0 |
diff --git a/lib/metadata/vdo_manip.c b/lib/metadata/vdo_manip.c
|
|
|
9db2f0 |
index 3f2de1a..2917f29 100644
|
|
|
9db2f0 |
--- a/lib/metadata/vdo_manip.c
|
|
|
9db2f0 |
+++ b/lib/metadata/vdo_manip.c
|
|
|
9db2f0 |
@@ -123,48 +123,56 @@ int update_vdo_pool_virtual_size(struct lv_segment *vdo_pool_seg)
|
|
|
9db2f0 |
return 1;
|
|
|
9db2f0 |
}
|
|
|
9db2f0 |
|
|
|
9db2f0 |
-static int _sysfs_get_kvdo_value(const char *dm_name, const char *vdo_param, uint64_t *value)
|
|
|
9db2f0 |
+static int _sysfs_get_kvdo_value(const char *dm_name, const struct dm_info *dminfo,
|
|
|
9db2f0 |
+ const char *vdo_param, uint64_t *value)
|
|
|
9db2f0 |
{
|
|
|
9db2f0 |
char path[PATH_MAX];
|
|
|
9db2f0 |
char temp[64];
|
|
|
9db2f0 |
int fd, size, r = 0;
|
|
|
9db2f0 |
|
|
|
9db2f0 |
- if (dm_snprintf(path, sizeof(path), "%skvdo/%s/%s",
|
|
|
9db2f0 |
- dm_sysfs_dir(), dm_name, vdo_param) < 0) {
|
|
|
9db2f0 |
- log_error("Failed to build kmod path.");
|
|
|
9db2f0 |
+ if (dm_snprintf(path, sizeof(path), "%s/block/dm-%d/vdo/%s",
|
|
|
9db2f0 |
+ dm_sysfs_dir(), dminfo->minor, vdo_param) < 0) {
|
|
|
9db2f0 |
+ log_debug("Failed to build kvdo path.");
|
|
|
9db2f0 |
return 0;
|
|
|
9db2f0 |
}
|
|
|
9db2f0 |
|
|
|
9db2f0 |
if ((fd = open(path, O_RDONLY)) < 0) {
|
|
|
9db2f0 |
- if (errno != ENOENT)
|
|
|
9db2f0 |
- log_sys_error("open", path);
|
|
|
9db2f0 |
- else
|
|
|
9db2f0 |
+ /* try with older location */
|
|
|
9db2f0 |
+ if (dm_snprintf(path, sizeof(path), "%skvdo/%s/%s",
|
|
|
9db2f0 |
+ dm_sysfs_dir(), dm_name, vdo_param) < 0) {
|
|
|
9db2f0 |
+ log_debug("Failed to build kvdo path.");
|
|
|
9db2f0 |
+ return 0;
|
|
|
9db2f0 |
+ }
|
|
|
9db2f0 |
+
|
|
|
9db2f0 |
+ if ((fd = open(path, O_RDONLY)) < 0) {
|
|
|
9db2f0 |
log_sys_debug("open", path);
|
|
|
9db2f0 |
- goto bad;
|
|
|
9db2f0 |
+ goto bad;
|
|
|
9db2f0 |
+ }
|
|
|
9db2f0 |
}
|
|
|
9db2f0 |
|
|
|
9db2f0 |
if ((size = read(fd, temp, sizeof(temp) - 1)) < 0) {
|
|
|
9db2f0 |
- log_sys_error("read", path);
|
|
|
9db2f0 |
+ log_sys_debug("read", path);
|
|
|
9db2f0 |
goto bad;
|
|
|
9db2f0 |
}
|
|
|
9db2f0 |
temp[size] = 0;
|
|
|
9db2f0 |
errno = 0;
|
|
|
9db2f0 |
*value = strtoll(temp, NULL, 0);
|
|
|
9db2f0 |
if (errno) {
|
|
|
9db2f0 |
- log_sys_error("strtool", path);
|
|
|
9db2f0 |
+ log_sys_debug("strtool", path);
|
|
|
9db2f0 |
goto bad;
|
|
|
9db2f0 |
}
|
|
|
9db2f0 |
|
|
|
9db2f0 |
r = 1;
|
|
|
9db2f0 |
bad:
|
|
|
9db2f0 |
if (fd >= 0 && close(fd))
|
|
|
9db2f0 |
- log_sys_error("close", path);
|
|
|
9db2f0 |
+ log_sys_debug("close", path);
|
|
|
9db2f0 |
|
|
|
9db2f0 |
return r;
|
|
|
9db2f0 |
}
|
|
|
9db2f0 |
|
|
|
9db2f0 |
int parse_vdo_pool_status(struct dm_pool *mem, const struct logical_volume *vdo_pool_lv,
|
|
|
9db2f0 |
- const char *params, struct lv_status_vdo *status)
|
|
|
9db2f0 |
+ const char *params, const struct dm_info *dminfo,
|
|
|
9db2f0 |
+ struct lv_status_vdo *status)
|
|
|
9db2f0 |
{
|
|
|
9db2f0 |
struct dm_vdo_status_parse_result result;
|
|
|
9db2f0 |
char *dm_name;
|
|
|
9db2f0 |
@@ -188,15 +196,11 @@ int parse_vdo_pool_status(struct dm_pool *mem, const struct logical_volume *vdo_
|
|
|
9db2f0 |
|
|
|
9db2f0 |
status->vdo = result.status;
|
|
|
9db2f0 |
|
|
|
9db2f0 |
- if (result.status->operating_mode == DM_VDO_MODE_NORMAL) {
|
|
|
9db2f0 |
- if (!_sysfs_get_kvdo_value(dm_name, "statistics/data_blocks_used",
|
|
|
9db2f0 |
- &status->data_blocks_used))
|
|
|
9db2f0 |
- return_0;
|
|
|
9db2f0 |
-
|
|
|
9db2f0 |
- if (!_sysfs_get_kvdo_value(dm_name, "statistics/logical_blocks_used",
|
|
|
9db2f0 |
- &status->logical_blocks_used))
|
|
|
9db2f0 |
- return_0;
|
|
|
9db2f0 |
-
|
|
|
9db2f0 |
+ if ((result.status->operating_mode == DM_VDO_MODE_NORMAL) &&
|
|
|
9db2f0 |
+ _sysfs_get_kvdo_value(dm_name, dminfo, "statistics/data_blocks_used",
|
|
|
9db2f0 |
+ &status->data_blocks_used) &&
|
|
|
9db2f0 |
+ _sysfs_get_kvdo_value(dm_name, dminfo, "statistics/logical_blocks_used",
|
|
|
9db2f0 |
+ &status->logical_blocks_used)) {
|
|
|
9db2f0 |
status->usage = dm_make_percent(result.status->used_blocks,
|
|
|
9db2f0 |
result.status->total_blocks);
|
|
|
9db2f0 |
status->saving = dm_make_percent(status->logical_blocks_used - status->data_blocks_used,
|
|
|
9db2f0 |
--
|
|
|
9db2f0 |
1.8.3.1
|
|
|
9db2f0 |
|