diff --git a/include/spdk/nvmf_spec.h b/include/spdk/nvmf_spec.h index f720c1a70..b4f9e8fd0 100644 --- a/include/spdk/nvmf_spec.h +++ b/include/spdk/nvmf_spec.h @@ -425,7 +425,8 @@ struct spdk_nvmf_rdma_request_private_data { uint16_t qid; /* queue id */ uint16_t hrqsize; /* host receive queue size */ uint16_t hsqsize; /* host send queue size */ - uint8_t reserved[24]; + uint16_t cntlid; /* controller id */ + uint8_t reserved[22]; }; SPDK_STATIC_ASSERT(sizeof(struct spdk_nvmf_rdma_request_private_data) == 32, "Incorrect size"); @@ -458,6 +459,7 @@ enum spdk_nvmf_rdma_transport_errors { SPDK_NVMF_RDMA_ERROR_NO_RESOURCES = 0x6, SPDK_NVMF_RDMA_ERROR_INVALID_IRD = 0x7, SPDK_NVMF_RDMA_ERROR_INVALID_ORD = 0x8, + SPDK_NVMF_RDMA_ERROR_INVALID_CNTLID = 0x9, }; #pragma pack(pop) diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index 5ec6a9643..f9cc27f54 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -582,6 +582,8 @@ nvme_rdma_connect(struct nvme_rdma_qpair *rqpair) struct ibv_device_attr attr; int ret; struct rdma_cm_event *event; + struct spdk_nvme_ctrlr *ctrlr; + struct nvme_rdma_ctrlr *rctrlr; ret = ibv_query_device(rqpair->cm_id->verbs, &attr); if (ret != 0) { @@ -591,9 +593,17 @@ nvme_rdma_connect(struct nvme_rdma_qpair *rqpair) param.responder_resources = nvme_min(rqpair->num_entries, attr.max_qp_rd_atom); + ctrlr = rqpair->qpair.ctrlr; + if (!ctrlr) { + return -1; + } + + rctrlr = nvme_rdma_ctrlr(ctrlr); + request_data.qid = rqpair->qpair.id; request_data.hrqsize = rqpair->num_entries; request_data.hsqsize = rqpair->num_entries - 1; + request_data.cntlid = rctrlr->cntlid; param.private_data = &request_data; param.private_data_len = sizeof(request_data);