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)
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;
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,