]> sourceware.org Git - lvm2.git/commitdiff
vdo: read VDO stats via dm message
authorZdenek Kabelac <zkabelac@redhat.com>
Mon, 19 Feb 2024 13:13:20 +0000 (14:13 +0100)
committerZdenek Kabelac <zkabelac@redhat.com>
Mon, 19 Feb 2024 13:20:39 +0000 (14:20 +0100)
As the sysfs interface is seen somewhat obsolete, swith code
to prefer using DM 'stats' message to get our currently needed
info for VDO pool target.

lib/activate/dev_manager.c
lib/metadata/metadata-exported.h
lib/metadata/vdo_manip.c

index 9b1dcd2500d5aba73577e4e55e143381f506ce75..4da2a0ad79621b7af4027d997a61f24c9bd76173 100644 (file)
@@ -1905,6 +1905,60 @@ out:
        return r;
 }
 
+/* Read info from DM VDO 'stats' message */
+static int _dev_manager_vdo_pool_message_stats(struct dev_manager *dm,
+                                              const struct logical_volume *lv,
+                                              struct lv_status_vdo *status)
+{
+       const char *response;
+       const char *dlid;
+       struct dm_task *dmt = NULL;
+       int r = 0;
+       unsigned i;
+       const char *p;
+       struct vdo_msg_elem {
+               const char *name;
+               uint64_t *val;
+       } const vme[] = {
+               { "dataBlocksUsed", &status->data_blocks_used },
+               { "logicalBlocksUsed", &status->logical_blocks_used }
+       };
+
+       if (!(dlid = build_dm_uuid(dm->mem, lv, lv_layer(lv))))
+               return_0;
+
+       if (!(dmt = _setup_task_run(DM_DEVICE_TARGET_MSG, NULL, NULL, dlid, 0, 0, 0, 0, 0, 0)))
+               return_0;
+
+       if (!dm_task_set_message(dmt, "stats"))
+               goto_out;
+
+       if (!dm_task_run(dmt))
+               goto_out;
+
+       log_debug_activation("Checking VDO pool stats message for LV %s.",
+                            display_lvname(lv));
+
+       if ((response = dm_task_get_message_response(dmt))) {
+               for (i = 0; i < DM_ARRAY_SIZE(vme); ++i) {
+                       errno = 0;
+                       if (!(p = strstr(response,  vme[i].name)) ||
+                           !(p = strchr(p, ':')) ||
+                           ((*vme[i].val = strtoul(p + 1, NULL, 10)) == ULLONG_MAX) || errno) {
+                               log_debug("Cannot parse %s in VDO DM stats message.", vme[i].name);
+                               *vme[i].val = 0;
+                               goto out;
+                       }
+               }
+       }
+
+       r = 1;
+out:
+       dm_task_destroy(dmt);
+
+       return r;
+}
+
 int dev_manager_vdo_pool_status(struct dev_manager *dm,
                                const struct logical_volume *lv, int flush,
                                struct lv_status_vdo **status, int *exists)
@@ -1945,6 +1999,9 @@ int dev_manager_vdo_pool_status(struct dev_manager *dm,
                goto out;
        }
 
+       if (!_dev_manager_vdo_pool_message_stats(dm, lv, *status))
+               stack;
+
        if (!parse_vdo_pool_status(dm->mem, lv, params, &info, *status))
                goto_out;
 
index 8c7bd4583db04d3a3d2573ac5d5f5cef8141c704..c9825799bb070d830c9cf64b66cd219ee4cdc642 100644 (file)
@@ -1380,8 +1380,9 @@ int wipe_cache_pool(struct logical_volume *cache_pool_lv);
 struct lv_status_vdo {
        struct dm_pool *mem;
        struct dm_vdo_status *vdo;
-       uint64_t data_blocks_used;      /* grabbed from /sys/kvdo */
-       uint64_t logical_blocks_used;   /* grabbed from /sys/kvdo */
+       /* grabbed from DM stats message, /sys/block/dm-/vdo or /sys/kvdo */
+       uint64_t data_blocks_used;
+       uint64_t logical_blocks_used;
        dm_percent_t usage;
        dm_percent_t saving;
        dm_percent_t data_usage;
index c8eebe55a297038d01ef4f84786952e9eba8132d..1ee39c6d70ad865feb95539d3c1fc457bcbfd23e 100644 (file)
@@ -217,10 +217,12 @@ int parse_vdo_pool_status(struct dm_pool *mem, const struct logical_volume *vdo_
        status->vdo = result.status;
 
        if ((result.status->operating_mode == DM_VDO_MODE_NORMAL) &&
-           _sysfs_get_kvdo_value(dm_name, dminfo, "statistics/data_blocks_used",
-                                 &status->data_blocks_used) &&
-           _sysfs_get_kvdo_value(dm_name, dminfo, "statistics/logical_blocks_used",
-                                 &status->logical_blocks_used)) {
+            (status->data_blocks_used ||
+            _sysfs_get_kvdo_value(dm_name, dminfo, "statistics/data_blocks_used",
+                                  &status->data_blocks_used)) &&
+           (status->logical_blocks_used ||
+            _sysfs_get_kvdo_value(dm_name, dminfo, "statistics/logical_blocks_used",
+                                  &status->logical_blocks_used))) {
                status->usage = dm_make_percent(result.status->used_blocks,
                                                result.status->total_blocks);
                status->saving = dm_make_percent(status->logical_blocks_used - status->data_blocks_used,
This page took 0.039794 seconds and 5 git commands to generate.