Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F177518320
D61467.1794610282.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
8 KB
Referenced Files
None
Subscribers
None
D61467.1794610282.diff
View Options
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
Details
Attached
Mime Type
text/plain
Expires
Fri, Nov 13, 10:51 PM (9 h, 35 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41703277
Default Alt Text
D61467.1794610282.diff (8 KB)
Attached To
Mode
D61467: libnvmf: Change qpairs to own underlying transport connections
Attached
Detach File
Event Timeline