diff --git a/include/spdk/nvmf_transport.h b/include/spdk/nvmf_transport.h index f29639ad8..6209287a3 100644 --- a/include/spdk/nvmf_transport.h +++ b/include/spdk/nvmf_transport.h @@ -334,6 +334,15 @@ struct spdk_nvmf_transport_ops { int (*qpair_get_listen_trid)(struct spdk_nvmf_qpair *qpair, struct spdk_nvme_transport_id *trid); + /* + * Abort the request which the abort request specifies. + * This function can complete synchronously or asynchronously, but + * is expected to call spdk_nvmf_request_complete() in the end + * for both cases. + */ + void (*qpair_abort_request)(struct spdk_nvmf_qpair *qpair, + struct spdk_nvmf_request *req); + /* * Get transport poll group statistics */ diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index 957c24cf5..d17b871fc 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -2103,10 +2103,7 @@ nvmf_qpair_abort_request(struct spdk_nvmf_qpair *qpair, struct spdk_nvmf_request return; } - /* TODO: track list of outstanding requests in qpair? */ - SPDK_DEBUGLOG(SPDK_LOG_NVMF, "cid %u not found\n", cid); - - spdk_nvmf_request_complete(req); + nvmf_transport_qpair_abort_request(qpair, req); } static void diff --git a/lib/nvmf/fc.c b/lib/nvmf/fc.c index a2bf87b52..678cfc681 100644 --- a/lib/nvmf/fc.c +++ b/lib/nvmf/fc.c @@ -2116,6 +2116,13 @@ nvmf_fc_qpair_get_listen_trid(struct spdk_nvmf_qpair *qpair, return 0; } +static void +nvmf_fc_qpair_abort_request(struct spdk_nvmf_qpair *qpair, + struct spdk_nvmf_request *req) +{ + spdk_nvmf_request_complete(req); +} + const struct spdk_nvmf_transport_ops spdk_nvmf_transport_fc = { .name = "FC", .type = (enum spdk_nvme_transport_type) SPDK_NVMF_TRTYPE_FC, @@ -2140,6 +2147,7 @@ const struct spdk_nvmf_transport_ops spdk_nvmf_transport_fc = { .qpair_get_peer_trid = nvmf_fc_qpair_get_peer_trid, .qpair_get_local_trid = nvmf_fc_qpair_get_local_trid, .qpair_get_listen_trid = nvmf_fc_qpair_get_listen_trid, + .qpair_abort_request = nvmf_fc_qpair_abort_request, }; /* diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index b9b3da756..601070d08 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -4026,6 +4026,13 @@ spdk_nvmf_rdma_init_hooks(struct spdk_nvme_rdma_hooks *hooks) g_nvmf_hooks = *hooks; } +static void +nvmf_rdma_qpair_abort_request(struct spdk_nvmf_qpair *qpair, + struct spdk_nvmf_request *req) +{ + spdk_nvmf_request_complete(req); +} + static int nvmf_rdma_poll_group_get_stat(struct spdk_nvmf_tgt *tgt, struct spdk_nvmf_transport_poll_group_stat **stat) @@ -4122,6 +4129,7 @@ const struct spdk_nvmf_transport_ops spdk_nvmf_transport_rdma = { .qpair_get_peer_trid = nvmf_rdma_qpair_get_peer_trid, .qpair_get_local_trid = nvmf_rdma_qpair_get_local_trid, .qpair_get_listen_trid = nvmf_rdma_qpair_get_listen_trid, + .qpair_abort_request = nvmf_rdma_qpair_abort_request, .poll_group_get_stat = nvmf_rdma_poll_group_get_stat, .poll_group_free_stat = nvmf_rdma_poll_group_free_stat, diff --git a/lib/nvmf/tcp.c b/lib/nvmf/tcp.c index 79b7cb650..fa897da64 100644 --- a/lib/nvmf/tcp.c +++ b/lib/nvmf/tcp.c @@ -2459,6 +2459,13 @@ nvmf_tcp_qpair_get_listen_trid(struct spdk_nvmf_qpair *qpair, return nvmf_tcp_qpair_get_trid(qpair, trid, 0); } +static void +nvmf_tcp_qpair_abort_request(struct spdk_nvmf_qpair *qpair, + struct spdk_nvmf_request *req) +{ + spdk_nvmf_request_complete(req); +} + #define SPDK_NVMF_TCP_DEFAULT_MAX_QUEUE_DEPTH 128 #define SPDK_NVMF_TCP_DEFAULT_AQ_DEPTH 128 #define SPDK_NVMF_TCP_DEFAULT_MAX_QPAIRS_PER_CTRLR 128 @@ -2514,6 +2521,7 @@ const struct spdk_nvmf_transport_ops spdk_nvmf_transport_tcp = { .qpair_get_local_trid = nvmf_tcp_qpair_get_local_trid, .qpair_get_peer_trid = nvmf_tcp_qpair_get_peer_trid, .qpair_get_listen_trid = nvmf_tcp_qpair_get_listen_trid, + .qpair_abort_request = nvmf_tcp_qpair_abort_request, }; SPDK_NVMF_TRANSPORT_REGISTER(tcp, &spdk_nvmf_transport_tcp); diff --git a/lib/nvmf/transport.c b/lib/nvmf/transport.c index 92a87717f..11bb152df 100644 --- a/lib/nvmf/transport.c +++ b/lib/nvmf/transport.c @@ -401,6 +401,13 @@ nvmf_transport_qpair_get_listen_trid(struct spdk_nvmf_qpair *qpair, return qpair->transport->ops->qpair_get_listen_trid(qpair, trid); } +void +nvmf_transport_qpair_abort_request(struct spdk_nvmf_qpair *qpair, + struct spdk_nvmf_request *req) +{ + qpair->transport->ops->qpair_abort_request(qpair, req); +} + bool spdk_nvmf_transport_opts_init(const char *transport_name, struct spdk_nvmf_transport_opts *opts) diff --git a/lib/nvmf/transport.h b/lib/nvmf/transport.h index 5bf6847a8..38b5d8db3 100644 --- a/lib/nvmf/transport.h +++ b/lib/nvmf/transport.h @@ -76,4 +76,7 @@ int nvmf_transport_qpair_get_local_trid(struct spdk_nvmf_qpair *qpair, int nvmf_transport_qpair_get_listen_trid(struct spdk_nvmf_qpair *qpair, struct spdk_nvme_transport_id *trid); +void nvmf_transport_qpair_abort_request(struct spdk_nvmf_qpair *qpair, + struct spdk_nvmf_request *req); + #endif /* SPDK_NVMF_TRANSPORT_H */ diff --git a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c index e6ddff9bd..5e7c2cba4 100644 --- a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c +++ b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c @@ -179,6 +179,9 @@ DEFINE_STUB(nvmf_bdev_ctrlr_get_dif_ctx, bool, struct spdk_dif_ctx *dif_ctx), true); +DEFINE_STUB_V(nvmf_transport_qpair_abort_request, + (struct spdk_nvmf_qpair *qpair, struct spdk_nvmf_request *req)); + int spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_cb cb_fn, void *ctx) { diff --git a/test/unit/lib/nvmf/rdma.c/rdma_ut.c b/test/unit/lib/nvmf/rdma.c/rdma_ut.c index b08d083cf..1545be548 100644 --- a/test/unit/lib/nvmf/rdma.c/rdma_ut.c +++ b/test/unit/lib/nvmf/rdma.c/rdma_ut.c @@ -77,6 +77,7 @@ DEFINE_STUB_V(_spdk_trace_record, (uint64_t tsc, uint16_t tpoint_id, uint16_t po DEFINE_STUB_V(spdk_nvmf_ctrlr_data_init, (struct spdk_nvmf_transport_opts *opts, struct spdk_nvmf_ctrlr_data *cdata)); DEFINE_STUB_V(spdk_nvmf_request_exec, (struct spdk_nvmf_request *req)); +DEFINE_STUB(spdk_nvmf_request_complete, int, (struct spdk_nvmf_request *req), 0); DEFINE_STUB(spdk_nvme_transport_id_compare, int, (const struct spdk_nvme_transport_id *trid1, const struct spdk_nvme_transport_id *trid2), 0); DEFINE_STUB_V(nvmf_ctrlr_abort_aer, (struct spdk_nvmf_ctrlr *ctrlr)); diff --git a/test/unit/lib/nvmf/tcp.c/tcp_ut.c b/test/unit/lib/nvmf/tcp.c/tcp_ut.c index 91a7e22f5..576d500bf 100644 --- a/test/unit/lib/nvmf/tcp.c/tcp_ut.c +++ b/test/unit/lib/nvmf/tcp.c/tcp_ut.c @@ -200,6 +200,9 @@ DEFINE_STUB_V(spdk_nvmf_transport_register, (const struct spdk_nvmf_transport_op DEFINE_STUB_V(spdk_nvmf_tgt_new_qpair, (struct spdk_nvmf_tgt *tgt, struct spdk_nvmf_qpair *qpair)); +DEFINE_STUB_V(nvmf_transport_qpair_abort_request, + (struct spdk_nvmf_qpair *qpair, struct spdk_nvmf_request *req)); + struct spdk_trace_histories *g_trace_histories; struct spdk_bdev {