Obtain the ana_state attribute from the kernel and use it to display information about path state and "priority" of native NVMe multipath. Signed-off-by: Martin Wilck <mwilck@xxxxxxxx> --- libmultipath/foreign/nvme.c | 43 +++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/libmultipath/foreign/nvme.c b/libmultipath/foreign/nvme.c index 11849889..bda9bcc4 100644 --- a/libmultipath/foreign/nvme.c +++ b/libmultipath/foreign/nvme.c @@ -204,12 +204,6 @@ nvme_pg_rel_paths(const struct gen_pathgroup *gpg, const struct _vector *v) /* empty */ } -static int snprint_nvme_pg(const struct gen_pathgroup *gmp, - char *buff, int len, char wildcard) -{ - return snprintf(buff, len, N_A); -} - static int snprint_hcil(const struct nvme_path *np, char *buf, int len) { unsigned int nvmeid, ctlid, nsid; @@ -249,6 +243,23 @@ static int snprint_nvme_path(const struct gen_path *gp, case 'o': sysfs_attr_get_value(np->ctl, "state", fld, sizeof(fld)); return snprintf(buff, len, "%s", fld); + case 'T': + if (sysfs_attr_get_value(np->udev, "ana_state", fld, + sizeof(fld)) > 0) + return snprintf(buff, len, "%s", fld); + break; + case 'p': + if (sysfs_attr_get_value(np->udev, "ana_state", fld, + sizeof(fld)) > 0) { + rstrip(fld); + if (!strcmp(fld, "optimized")) + return snprintf(buff, len, "%d", 50); + else if (!strcmp(fld, "non-optimized")) + return snprintf(buff, len, "%d", 10); + else + return snprintf(buff, len, "%d", 0); + } + break; case 's': snprintf(fld, sizeof(fld), "%s", udev_device_get_sysattr_value(np->ctl, @@ -286,12 +297,30 @@ static int snprint_nvme_path(const struct gen_path *gp, udev_device_get_sysname(pci)); /* fall through */ default: - return snprintf(buff, len, "%s", N_A); break; } + return snprintf(buff, len, "%s", N_A); return 0; } +static int snprint_nvme_pg(const struct gen_pathgroup *gmp, + char *buff, int len, char wildcard) +{ + const struct nvme_pathgroup *pg = const_gen_pg_to_nvme(gmp); + const struct nvme_path *path = nvme_pg_to_path(pg); + + switch (wildcard) { + case 't': + return snprint_nvme_path(nvme_path_to_gen(path), + buff, len, 'T'); + case 'p': + return snprint_nvme_path(nvme_path_to_gen(path), + buff, len, 'p'); + default: + return snprintf(buff, len, N_A); + } +} + static int nvme_style(const struct gen_multipath* gm, char *buf, int len, int verbosity) { -- 2.19.2 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel