Skip to content

Commit ca601a1

Browse files
committed
fabrics: use context at controller creation time
The controller is created from the provided fabrics context, which contains all the information required to fully construct it. The libnvmf_add_ctrl function should only perform the connect call. Signed-off-by: Daniel Wagner <[email protected]>
1 parent 8632854 commit ca601a1

8 files changed

Lines changed: 75 additions & 82 deletions

File tree

libnvme/examples/discover-loop.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ int main()
6767
if (ret)
6868
goto free_ctx;
6969

70+
ret = libnvmf_context_set_connection(fctx, NVME_DISC_SUBSYS_NAME,
71+
"loop", NULL, NULL, NULL, NULL);
72+
if (ret)
73+
goto free_ctx;
74+
7075
ret = libnvme_scan_topology(ctx, NULL, NULL);
7176
if (ret)
7277
goto free_fctx;
@@ -77,14 +82,13 @@ int main()
7782
goto free_fctx;
7883
}
7984

80-
ret = libnvmf_create_ctrl(ctx, NVME_DISC_SUBSYS_NAME, "loop",
81-
NULL, NULL, NULL, NULL, &c);
85+
ret = libnvmf_create_ctrl(ctx, fctx, &c);
8286
if (ret) {
8387
fprintf(stderr, "Failed to allocate memory\n");
8488
goto free_fctx;
8589
}
8690

87-
ret = libnvmf_add_ctrl(h, c, fctx);
91+
ret = libnvmf_add_ctrl(h, c);
8892
if (ret) {
8993
fprintf(stderr, "no controller found\n");
9094
goto free_fctx;

libnvme/libnvme/nvme.i

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -737,15 +737,9 @@ struct libnvmf_context {};
737737
self.__host = h # Keep a reference to parent to ensure ctrl obj gets GCed before host}
738738
%extend libnvme_ctrl {
739739
libnvme_ctrl(struct libnvme_global_ctx *ctx,
740-
const char *subsysnqn,
741-
const char *transport,
742-
const char *traddr = NULL,
743-
const char *host_traddr = NULL,
744-
const char *host_iface = NULL,
745-
const char *trsvcid = NULL) {
740+
struct libnvmf_context *fctx) {
746741
struct libnvme_ctrl *c;
747-
if (libnvmf_create_ctrl(ctx, subsysnqn, transport, traddr,
748-
host_traddr, host_iface, trsvcid, &c))
742+
if (libnvmf_create_ctrl(ctx, fctx, &c))
749743
return NULL;
750744
return c;
751745
}
@@ -765,19 +759,18 @@ struct libnvmf_context {};
765759
return libnvme_init_ctrl(h, $self, instance) == 0;
766760
}
767761

768-
void connect(struct libnvme_host *h,
769-
struct libnvmf_context *fctx = NULL) {
762+
void connect(struct libnvme_host *h) {
770763
int ret;
771764
const char *dev;
772765

773766
dev = libnvme_ctrl_get_name($self);
774-
if (dev && !(fctx && fctx->cfg.duplicate_connect)) {
767+
if (dev && self->cfg.duplicate_connect) {
775768
connect_err = -ENVME_CONNECT_ALREADY;
776769
return;
777770
}
778771

779772
Py_BEGIN_ALLOW_THREADS /* Release Python GIL */
780-
ret = libnvmf_add_ctrl(h, $self, fctx);
773+
ret = libnvmf_add_ctrl(h, $self);
781774
Py_END_ALLOW_THREADS /* Reacquire Python GIL */
782775

783776
if (ret) {
Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
#!/usr/bin/env python3
22
# SPDX-License-Identifier: LGPL-2.1-or-later
3-
import sys
4-
import pprint
3+
4+
55
from libnvme import nvme
66

77
ctx = nvme.global_ctx()
8-
ctx.log_level('debug')
9-
10-
host = nvme.host(ctx)
11-
subsysnqn = nvme.NVME_DISC_SUBSYS_NAME
12-
transport = 'loop'
13-
traddr = '127.0.0.1'
14-
trsvcid = '8009'
15-
ctrl = nvme.ctrl(ctx, subsysnqn=subsysnqn, transport=transport, traddr=traddr, trsvcid=trsvcid)
8+
ctx.log_level('debug')
9+
10+
fctx = nvme.fabrics_context(ctx)
11+
fctx.set_connection(
12+
subsysnqn=nvme.NVME_DISC_SUBSYS_NAME,
13+
transport='loop',
14+
traddr='127.0.0.1',
15+
trsvcid='8009',
16+
)
17+
18+
ctrl = nvme.ctrl(ctx, fctx)

libnvme/libnvme/tests/gc.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#!/usr/bin/env python3
22
# SPDX-License-Identifier: LGPL-2.1-or-later
3+
4+
35
import gc
4-
import sys
5-
import pprint
66
from libnvme import nvme
77

88
ctx = nvme.global_ctx()
@@ -12,13 +12,16 @@
1212
host = nvme.host(ctx)
1313
print(f'host: {host}')
1414

15+
fctx = nvme.fabrics_context(ctx)
16+
fctx.set_connection(
17+
subsysnqn=nvme.NVME_DISC_SUBSYS_NAME,
18+
transport='loop',
19+
)
20+
print(f'fctx: {fctx}')
21+
1522
ctrls = []
1623
for i in range(10):
17-
ctrl = nvme.ctrl(
18-
ctx,
19-
subsysnqn=nvme.NVME_DISC_SUBSYS_NAME,
20-
transport='loop',
21-
)
24+
ctrl = nvme.ctrl(ctx, fctx)
2225
ctrls.append(ctrl)
2326
print(f'ctrl {i}: {ctrl}')
2427

libnvme/libnvme/tests/test-objects.py

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -118,20 +118,26 @@ def tearDown(self):
118118
gc.collect()
119119

120120
def _make_loop_ctrl(self):
121-
return nvme.ctrl(self.ctx, subsysnqn=self.subsysnqn, transport='loop')
121+
fctx = nvme.fabrics_context(self.ctx)
122+
fctx.set_connection(
123+
subsysnqn=self.subsysnqn,
124+
transport='loop'
125+
)
126+
return nvme.ctrl(self.ctx, fctx)
122127

123128
def test_creation_loop_transport(self):
124129
ctrl = self._make_loop_ctrl()
125130
self.assertIsNotNone(ctrl)
126131

127132
def test_creation_tcp_transport_with_traddr(self):
128-
ctrl = nvme.ctrl(
129-
self.ctx,
133+
fctx = nvme.fabrics_context(self.ctx)
134+
fctx.set_connection(
130135
subsysnqn=self.subsysnqn,
131136
transport='tcp',
132137
traddr='192.168.1.1',
133-
trsvcid='4420',
138+
trsvcid='4420'
134139
)
140+
ctrl = nvme.ctrl(self.ctx, fctx)
135141
self.assertIsNotNone(ctrl)
136142

137143
def test_transport_property(self):
@@ -143,22 +149,24 @@ def test_subsysnqn_property(self):
143149
self.assertEqual(ctrl.subsysnqn, self.subsysnqn)
144150

145151
def test_traddr_property(self):
146-
ctrl = nvme.ctrl(
147-
self.ctx,
152+
fctx = nvme.fabrics_context(self.ctx)
153+
fctx.set_connection(
148154
subsysnqn=self.subsysnqn,
149155
transport='tcp',
150156
traddr='10.0.0.1',
151157
)
158+
ctrl = nvme.ctrl(self.ctx, fctx)
152159
self.assertEqual(ctrl.traddr, '10.0.0.1')
153160

154161
def test_trsvcid_property(self):
155-
ctrl = nvme.ctrl(
156-
self.ctx,
162+
fctx = nvme.fabrics_context(self.ctx)
163+
fctx.set_connection(
157164
subsysnqn=self.subsysnqn,
158165
transport='tcp',
159166
traddr='10.0.0.1',
160167
trsvcid='8009',
161168
)
169+
ctrl = nvme.ctrl(self.ctx, fctx)
162170
self.assertEqual(ctrl.trsvcid, '8009')
163171

164172
def test_connected_returns_false_before_connect(self):
@@ -175,7 +183,12 @@ def test_str_contains_transport(self):
175183
self.assertIn('loop', s)
176184

177185
def test_context_manager(self):
178-
with nvme.ctrl(self.ctx, subsysnqn=self.subsysnqn, transport='loop') as c:
186+
fctx = nvme.fabrics_context(self.ctx)
187+
fctx.set_connection(
188+
subsysnqn=self.subsysnqn,
189+
transport='loop'
190+
)
191+
with nvme.ctrl(self.ctx, fctx) as c:
179192
self.assertIsNotNone(c)
180193

181194
def test_namespaces_iterator_returns_list(self):
@@ -221,11 +234,12 @@ class TestCtrlErrorHandling(unittest.TestCase):
221234

222235
def setUp(self):
223236
self.ctx = nvme.global_ctx()
224-
self.ctrl = nvme.ctrl(
225-
self.ctx,
237+
fctx = nvme.fabrics_context(self.ctx)
238+
fctx.set_connection(
226239
subsysnqn=nvme.NVME_DISC_SUBSYS_NAME,
227240
transport='loop',
228241
)
242+
self.ctrl = nvme.ctrl(self.ctx, fctx)
229243

230244
def tearDown(self):
231245
self.ctrl = None

libnvme/src/nvme/fabrics.c

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,8 @@ __public int libnvmf_context_create(struct libnvme_global_ctx *ctx,
215215

216216
fctx->ctx = ctx;
217217

218+
libnvmf_default_config(&fctx->cfg);
219+
218220
fctx->decide_retry = decide_retry;
219221
fctx->connected = connected;
220222
fctx->already_connected = already_connected;
@@ -1064,34 +1066,18 @@ static const char *lookup_context(struct libnvme_global_ctx *ctx, libnvme_ctrl_t
10641066
}
10651067

10661068
__public int libnvmf_create_ctrl(struct libnvme_global_ctx *ctx,
1067-
const char *subsysnqn, const char *transport,
1068-
const char *traddr, const char *host_traddr,
1069-
const char *host_iface, const char *trsvcid,
1070-
libnvme_ctrl_t *cp)
1071-
{
1072-
struct libnvmf_context fctx = {
1073-
.transport = transport,
1074-
.traddr = traddr,
1075-
.host_traddr = host_traddr,
1076-
.host_iface = host_iface,
1077-
.trsvcid = trsvcid,
1078-
.subsysnqn = subsysnqn,
1079-
};
1080-
1081-
return _libnvme_create_ctrl(ctx, &fctx, cp);
1069+
struct libnvmf_context *fctx, libnvme_ctrl_t *cp)
1070+
{
1071+
return _libnvme_create_ctrl(ctx, fctx, cp);
10821072
}
10831073

1084-
__public int libnvmf_add_ctrl(libnvme_host_t h, libnvme_ctrl_t c,
1085-
const struct libnvmf_context *fctx)
1074+
__public int libnvmf_add_ctrl(libnvme_host_t h, libnvme_ctrl_t c)
10861075
{
10871076
libnvme_subsystem_t s;
10881077
const char *root_app, *app;
10891078
__cleanup_free char *argstr = NULL;
10901079
int ret;
10911080

1092-
/* highest prio have configs from command line */
1093-
merge_config(c, &fctx->cfg);
1094-
10951081
/* apply configuration from config file (JSON) */
10961082
s = libnvme_lookup_subsystem(h, NULL, libnvme_ctrl_get_subsysnqn(c));
10971083
if (s) {
@@ -1334,7 +1320,7 @@ static int nvmf_connect_disc_entry(libnvme_host_t h,
13341320
/* update tls or concat */
13351321
nvmf_update_tls_concat(e, c, h);
13361322

1337-
ret = libnvmf_add_ctrl(h, c, fctx);
1323+
ret = libnvmf_add_ctrl(h, c);
13381324
if (!ret) {
13391325
*cp = c;
13401326
return 0;
@@ -1345,7 +1331,7 @@ static int nvmf_connect_disc_entry(libnvme_host_t h,
13451331
libnvme_msg(h->ctx, LIBNVME_LOG_INFO, "failed to connect controller, "
13461332
"retry with disabling SQ flow control\n");
13471333
c->cfg.disable_sqflow = false;
1348-
ret = libnvmf_add_ctrl(h, c, fctx);
1334+
ret = libnvmf_add_ctrl(h, c);
13491335
if (!ret) {
13501336
*cp = c;
13511337
return 0;
@@ -2202,7 +2188,7 @@ static int libnvme_add_ctrl(struct libnvmf_context *fctx,
22022188
int err;
22032189

22042190
retry:
2205-
err = libnvmf_add_ctrl(h, c, fctx);
2191+
err = libnvmf_add_ctrl(h, c);
22062192
if (!err)
22072193
return 0;
22082194
if (fctx->decide_retry(fctx, err, fctx->user_data))
@@ -2700,7 +2686,7 @@ static int nbft_connect(struct libnvme_global_ctx *ctx,
27002686
/* Update tls or concat */
27012687
nvmf_update_tls_concat(e, c, h);
27022688

2703-
ret = libnvmf_add_ctrl(h, c, fctx);
2689+
ret = libnvmf_add_ctrl(h, c);
27042690

27052691
/* Resume logging */
27062692
if (ss && ss->unavailable && saved_log_level < 1)

libnvme/src/nvme/fabrics.h

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -218,16 +218,14 @@ void libnvmf_update_config(libnvme_ctrl_t c,
218218
* libnvmf_add_ctrl() - Connect a controller and update topology
219219
* @h: Host to which the controller should be attached
220220
* @c: Controller to be connected
221-
* @fctx: Fabrics context
222221
*
223222
* Issues a 'connect' command to the NVMe-oF controller and inserts @c
224223
* into the topology using @h as parent.
225224
* @c must be initialized and not connected to the topology.
226225
*
227226
* Return: 0 on success, or an error code on failure.
228227
*/
229-
int libnvmf_add_ctrl(libnvme_host_t h, libnvme_ctrl_t c,
230-
const struct libnvmf_context *fctx);
228+
int libnvmf_add_ctrl(libnvme_host_t h, libnvme_ctrl_t c);
231229

232230
/**
233231
* libnvmf_connect_ctrl() - Connect a controller
@@ -572,23 +570,15 @@ int libnvmf_discovery_nbft(struct libnvme_global_ctx *ctx,
572570
/**
573571
* libnvmf_create_ctrl() - Allocate an unconnected NVMe controller
574572
* @ctx: struct libnvme_global_ctx object
575-
* @subsysnqn: Subsystem NQN
576-
* @transport: Transport type
577-
* @traddr: Transport address
578-
* @host_traddr: Host transport address
579-
* @host_iface: Host interface name
580-
* @trsvcid: Transport service ID
573+
* @fctx: Fabrics context
581574
* @c: @libnvme_ctrl_t object to return
582575
*
583576
* Creates an unconnected controller to be used for libnvme_add_ctrl().
584577
*
585578
* Return: 0 on success or negative error code otherwise
586579
*/
587580
int libnvmf_create_ctrl(struct libnvme_global_ctx *ctx,
588-
const char *subsysnqn, const char *transport,
589-
const char *traddr, const char *host_traddr,
590-
const char *host_iface, const char *trsvcid,
591-
libnvme_ctrl_t *c);
581+
struct libnvmf_context *fctx, libnvme_ctrl_t *c);
592582

593583
/**
594584
* libnvmf_connect() - Connect to fabrics subsystem

libnvme/src/nvme/tree.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,7 +1068,6 @@ static bool traddr_is_hostname(const char *transport, const char *traddr)
10681068

10691069
__public void libnvmf_default_config(struct libnvme_fabrics_config *cfg)
10701070
{
1071-
memset(cfg, 0, sizeof(*cfg));
10721071
cfg->tos = -1;
10731072
cfg->ctrl_loss_tmo = NVMF_DEF_CTRL_LOSS_TMO;
10741073
}
@@ -1099,7 +1098,7 @@ int _libnvme_create_ctrl(struct libnvme_global_ctx *ctx,
10991098

11001099
c->ctx = ctx;
11011100
c->hdl = NULL;
1102-
libnvmf_default_config(&c->cfg);
1101+
c->cfg = fctx->cfg;
11031102
list_head_init(&c->namespaces);
11041103
list_head_init(&c->paths);
11051104
list_node_init(&c->entry);
@@ -1535,6 +1534,7 @@ libnvme_ctrl_t libnvme_lookup_ctrl(libnvme_subsystem_t s,
15351534
ctx = s->h ? s->h->ctx : NULL;
15361535
/* Set the NQN to the subsystem the controller should be created in */
15371536
fctx->subsysnqn = s->subsysnqn;
1537+
libnvmf_default_config(&fctx->cfg);
15381538
ret = _libnvme_create_ctrl(ctx, fctx, &c);
15391539
/* And restore NQN to avoid issues with repetitive calls */
15401540
fctx->subsysnqn = subsysnqn;

0 commit comments

Comments
 (0)