nvme-multipath: do not fall back to __nvme_find_path() for non-optimized paths
authorHannes Reinecke <hare@suse.de>
Mon, 27 Jul 2020 16:08:03 +0000 (18:08 +0200)
committerChristoph Hellwig <hch@lst.de>
Wed, 29 Jul 2020 05:45:22 +0000 (07:45 +0200)
When nvme_round_robin_path() finds a valid namespace we should be using it;
falling back to __nvme_find_path() for non-optimized paths will cause the
result from nvme_round_robin_path() to be ignored for non-optimized paths.

Fixes: 75c10e732724 ("nvme-multipath: round-robin I/O policy")
Signed-off-by: Martin Wilck <mwilck@suse.com>
Signed-off-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/multipath.c

index 93c70e1..3ded54d 100644 (file)
@@ -281,10 +281,13 @@ inline struct nvme_ns *nvme_find_path(struct nvme_ns_head *head)
        struct nvme_ns *ns;
 
        ns = srcu_dereference(head->current_path[node], &head->srcu);
-       if (READ_ONCE(head->subsys->iopolicy) == NVME_IOPOLICY_RR && ns)
-               ns = nvme_round_robin_path(head, node, ns);
-       if (unlikely(!ns || !nvme_path_is_optimized(ns)))
-               ns = __nvme_find_path(head, node);
+       if (unlikely(!ns))
+               return __nvme_find_path(head, node);
+
+       if (READ_ONCE(head->subsys->iopolicy) == NVME_IOPOLICY_RR)
+               return nvme_round_robin_path(head, node, ns);
+       if (unlikely(!nvme_path_is_optimized(ns)))
+               return __nvme_find_path(head, node);
        return ns;
 }