| From 7e00a655caccd82c8f414bf8a10577bb44b06899 Mon Sep 17 00:00:00 2001 |
| From: Hannes Reinecke <hare@suse.de> |
| Date: Mon, 27 Jul 2020 18:08:03 +0200 |
| Subject: [PATCH] nvme-multipath: do not fall back to __nvme_find_path() for |
| non-optimized paths |
| |
| commit fbd6a42d8932e172921c7de10468a2e12c34846b upstream. |
| |
| 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> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c |
| index 4f2327499e3f..be4117f35962 100644 |
| --- a/drivers/nvme/host/multipath.c |
| +++ b/drivers/nvme/host/multipath.c |
| @@ -270,10 +270,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; |
| } |
| |
| -- |
| 2.27.0 |
| |