nvme: check for capability feat=dns_traddr dns-traddr
authorSagi Grimberg <sagi.grimberg@vastdata.com>
Thu, 28 Mar 2024 14:16:27 +0000 (16:16 +0200)
committerSagi Grimberg <sagi@grimberg.me>
Sun, 26 May 2024 09:38:32 +0000 (12:38 +0300)
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
src/nvme/fabrics.c
src/nvme/fabrics.h
src/nvme/private.h
src/nvme/tree.c

index f06ad7974bdd473043e4b5a42c9041828114472a..0a497280f87cf3f6f86cc8ac3ad1a73ae4d43c96 100644 (file)
@@ -223,6 +223,7 @@ static const struct nvme_fabric_options default_supported_options = {
        .traddr = true,
        .transport = true,
        .trsvcid = true,
+       .dns_traddr = false,
 };
 
 void nvmf_default_config(struct nvme_fabrics_config *cfg)
@@ -357,7 +358,7 @@ static int __add_argument(char **argstr, const char *tok, const char *arg)
        return 0;
 }
 
-static int __nvmf_supported_options(nvme_root_t r);
+int __nvmf_supported_options(nvme_root_t r);
 #define nvmf_check_option(r, tok)                                      \
 ({                                                                     \
        !__nvmf_supported_options(r) && (r)->options->tok;              \
@@ -655,7 +656,7 @@ static int build_options(nvme_host_t h, nvme_ctrl_t c, char **argstr)
                continue;                  \
        }
 
-static  int __nvmf_supported_options(nvme_root_t r)
+int __nvmf_supported_options(nvme_root_t r)
 {
        char buf[0x1000], *options, *p, *v;
        _cleanup_fd_ int fd = -1;
@@ -706,6 +707,12 @@ static  int __nvmf_supported_options(nvme_root_t r)
                v = strsep(&p, "= ");
                if (!v)
                        continue;
+               if (!strcmp(v, "feat")) {
+                       v = strsep(&p, "=");
+                       if (!v)
+                               continue;
+               }
+
                nvme_msg(r, LOG_DEBUG, "%s ", v);
 
                parse_option(r, v, cntlid);
@@ -738,6 +745,7 @@ static  int __nvmf_supported_options(nvme_root_t r)
                parse_option(r, v, traddr);
                parse_option(r, v, transport);
                parse_option(r, v, trsvcid);
+               parse_option(r, v, dns_traddr);
        }
        nvme_msg(r, LOG_DEBUG, "\n");
        return 0;
@@ -889,7 +897,8 @@ int nvmf_add_ctrl(nvme_host_t h, nvme_ctrl_t c,
        }
 
        nvme_ctrl_set_discovered(c, true);
-       if (traddr_is_hostname(h->r, c)) {
+       if (traddr_is_hostname(h->r, c) &&
+           !nvmf_check_option(r, dns_traddr)) {
                char *traddr = c->traddr;
 
                c->traddr = hostname2traddr(h->r, traddr);
index 8e26e9f16ef44bb3a8630dfd8d8e0f6baecd5db4..e8673afa792e33c59b51b193cfc0fbbbd7fd700a 100644 (file)
@@ -388,4 +388,74 @@ struct nvme_fabrics_uri *nvme_parse_uri(const char *str);
  */
 void nvme_free_uri(struct nvme_fabrics_uri *uri);
 
+int __nvmf_supported_options(nvme_root_t r);
+#define nvmf_check_option(r, tok)                                      \
+({                                                                     \
+       !__nvmf_supported_options(r) && (r)->options->tok;              \
+})
+
+#define add_bool_argument(o, argstr, tok, arg)                         \
+({                                                                     \
+       int ret;                                                        \
+       if (nvmf_check_option(r, tok)) {                                \
+               ret = __add_bool_argument(argstr,                       \
+                                         stringify(tok),               \
+                                         arg);                         \
+       } else {                                                        \
+               nvme_msg(r, LOG_DEBUG,                                  \
+                        "option \"%s\" ignored\n",                     \
+                        stringify(tok));                               \
+               ret = 0;                                                \
+       }                                                               \
+       ret;                                                            \
+})
+
+#define add_int_argument(o, argstr, tok, arg, allow_zero) \
+({                                                                     \
+       int ret;                                                        \
+       if (nvmf_check_option(r, tok)) {                                \
+               ret = __add_int_argument(argstr,                        \
+                                       stringify(tok),                 \
+                                       arg,                            \
+                                       allow_zero);                    \
+       } else {                                                        \
+               nvme_msg(r, LOG_DEBUG,                                  \
+                        "option \"%s\" ignored\n",                     \
+                        stringify(tok));                               \
+               ret = 0;                                                \
+       }                                                               \
+       ret;                                                            \
+})
+
+#define add_int_or_minus_one_argument(o, argstr, tok, arg)             \
+({                                                                     \
+       int ret;                                                        \
+       if (nvmf_check_option(r, tok)) {                                \
+               ret = __add_int_or_minus_one_argument(argstr,           \
+                                                    stringify(tok),    \
+                                                    arg);              \
+       } else {                                                        \
+               nvme_msg(r, LOG_DEBUG,                                  \
+                        "option \"%s\" ignored\n",                     \
+                        stringify(tok));                               \
+               ret = 0;                                                \
+       }                                                               \
+       ret;                                                            \
+})
+
+#define add_argument(r, argstr, tok, arg)                              \
+({                                                                     \
+       int ret;                                                        \
+       if (nvmf_check_option(r, tok)) {                                \
+               ret = __add_argument(argstr,                            \
+                                    stringify(tok),                    \
+                                    arg);                              \
+       } else {                                                        \
+               nvme_msg(r, LOG_NOTICE,                                 \
+                        "option \"%s\" ignored\n",                     \
+                        stringify(tok));                               \
+               ret = 0;                                                \
+       }                                                               \
+       ret;                                                            \
+})
 #endif /* _LIBNVME_FABRICS_H */
index f2d7b5bebfc75e0dad8b6fcc667162907ef741db..8440c5ef27e3f407842839a709ddf8c7109483fe 100644 (file)
@@ -158,6 +158,7 @@ struct nvme_fabric_options {
        bool traddr;
        bool transport;
        bool trsvcid;
+       bool dns_traddr;
 };
 
 struct nvme_log {
index 27363f53e51c281966adafd9bde8a66c02066835..9806085e6f463b10aadc85ddd59313f3ebb266d7 100644 (file)
@@ -1244,7 +1244,8 @@ struct nvme_ctrl *nvme_create_ctrl(nvme_root_t r,
        if (traddr)
                c->traddr = strdup(traddr);
        if (host_traddr) {
-               if (traddr_is_hostname(transport, host_traddr))
+               if (traddr_is_hostname(transport, host_traddr) &&
+                   !nvmf_check_option(r, dns_traddr))
                        c->cfg.host_traddr = hostname2traddr(r, host_traddr);
                if (!c->cfg.host_traddr)
                        c->cfg.host_traddr = strdup(host_traddr);