From 75c9ce8bc83bf0b107ec60b4872deccb39a6274c Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Fri, 1 Apr 2022 12:26:13 +0200 Subject: [PATCH] tree: add namespace path iterators For some reason the namespace path iterators have not been implemented. Signed-off-by: Hannes Reinecke --- src/libnvme.map | 2 ++ src/nvme/tree.c | 10 ++++++++++ src/nvme/tree.h | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/src/libnvme.map b/src/libnvme.map index bc6374c9..511d55e2 100644 --- a/src/libnvme.map +++ b/src/libnvme.map @@ -185,6 +185,8 @@ LIBNVME_1_0 { nvme_namespace_attach_ctrls; nvme_namespace_detach_ctrls; nvme_namespace_filter; + nvme_namespace_first_path; + nvme_namespace_next_path; nvme_next_host; nvme_next_subsystem; nvme_ns_attach; diff --git a/src/nvme/tree.c b/src/nvme/tree.c index 2fd75af6..d002aad3 100644 --- a/src/nvme/tree.c +++ b/src/nvme/tree.c @@ -325,6 +325,16 @@ nvme_ns_t nvme_subsystem_next_ns(nvme_subsystem_t s, nvme_ns_t n) return n ? list_next(&s->namespaces, n, entry) : NULL; } +nvme_path_t nvme_namespace_first_path(nvme_ns_t ns) +{ + return list_top(&ns->paths, struct nvme_path, nentry); +} + +nvme_path_t nvme_namespace_next_path(nvme_ns_t ns, nvme_path_t p) +{ + return p ? list_next(&ns->paths, p, nentry) : NULL; +} + static void __nvme_free_ns(struct nvme_ns *n) { list_del_init(&n->entry); diff --git a/src/nvme/tree.h b/src/nvme/tree.h index 7a697208..780a6f78 100644 --- a/src/nvme/tree.h +++ b/src/nvme/tree.h @@ -216,6 +216,23 @@ nvme_ctrl_t nvme_subsystem_first_ctrl(nvme_subsystem_t s); */ nvme_ctrl_t nvme_subsystem_next_ctrl(nvme_subsystem_t s, nvme_ctrl_t c); +/** + * nvme_namespace_first_path() - Start path iterator + * @ns: Namespace instance + * + * Return: First &nvme_path_t object of an @ns iterator + */ +nvme_path_t nvme_namespace_first_path(nvme_ns_t ns); + +/** + * nvme_namespace_next_path() - Next path iterator + * @ns: Namespace instance + * @p: Previous &nvme_path_t object of an @ns iterator + * + * Return: Next &nvme_path_t object of an @ns iterator + */ +nvme_path_t nvme_namespace_next_path(nvme_ns_t c, nvme_path_t p); + /** * nvme_lookup_ctrl() - Lookup nvme_ctrl_t object * @s: &nvme_subsystem_t object @@ -403,6 +420,27 @@ nvme_ns_t nvme_subsystem_next_ns(nvme_subsystem_t s, nvme_ns_t n); for (n = nvme_subsystem_first_ns(s); n != NULL; \ n = nvme_subsystem_next_ns(s, n)) +/** + * nvme_namespace_for_each_path_safe() - Traverse paths + * @ns: Namespace instance + * @p: &nvme_path_t object + * @_p: A &nvme_path_t_node to use as temporary storage + */ +#define nvme_namespace_for_each_path_safe(n, p, _p) \ + for (p = nvme_namespace_first_path(n), \ + _p = nvme_namespace_next_path(n, p); \ + p != NULL; \ + p = _p, _p = nvme_namespace_next_path(n, p)) + +/** + * nvme_namespace_for_each_path() - Traverse paths + * @ns: Namespace instance + * @p: &nvme_path_t object + */ +#define nvme_namespace_for_each_path(c, p) \ + for (p = nvme_namespace_first_path(c); p != NULL; \ + p = nvme_namespace_next_path(c, p)) + /** * nvme_ns_get_fd() - Get associated filedescriptor * @n: Namespace instance -- 2.50.1