[PATCH rfc 5/6] nvme-rdma: re-resolve traddr upon reconnect in case it is a dns name
Sagi Grimberg
sagi at grimberg.me
Mon Jul 24 02:20:21 PDT 2023
In case traddr is a dns name, it may describe a different address
during the controller lifetime. The classic example would be
a discovery-service dns name that may be load-balanced via dns over
multiple addresses.
So try to re-resolve the controller address. There is no dns query
in case the traddr provided is an ip address.
Signed-off-by: Sagi Grimberg <sagi at grimberg.me>
---
drivers/nvme/host/rdma.c | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
index 797bd192a413..2a4109bbd4a2 100644
--- a/drivers/nvme/host/rdma.c
+++ b/drivers/nvme/host/rdma.c
@@ -777,9 +777,22 @@ static void nvme_rdma_destroy_admin_queue(struct nvme_rdma_ctrl *ctrl)
static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl,
bool new)
{
+ struct nvmf_ctrl_options *opts = ctrl->ctrl.opts;
bool pi_capable = false;
int error;
+ /*
+ * it is possible that the controller traddr may be a dns name which
+ * may have changed its ip address since it was last resolved in prior
+ * connect. Try to re-resolve the address in this case.
+ */
+ error = nvmf_resolve_ip_address(opts, &ctrl->addr);
+ if (error) {
+ dev_warn(ctrl->ctrl.device, "unable to resolve address: %s:%s\n",
+ opts->traddr, opts->trsvcid);
+ return error;
+ }
+
error = nvme_rdma_alloc_queue(ctrl, 0, NVME_AQ_DEPTH);
if (error)
return error;
@@ -2230,13 +2243,6 @@ static struct nvme_ctrl *nvme_rdma_create_ctrl(struct device *dev,
opts->mask |= NVMF_OPT_TRSVCID;
}
- ret = nvmf_resolve_ip_address(opts, &ctrl->addr);
- if (ret) {
- pr_err("malformed address passed: %s:%s\n",
- opts->traddr, opts->trsvcid);
- goto out_free_ctrl;
- }
-
if (opts->mask & NVMF_OPT_HOST_TRADDR) {
ret = inet_pton_with_scope(&init_net, AF_UNSPEC,
opts->host_traddr, NULL, &ctrl->src_addr);
--
2.41.0
More information about the Linux-nvme
mailing list