Commit 93eb0381 authored by Martin Wilck's avatar Martin Wilck Committed by Jens Axboe

nvme: multipath: round-robin: fix single non-optimized path case

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: 3f6e3246 ("nvme-multipath: fix logic for non-optimized paths")
Signed-off-by: default avatarMartin Wilck <mwilck@suse.com>
Signed-off-by: default avatarMartin George <marting@netapp.com>
Reviewed-by: default avatarKeith Busch <kbusch@kernel.org>
Signed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent f34448cd
...@@ -255,12 +255,17 @@ static struct nvme_ns *nvme_round_robin_path(struct nvme_ns_head *head, ...@@ -255,12 +255,17 @@ static struct nvme_ns *nvme_round_robin_path(struct nvme_ns_head *head,
fallback = ns; 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) && if (!nvme_path_is_disabled(old) &&
old->ana_state == NVME_ANA_OPTIMIZED) { (old->ana_state == NVME_ANA_OPTIMIZED ||
found = old; (!fallback && old->ana_state == NVME_ANA_NONOPTIMIZED)))
goto out; return old;
}
if (!fallback) if (!fallback)
return NULL; return NULL;
found = fallback; found = fallback;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment