nvme-fabrics: move controller options matching to fabrics
authorSagi Grimberg <sagi@grimberg.me>
Fri, 19 Oct 2018 00:40:40 +0000 (17:40 -0700)
committerChristoph Hellwig <hch@lst.de>
Fri, 19 Oct 2018 12:22:24 +0000 (14:22 +0200)
IP transports will most likely use the same controller options
matching when detecting a duplicate connect. Move it to
fabrics.

Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/fabrics.c
drivers/nvme/host/fabrics.h
drivers/nvme/host/rdma.c

index bcd09d3..bd0969d 100644 (file)
@@ -868,6 +868,36 @@ static int nvmf_check_required_opts(struct nvmf_ctrl_options *opts,
        return 0;
 }
 
+bool nvmf_ip_options_match(struct nvme_ctrl *ctrl,
+               struct nvmf_ctrl_options *opts)
+{
+       if (!nvmf_ctlr_matches_baseopts(ctrl, opts) ||
+           strcmp(opts->traddr, ctrl->opts->traddr) ||
+           strcmp(opts->trsvcid, ctrl->opts->trsvcid))
+               return false;
+
+       /*
+        * Checking the local address is rough. In most cases, none is specified
+        * and the host port is selected by the stack.
+        *
+        * Assume no match if:
+        * -  local address is specified and address is not the same
+        * -  local address is not specified but remote is, or vice versa
+        *    (admin using specific host_traddr when it matters).
+        */
+       if ((opts->mask & NVMF_OPT_HOST_TRADDR) &&
+           (ctrl->opts->mask & NVMF_OPT_HOST_TRADDR)) {
+               if (strcmp(opts->host_traddr, ctrl->opts->host_traddr))
+                       return false;
+       } else if ((opts->mask & NVMF_OPT_HOST_TRADDR) ||
+                  (ctrl->opts->mask & NVMF_OPT_HOST_TRADDR)) {
+               return false;
+       }
+
+       return true;
+}
+EXPORT_SYMBOL_GPL(nvmf_ip_options_match);
+
 static int nvmf_check_allowed_opts(struct nvmf_ctrl_options *opts,
                unsigned int allowed_opts)
 {
index aa2fdb2..6ea6275 100644 (file)
@@ -166,6 +166,8 @@ blk_status_t nvmf_fail_nonready_command(struct nvme_ctrl *ctrl,
                struct request *rq);
 bool __nvmf_check_ready(struct nvme_ctrl *ctrl, struct request *rq,
                bool queue_live);
+bool nvmf_ip_options_match(struct nvme_ctrl *ctrl,
+               struct nvmf_ctrl_options *opts);
 
 static inline bool nvmf_check_ready(struct nvme_ctrl *ctrl, struct request *rq,
                bool queue_live)
index 03fff72..d181caf 100644 (file)
@@ -1856,39 +1856,6 @@ static const struct nvme_ctrl_ops nvme_rdma_ctrl_ops = {
        .stop_ctrl              = nvme_rdma_stop_ctrl,
 };
 
-static inline bool
-__nvme_rdma_options_match(struct nvme_rdma_ctrl *ctrl,
-       struct nvmf_ctrl_options *opts)
-{
-       if (!nvmf_ctlr_matches_baseopts(&ctrl->ctrl, opts) ||
-           strcmp(opts->traddr, ctrl->ctrl.opts->traddr) ||
-           strcmp(opts->trsvcid, ctrl->ctrl.opts->trsvcid))
-               return false;
-
-       /*
-        * checking the local address is rough. In most cases, one
-        * is not specified and the host port is selected by the stack.
-        *
-        * Assume no match if:
-        *  local address is specified and address is not the same
-        *  local address is not specified but remote is, or vice versa
-        *    (admin using specific host_traddr when it matters).
-        */
-       if (opts->mask & NVMF_OPT_HOST_TRADDR &&
-           ctrl->ctrl.opts->mask & NVMF_OPT_HOST_TRADDR) {
-               if (strcmp(opts->host_traddr, ctrl->ctrl.opts->host_traddr))
-                       return false;
-       } else if (opts->mask & NVMF_OPT_HOST_TRADDR ||
-                  ctrl->ctrl.opts->mask & NVMF_OPT_HOST_TRADDR)
-               return false;
-       /*
-        * if neither controller had an host port specified, assume it's
-        * a match as everything else matched.
-        */
-
-       return true;
-}
-
 /*
  * Fails a connection request if it matches an existing controller
  * (association) with the same tuple:
@@ -1909,7 +1876,7 @@ nvme_rdma_existing_controller(struct nvmf_ctrl_options *opts)
 
        mutex_lock(&nvme_rdma_ctrl_mutex);
        list_for_each_entry(ctrl, &nvme_rdma_ctrl_list, list) {
-               found = __nvme_rdma_options_match(ctrl, opts);
+               found = nvmf_ip_options_match(&ctrl->ctrl, opts);
                if (found)
                        break;
        }