diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index 7d619cdfe..c502b8045 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -1628,6 +1628,8 @@ void nvme_rdma_ctrlr_disconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair) { struct nvme_rdma_qpair *rqpair = nvme_rdma_qpair(qpair); + struct nvme_rdma_ctrlr *rctrlr; + struct nvme_rdma_cm_event_entry *entry, *tmp; nvme_qpair_set_state(qpair, NVME_QPAIR_DISABLED); nvme_rdma_unregister_mem(rqpair); @@ -1639,6 +1641,21 @@ nvme_rdma_ctrlr_disconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme rqpair->evt = NULL; } + /* + * This works because we have the controller lock both in + * this function and in the function where we add new events. + */ + if (qpair->ctrlr != NULL) { + rctrlr = nvme_rdma_ctrlr(qpair->ctrlr); + STAILQ_FOREACH_SAFE(entry, &rctrlr->pending_cm_events, link, tmp) { + if (nvme_rdma_qpair(entry->evt->id->context) == rqpair) { + STAILQ_REMOVE(&rctrlr->pending_cm_events, entry, nvme_rdma_cm_event_entry, link); + rdma_ack_cm_event(entry->evt); + STAILQ_INSERT_HEAD(&rctrlr->free_cm_events, entry, link); + } + } + } + if (rqpair->cm_id) { if (rqpair->cm_id->qp) { rdma_destroy_qp(rqpair->cm_id);