Skip to content

Commit

Permalink
nvme: multipath: round-robin: fix single non-optimized path case
Browse files Browse the repository at this point in the history
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: 3f6e324 ("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>
  • Loading branch information
Martin Wilck authored and Jens Axboe committed Aug 21, 2020
1 parent f34448c commit 93eb038
Showing 1 changed file with 10 additions and 5 deletions.
15 changes: 10 additions & 5 deletions drivers/nvme/host/multipath.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 93eb038

Please sign in to comment.