Page MenuHomeFreeBSD

D61467.1794624327.diff
No OneTemporary

Authored By
Unknown
Size
8 KB
Referenced Files
None
Subscribers
None

D61467.1794624327.diff

diff --git a/lib/libnvmf/internal.h b/lib/libnvmf/internal.h
--- a/lib/libnvmf/internal.h
+++ b/lib/libnvmf/internal.h
@@ -22,7 +22,9 @@
/* Queue pair management. */
struct nvmf_qpair *(*allocate_qpair)(struct nvmf_association *na,
const struct nvmf_qpair_params *params);
+ void (*close_qpair)(struct nvmf_qpair *qp);
void (*free_qpair)(struct nvmf_qpair *qp);
+ void (*close_transport)(const struct nvmf_qpair_params *params);
/* Add params for kernel handoff. */
void (*kernel_handoff_params)(struct nvmf_qpair *qp, nvlist_t *nvl);
@@ -112,6 +114,8 @@
void na_clear_error(struct nvmf_association *na);
void na_error(struct nvmf_association *na, const char *fmt, ...);
+void nvmf_close_transport(struct nvmf_association *na,
+ const struct nvmf_qpair_params *params);
int nvmf_kernel_handoff_params(struct nvmf_qpair *qp, nvlist_t **nvlp);
int nvmf_populate_dle(struct nvmf_qpair *qp,
struct nvme_discovery_log_entry *dle);
diff --git a/lib/libnvmf/libnvmf.h b/lib/libnvmf/libnvmf.h
--- a/lib/libnvmf/libnvmf.h
+++ b/lib/libnvmf/libnvmf.h
@@ -80,15 +80,21 @@
* A queue pair represents either an Admin or I/O
* submission/completion queue pair.
*
- * Each open qpair holds a reference on its association. Once queue
- * pairs are allocated, callers can safely free the association to
- * ease bookkeeping.
+ * Each qpair holds a reference on its association. Once queue pairs
+ * are allocated, callers can safely free the association to ease
+ * bookkeeping.
*
* If nvmf_allocate_qpair fails, a detailed error message can be obtained
* from nvmf_association_error.
+ *
+ * nvmf_close_qpair closes the underlying transport (e.g. socket for
+ * TCP queue pairs).
+ *
+ * nvmf_free_qpair also closes the underlying transport.
*/
struct nvmf_qpair *nvmf_allocate_qpair(struct nvmf_association *na,
const struct nvmf_qpair_params *params);
+void nvmf_close_qpair(struct nvmf_qpair *qp);
void nvmf_free_qpair(struct nvmf_qpair *qp);
/*
@@ -201,6 +207,9 @@
* nvmf_association_error. On success, the command capsule is saved
* in '*ccp' and the connect data is saved in 'data'. The caller
* must send an explicit response and free the the command capsule.
+ *
+ * The underlying transport in '*params' (e.g. socket for TCP queue
+ * pairs) will be closed if this fails.
*/
struct nvmf_qpair *nvmf_accept(struct nvmf_association *na,
const struct nvmf_qpair_params *params, struct nvmf_capsule **ccp,
@@ -265,6 +274,9 @@
/*
* Connect to an admin or I/O queue. If this fails, a detailed error
* message can be obtained from nvmf_association_error.
+ *
+ * The underlying transport in '*params' (e.g. socket for TCP queue
+ * pairs) will be closed if this fails.
*/
struct nvmf_qpair *nvmf_connect(struct nvmf_association *na,
const struct nvmf_qpair_params *params, uint16_t qid, u_int queue_size,
diff --git a/lib/libnvmf/nvmf_controller.c b/lib/libnvmf/nvmf_controller.c
--- a/lib/libnvmf/nvmf_controller.c
+++ b/lib/libnvmf/nvmf_controller.c
@@ -379,6 +379,8 @@
nvmf_free_capsule(cc);
if (qp != NULL)
nvmf_free_qpair(qp);
+ else
+ nvmf_close_transport(na, params);
return (NULL);
}
diff --git a/lib/libnvmf/nvmf_host.c b/lib/libnvmf/nvmf_host.c
--- a/lib/libnvmf/nvmf_host.c
+++ b/lib/libnvmf/nvmf_host.c
@@ -186,6 +186,8 @@
nvmf_free_capsule(cc);
if (qp != NULL)
nvmf_free_qpair(qp);
+ else
+ nvmf_close_transport(na, params);
return (NULL);
}
diff --git a/lib/libnvmf/nvmf_tcp.c b/lib/libnvmf/nvmf_tcp.c
--- a/lib/libnvmf/nvmf_tcp.c
+++ b/lib/libnvmf/nvmf_tcp.c
@@ -190,6 +190,17 @@
}
}
+static void
+tcp_close_qpair(struct nvmf_qpair *nq)
+{
+ struct nvmf_tcp_qpair *qp = TQP(nq);
+
+ if (qp->s != -1) {
+ close(qp->s);
+ qp->s = -1;
+ }
+}
+
static void
nvmf_tcp_report_error(struct nvmf_association *na, struct nvmf_tcp_qpair *qp,
uint16_t fes, uint32_t fei, const void *rx_pdu, size_t pdu_len, u_int hlen)
@@ -217,8 +228,7 @@
iov[1].iov_len = hlen;
(void)nvmf_tcp_write_pdu_iov(qp, iov, nitems(iov), sizeof(hdr) + hlen);
- close(qp->s);
- qp->s = -1;
+ tcp_close_qpair(&qp->qp);
}
static int
@@ -244,8 +254,7 @@
qp->data_digests, qp->rxpda, &data_len, &fes, &fei);
if (error != 0) {
if (error == ECONNRESET) {
- close(qp->s);
- qp->s = -1;
+ tcp_close_qpair(&qp->qp);
} else {
nvmf_tcp_report_error(qp->qp.nq_association, qp,
fes, fei, ch, pdu_len, hlen);
@@ -1091,6 +1100,7 @@
if (aparams->tcp.pda > NVME_TCP_CPDA_MAX) {
na_error(na, "Invalid PDA");
+ close(qparams->tcp.fd);
return (NULL);
}
@@ -1104,6 +1114,7 @@
else
error = tcp_connect(qp, na, qparams->admin);
if (error != 0) {
+ close(qparams->tcp.fd);
free(qp);
return (NULL);
}
@@ -1128,9 +1139,16 @@
LIST_FOREACH_SAFE(cb, &qp->tx_buffers, link, ncb) {
tcp_free_command_buffer(cb);
}
+ tcp_close_qpair(nq);
free(qp);
}
+static void
+tcp_close_transport(const struct nvmf_qpair_params *qparams)
+{
+ close(qparams->tcp.fd);
+}
+
static void
tcp_kernel_handoff_params(struct nvmf_qpair *nq, nvlist_t *nvl)
{
@@ -1487,7 +1505,9 @@
.update_association = tcp_update_association,
.free_association = tcp_free_association,
.allocate_qpair = tcp_allocate_qpair,
+ .close_qpair = tcp_close_qpair,
.free_qpair = tcp_free_qpair,
+ .close_transport = tcp_close_transport,
.kernel_handoff_params = tcp_kernel_handoff_params,
.populate_dle = tcp_populate_dle,
.allocate_capsule = tcp_allocate_capsule,
diff --git a/lib/libnvmf/nvmf_transport.c b/lib/libnvmf/nvmf_transport.c
--- a/lib/libnvmf/nvmf_transport.c
+++ b/lib/libnvmf/nvmf_transport.c
@@ -106,6 +106,12 @@
return (qp);
}
+void
+nvmf_close_qpair(struct nvmf_qpair *qp)
+{
+ qp->nq_association->na_ops->close_qpair(qp);
+}
+
void
nvmf_free_qpair(struct nvmf_qpair *qp)
{
@@ -121,6 +127,13 @@
nvmf_free_association(na);
}
+void
+nvmf_close_transport(struct nvmf_association *na,
+ const struct nvmf_qpair_params *params)
+{
+ na->na_ops->close_transport(params);
+}
+
struct nvmf_capsule *
nvmf_allocate_command(struct nvmf_qpair *qp, const void *sqe)
{
diff --git a/tools/tools/nvmf/nvmfd/discovery.c b/tools/tools/nvmf/nvmfd/discovery.c
--- a/tools/tools/nvmf/nvmfd/discovery.c
+++ b/tools/tools/nvmf/nvmfd/discovery.c
@@ -272,7 +272,6 @@
nvmf_free_qpair(dta->qp);
- close(dta->s);
free(dta);
return (NULL);
}
@@ -338,5 +337,4 @@
nvmf_free_capsule(nc);
if (qp != NULL)
nvmf_free_qpair(qp);
- close(s);
}
diff --git a/tools/tools/nvmf/nvmfd/io.c b/tools/tools/nvmf/nvmfd/io.c
--- a/tools/tools/nvmf/nvmfd/io.c
+++ b/tools/tools/nvmf/nvmfd/io.c
@@ -23,7 +23,6 @@
u_int num_io_queues;
u_int active_io_queues;
struct nvmf_qpair **io_qpairs;
- int *io_sockets;
struct nvme_firmware_page fp;
struct nvme_health_information_page hip;
@@ -219,7 +218,6 @@
pthread_mutex_lock(&io_na_mutex);
ioc->num_io_queues = num_queues;
ioc->io_qpairs = calloc(num_queues, sizeof(*ioc->io_qpairs));
- ioc->io_sockets = calloc(num_queues, sizeof(*ioc->io_sockets));
pthread_mutex_unlock(&io_na_mutex);
nvmf_init_cqe(&cqe, nc, 0);
@@ -285,10 +283,9 @@
pthread_mutex_lock(&io_na_mutex);
for (u_int i = 0; i < ioc->num_io_queues; i++) {
- if (ioc->io_qpairs[i] == NULL || ioc->io_sockets[i] == -1)
+ if (ioc->io_qpairs[i] == NULL)
continue;
- close(ioc->io_sockets[i]);
- ioc->io_sockets[i] = -1;
+ nvmf_close_qpair(ioc->io_qpairs[i]);
}
/* Wait for I/O threads to notice. */
@@ -461,10 +458,6 @@
pthread_mutex_lock(&io_na_mutex);
if (disconnect)
ioc->io_qpairs[qid - 1] = NULL;
- if (ioc->io_sockets[qid - 1] != -1) {
- close(ioc->io_sockets[qid - 1]);
- ioc->io_sockets[qid - 1] = -1;
- }
ioc->active_io_queues--;
if (ioc->active_io_queues == 0)
pthread_cond_broadcast(&io_cond);
@@ -516,12 +509,10 @@
nvmf_free_capsule(nc);
handle_admin_qpair(ioc);
- close(s);
return;
error:
nvmf_free_capsule(nc);
- close(s);
}
static void
@@ -593,7 +584,6 @@
ioc = io_controller;
ioc->active_io_queues++;
ioc->io_qpairs[qid - 1] = qp;
- ioc->io_sockets[qid - 1] = s;
pthread_mutex_unlock(&io_na_mutex);
nvmf_free_capsule(nc);
@@ -603,7 +593,6 @@
error:
nvmf_free_capsule(nc);
- close(s);
}
static void *
@@ -657,7 +646,6 @@
nvmf_free_capsule(nc);
if (qp != NULL)
nvmf_free_qpair(qp);
- close(s);
return (NULL);
}
diff --git a/usr.sbin/ctld/nvmf.cc b/usr.sbin/ctld/nvmf.cc
--- a/usr.sbin/ctld/nvmf.cc
+++ b/usr.sbin/ctld/nvmf.cc
@@ -429,7 +429,7 @@
{
struct nvmf_qpair_params qparams;
memset(&qparams, 0, sizeof(qparams));
- qparams.tcp.fd = fd;
+ qparams.tcp.fd = fd.release();
struct nvmf_capsule *nc = NULL;
struct nvmf_fabric_connect_data data;
diff --git a/usr.sbin/ctld/nvmf_discovery.cc b/usr.sbin/ctld/nvmf_discovery.cc
--- a/usr.sbin/ctld/nvmf_discovery.cc
+++ b/usr.sbin/ctld/nvmf_discovery.cc
@@ -481,7 +481,7 @@
{
struct nvmf_qpair_params qparams;
memset(&qparams, 0, sizeof(qparams));
- qparams.tcp.fd = fd;
+ qparams.tcp.fd = fd.release();
struct nvmf_capsule *nc = NULL;
struct nvmf_fabric_connect_data data;

File Metadata

Mime Type
text/plain
Expires
Sat, Nov 14, 2:45 AM (3 h, 3 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41703277
Default Alt Text
D61467.1794624327.diff (8 KB)

Event Timeline