Skip to content

Commit 6ba8601

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 72dce2d commit 6ba8601

9 files changed

Lines changed: 78 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;
@@ -1069,34 +1071,18 @@ static const char *lookup_context(struct libnvme_global_ctx *ctx, libnvme_ctrl_t
10691071
}
10701072

10711073
__public int libnvmf_create_ctrl(struct libnvme_global_ctx *ctx,
1072-
const char *subsysnqn, const char *transport,
1073-
const char *traddr, const char *host_traddr,
1074-
const char *host_iface, const char *trsvcid,
1075-
libnvme_ctrl_t *cp)
1076-
{
1077-
struct libnvmf_context fctx = {
1078-
.transport = transport,
1079-
.traddr = traddr,
1080-
.host_traddr = host_traddr,
1081-
.host_iface = host_iface,
1082-
.trsvcid = trsvcid,
1083-
.subsysnqn = subsysnqn,
1084-
};
1085-
1086-
return _libnvme_create_ctrl(ctx, &fctx, cp);
1074+
struct libnvmf_context *fctx, libnvme_ctrl_t *cp)
1075+
{
1076+
return _libnvme_create_ctrl(ctx, fctx, cp);
10871077
}
10881078

1089-
__public int libnvmf_add_ctrl(libnvme_host_t h, libnvme_ctrl_t c,
1090-
const struct libnvmf_context *fctx)
1079+
__public int libnvmf_add_ctrl(libnvme_host_t h, libnvme_ctrl_t c)
10911080
{
10921081
libnvme_subsystem_t s;
10931082
const char *root_app, *app;
10941083
__cleanup_free char *argstr = NULL;
10951084
int ret;
10961085

1097-
/* highest prio have configs from command line */
1098-
merge_config(c, &fctx->cfg);
1099-
11001086
/* apply configuration from config file (JSON) */
11011087
s = libnvme_lookup_subsystem(h, NULL, libnvme_ctrl_get_subsysnqn(c));
11021088
if (s) {
@@ -1339,7 +1325,7 @@ static int nvmf_connect_disc_entry(libnvme_host_t h,
13391325
/* update tls or concat */
13401326
nvmf_update_tls_concat(e, c, h);
13411327

1342-
ret = libnvmf_add_ctrl(h, c, fctx);
1328+
ret = libnvmf_add_ctrl(h, c);
13431329
if (!ret) {
13441330
*cp = c;
13451331
return 0;
@@ -1350,7 +1336,7 @@ static int nvmf_connect_disc_entry(libnvme_host_t h,
13501336
libnvme_msg(h->ctx, LIBNVME_LOG_INFO, "failed to connect controller, "
13511337
"retry with disabling SQ flow control\n");
13521338
c->cfg.disable_sqflow = false;
1353-
ret = libnvmf_add_ctrl(h, c, fctx);
1339+
ret = libnvmf_add_ctrl(h, c);
13541340
if (!ret) {
13551341
*cp = c;
13561342
return 0;
@@ -2207,7 +2193,7 @@ static int libnvme_add_ctrl(struct libnvmf_context *fctx,
22072193
int err;
22082194

22092195
retry:
2210-
err = libnvmf_add_ctrl(h, c, fctx);
2196+
err = libnvmf_add_ctrl(h, c);
22112197
if (!err)
22122198
return 0;
22132199
if (fctx->decide_retry(fctx, err, fctx->user_data))
@@ -2705,7 +2691,7 @@ static int nbft_connect(struct libnvme_global_ctx *ctx,
27052691
/* Update tls or concat */
27062692
nvmf_update_tls_concat(e, c, h);
27072693

2708-
ret = libnvmf_add_ctrl(h, c, fctx);
2694+
ret = libnvmf_add_ctrl(h, c);
27092695

27102696
/* Resume logging */
27112697
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/no-fabrics.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@ bool traddr_is_hostname(struct libnvme_global_ctx *ctx,
1313
{
1414
return false;
1515
}
16+
__public void libnvmf_default_config(struct libnvme_fabrics_config *cfg)
17+
{
18+
}

libnvme/src/nvme/tree.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,7 +1048,6 @@ __public void libnvme_free_ctrl(libnvme_ctrl_t c)
10481048

10491049
__public void libnvmf_default_config(struct libnvme_fabrics_config *cfg)
10501050
{
1051-
memset(cfg, 0, sizeof(*cfg));
10521051
cfg->tos = -1;
10531052
cfg->ctrl_loss_tmo = NVMF_DEF_CTRL_LOSS_TMO;
10541053
}
@@ -1079,7 +1078,7 @@ int _libnvme_create_ctrl(struct libnvme_global_ctx *ctx,
10791078

10801079
c->ctx = ctx;
10811080
c->hdl = NULL;
1082-
libnvmf_default_config(&c->cfg);
1081+
c->cfg = fctx->cfg;
10831082
list_head_init(&c->namespaces);
10841083
list_head_init(&c->paths);
10851084
list_node_init(&c->entry);
@@ -1515,6 +1514,7 @@ libnvme_ctrl_t libnvme_lookup_ctrl(libnvme_subsystem_t s,
15151514
ctx = s->h ? s->h->ctx : NULL;
15161515
/* Set the NQN to the subsystem the controller should be created in */
15171516
fctx->subsysnqn = s->subsysnqn;
1517+
libnvmf_default_config(&fctx->cfg);
15181518
ret = _libnvme_create_ctrl(ctx, fctx, &c);
15191519
/* And restore NQN to avoid issues with repetitive calls */
15201520
fctx->subsysnqn = subsysnqn;

0 commit comments

Comments
 (0)