]> git.baikalelectronics.ru Git - kernel.git/commitdiff
nvme: multipath: round-robin: fix single non-optimized path case
authorMartin Wilck <mwilck@suse.com>
Thu, 6 Aug 2020 13:19:31 +0000 (15:19 +0200)
committerJens Axboe <axboe@kernel.dk>
Fri, 21 Aug 2020 23:14:27 +0000 (17:14 -0600)
If there's only one usable, non-optimized path, nvme_round_robin_path()
returns NULL, which is wrong. Fix it by falling back to "old", like in
the single optimized path case. Also, if the active path isn't changed,
there's no need to re-assign the pointer.

Fixes: 2122187ed47d ("nvme-multipath: fix logic for non-optimized paths")
Signed-off-by: Martin Wilck <mwilck@suse.com>
Signed-off-by: Martin George <marting@netapp.com>
Reviewed-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/nvme/host/multipath.c

index 3ded54d2c9c6ad41063d74ecb0ba6559d0e61c01..a64dfff0d0ceb8813abde366a3ac55cd91399292 100644 (file)
@@ -255,12 +255,17 @@ static struct nvme_ns *nvme_round_robin_path(struct nvme_ns_head *head,
                        fallback = ns;
        }
 
-       /* No optimized path found, re-check the current path */
+       /*
+        * The loop above skips the current path for round-robin semantics.
+        * Fall back to the current path if either:
+        *  - no other optimized path found and current is optimized,
+        *  - no other usable path found and current is usable.
+        */
        if (!nvme_path_is_disabled(old) &&
-           old->ana_state == NVME_ANA_OPTIMIZED) {
-               found = old;
-               goto out;
-       }
+           (old->ana_state == NVME_ANA_OPTIMIZED ||
+            (!fallback && old->ana_state == NVME_ANA_NONOPTIMIZED)))
+               return old;
+
        if (!fallback)
                return NULL;
        found = fallback;