Merge tag 'for-linus-20190125' of git://git.kernel.dk/linux-block
[platform/kernel/linux-starfive.git] / drivers / nvme / host / multipath.c
index 9901afd..b9fff3b 100644 (file)
@@ -141,7 +141,7 @@ static struct nvme_ns *__nvme_find_path(struct nvme_ns_head *head, int node)
                    test_bit(NVME_NS_ANA_PENDING, &ns->flags))
                        continue;
 
-               distance = node_distance(node, dev_to_node(ns->ctrl->dev));
+               distance = node_distance(node, ns->ctrl->numa_node);
 
                switch (ns->ana_state) {
                case NVME_ANA_OPTIMIZED:
@@ -220,21 +220,6 @@ static blk_qc_t nvme_ns_head_make_request(struct request_queue *q,
        return ret;
 }
 
-static bool nvme_ns_head_poll(struct request_queue *q, blk_qc_t qc)
-{
-       struct nvme_ns_head *head = q->queuedata;
-       struct nvme_ns *ns;
-       bool found = false;
-       int srcu_idx;
-
-       srcu_idx = srcu_read_lock(&head->srcu);
-       ns = srcu_dereference(head->current_path[numa_node_id()], &head->srcu);
-       if (likely(ns && nvme_path_is_optimized(ns)))
-               found = ns->queue->poll_fn(q, qc);
-       srcu_read_unlock(&head->srcu, srcu_idx);
-       return found;
-}
-
 static void nvme_requeue_work(struct work_struct *work)
 {
        struct nvme_ns_head *head =
@@ -276,12 +261,11 @@ int nvme_mpath_alloc_disk(struct nvme_ctrl *ctrl, struct nvme_ns_head *head)
        if (!(ctrl->subsys->cmic & (1 << 1)) || !multipath)
                return 0;
 
-       q = blk_alloc_queue_node(GFP_KERNEL, NUMA_NO_NODE, NULL);
+       q = blk_alloc_queue_node(GFP_KERNEL, ctrl->numa_node);
        if (!q)
                goto out;
        q->queuedata = head;
        blk_queue_make_request(q, nvme_ns_head_make_request);
-       q->poll_fn = nvme_ns_head_poll;
        blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
        /* set to a default value for 512 until disk is validated */
        blk_queue_logical_block_size(q, 512);
@@ -561,8 +545,7 @@ int nvme_mpath_init(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
        timer_setup(&ctrl->anatt_timer, nvme_anatt_timeout, 0);
        ctrl->ana_log_size = sizeof(struct nvme_ana_rsp_hdr) +
                ctrl->nanagrpid * sizeof(struct nvme_ana_group_desc);
-       if (!(ctrl->anacap & (1 << 6)))
-               ctrl->ana_log_size += ctrl->max_namespaces * sizeof(__le32);
+       ctrl->ana_log_size += ctrl->max_namespaces * sizeof(__le32);
 
        if (ctrl->ana_log_size > ctrl->max_hw_sectors << SECTOR_SHIFT) {
                dev_err(ctrl->device,
@@ -586,6 +569,7 @@ int nvme_mpath_init(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
        return 0;
 out_free_ana_log_buf:
        kfree(ctrl->ana_log_buf);
+       ctrl->ana_log_buf = NULL;
 out:
        return error;
 }
@@ -593,5 +577,6 @@ out:
 void nvme_mpath_uninit(struct nvme_ctrl *ctrl)
 {
        kfree(ctrl->ana_log_buf);
+       ctrl->ana_log_buf = NULL;
 }