Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[linux-2.6-microblaze.git] / drivers / nvme / host / multipath.c
index 499acf0..a9a9276 100644 (file)
@@ -123,14 +123,20 @@ void nvme_mpath_clear_current_path(struct nvme_ns *ns)
        }
 }
 
+static bool nvme_path_is_disabled(struct nvme_ns *ns)
+{
+       return ns->ctrl->state != NVME_CTRL_LIVE ||
+               test_bit(NVME_NS_ANA_PENDING, &ns->flags) ||
+               test_bit(NVME_NS_REMOVING, &ns->flags);
+}
+
 static struct nvme_ns *__nvme_find_path(struct nvme_ns_head *head, int node)
 {
        int found_distance = INT_MAX, fallback_distance = INT_MAX, distance;
        struct nvme_ns *found = NULL, *fallback = NULL, *ns;
 
        list_for_each_entry_rcu(ns, &head->list, siblings) {
-               if (ns->ctrl->state != NVME_CTRL_LIVE ||
-                   test_bit(NVME_NS_ANA_PENDING, &ns->flags))
+               if (nvme_path_is_disabled(ns))
                        continue;
 
                if (READ_ONCE(head->subsys->iopolicy) == NVME_IOPOLICY_NUMA)
@@ -178,14 +184,16 @@ static struct nvme_ns *nvme_round_robin_path(struct nvme_ns_head *head,
 {
        struct nvme_ns *ns, *found, *fallback = NULL;
 
-       if (list_is_singular(&head->list))
+       if (list_is_singular(&head->list)) {
+               if (nvme_path_is_disabled(old))
+                       return NULL;
                return old;
+       }
 
        for (ns = nvme_next_ns(head, old);
             ns != old;
             ns = nvme_next_ns(head, ns)) {
-               if (ns->ctrl->state != NVME_CTRL_LIVE ||
-                   test_bit(NVME_NS_ANA_PENDING, &ns->flags))
+               if (nvme_path_is_disabled(ns))
                        continue;
 
                if (ns->ana_state == NVME_ANA_OPTIMIZED) {