Skip to content

Commit 6a553d9

Browse files
committed
fabrics: move connect/disconnect to fabrics API
The connect and disconnect functions belong to the fabrics API. Move them there. While at it, also move libnvme_ctrl_get_config to the fabrics.h header, since it returns the fabrics configuration. Signed-off-by: Daniel Wagner <[email protected]>
1 parent f6a35ec commit 6a553d9

11 files changed

Lines changed: 113 additions & 111 deletions

File tree

fabrics.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,7 @@ static void nvmf_disconnect_nqn(struct libnvme_global_ctx *ctx, char *nqn)
721721
if (strcmp(libnvme_subsystem_get_subsysnqn(s), p))
722722
continue;
723723
libnvme_subsystem_for_each_ctrl(s, c) {
724-
if (!libnvme_disconnect_ctrl(c))
724+
if (!libnvmf_disconnect_ctrl(c))
725725
i++;
726726
}
727727
}
@@ -804,7 +804,7 @@ int fabrics_disconnect(const char *desc, int argc, char **argv)
804804
"Did not find device %s\n", p);
805805
return -ENODEV;
806806
}
807-
ret = libnvme_disconnect_ctrl(c);
807+
ret = libnvmf_disconnect_ctrl(c);
808808
if (ret)
809809
fprintf(stderr,
810810
"Failed to disconnect %s: %s\n",
@@ -870,7 +870,7 @@ int fabrics_disconnect_all(const char *desc, int argc, char **argv)
870870
else if (!strcmp(libnvme_ctrl_get_transport(c),
871871
"pcie"))
872872
continue;
873-
if (libnvme_disconnect_ctrl(c))
873+
if (libnvmf_disconnect_ctrl(c))
874874
fprintf(stderr,
875875
"failed to disconnect %s\n",
876876
libnvme_ctrl_get_name(c));

libnvme/examples/discover-loop.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ int main()
7777
goto free_fctx;
7878
}
7979

80-
ret = libnvme_create_ctrl(ctx, NVME_DISC_SUBSYS_NAME, "loop",
80+
ret = libnvmf_create_ctrl(ctx, NVME_DISC_SUBSYS_NAME, "loop",
8181
NULL, NULL, NULL, NULL, &c);
8282
if (ret) {
8383
fprintf(stderr, "Failed to allocate memory\n");
@@ -97,7 +97,7 @@ int main()
9797
libnvmf_discovery_args_free(args);
9898
}
9999

100-
libnvme_disconnect_ctrl(c);
100+
libnvmf_disconnect_ctrl(c);
101101
libnvme_free_ctrl(c);
102102

103103
if (ret)

libnvme/libnvme/nvme.i

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -744,7 +744,7 @@ struct libnvmf_context {};
744744
const char *host_iface = NULL,
745745
const char *trsvcid = NULL) {
746746
struct libnvme_ctrl *c;
747-
if (libnvme_create_ctrl(ctx, subsysnqn, transport, traddr,
747+
if (libnvmf_create_ctrl(ctx, subsysnqn, transport, traddr,
748748
host_traddr, host_iface, trsvcid, &c))
749749
return NULL;
750750
return c;
@@ -757,7 +757,7 @@ struct libnvmf_context {};
757757
}
758758
struct libnvme_ctrl* __exit__(PyObject *type, PyObject *value, PyObject *traceback) {
759759
if (libnvme_ctrl_get_name($self))
760-
libnvme_disconnect_ctrl($self);
760+
libnvmf_disconnect_ctrl($self);
761761
return $self;
762762
}
763763

@@ -801,7 +801,7 @@ struct libnvmf_context {};
801801
return;
802802
}
803803
Py_BEGIN_ALLOW_THREADS /* Release Python GIL */
804-
ret = libnvme_disconnect_ctrl($self);
804+
ret = libnvmf_disconnect_ctrl($self);
805805
Py_END_ALLOW_THREADS /* Reacquire Python GIL */
806806
if (ret < 0)
807807
connect_err = 2;

libnvme/src/libnvme.ld

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@ LIBNVME_3 {
44
global:
55
libnvme_clear_etdas;
66
libnvme_close;
7-
libnvme_create_ctrl;
87
libnvme_create_global_ctx;
98
libnvme_create_raw_secret;
109
libnvme_ctrl_first_ns;
1110
libnvme_ctrl_first_path;
12-
libnvme_ctrl_get_config;
1311
libnvme_ctrl_get_phy_slot;
1412
libnvme_ctrl_get_src_addr;
1513
libnvme_ctrl_get_state;
@@ -22,7 +20,6 @@ LIBNVME_3 {
2220
libnvme_ctrl_next_path;
2321
libnvme_ctrl_release_transport_handle;
2422
libnvme_describe_key_serial;
25-
libnvme_disconnect_ctrl;
2623
libnvme_dump_config;
2724
libnvme_dump_tree;
2825
libnvme_errno_to_string;

libnvme/src/libnvmf.ld

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,20 @@ LIBNVMF_3 {
1919
libnvmf_context_set_fabrics_config;
2020
libnvmf_context_set_hostnqn;
2121
libnvmf_context_set_persistent;
22+
libnvmf_create_ctrl;
23+
libnvmf_ctrl_get_config;
2224
libnvmf_default_config;
25+
libnvmf_disconnect_ctrl;
2326
libnvmf_discovery;
27+
libnvmf_discovery_args_create;
28+
libnvmf_discovery_args_free;
2429
libnvmf_discovery_config_file;
2530
libnvmf_discovery_config_json;
2631
libnvmf_discovery_nbft;
2732
libnvmf_eflags_str;
2833
libnvmf_exat_ptr_next;
2934
libnvmf_free_uri;
3035
libnvmf_get_default_trsvcid;
31-
libnvmf_discovery_args_create;
32-
libnvmf_discovery_args_free;
3336
libnvmf_get_discovery_log;
3437
libnvmf_is_registration_supported;
3538
libnvmf_nbft_free;

libnvme/src/nvme/fabrics.c

Lines changed: 54 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,12 @@ __public int libnvmf_context_set_device(struct libnvmf_context *fctx, const char
378378
return 0;
379379
}
380380

381+
__public struct libnvme_fabrics_config *libnvmf_ctrl_get_config(
382+
libnvme_ctrl_t c)
383+
{
384+
return &c->cfg;
385+
}
386+
381387
/*
382388
* Derived from Linux's supported options (the opt_tokens table)
383389
* when the mechanism to report supported options was added (f18ee3d988157).
@@ -414,7 +420,7 @@ static const struct libnvme_fabric_options default_supported_options = {
414420
static void merge_config(libnvme_ctrl_t c,
415421
const struct libnvme_fabrics_config *cfg)
416422
{
417-
struct libnvme_fabrics_config *ctrl_cfg = libnvme_ctrl_get_config(c);
423+
struct libnvme_fabrics_config *ctrl_cfg = libnvmf_ctrl_get_config(c);
418424

419425
MERGE_CFG_OPTION(ctrl_cfg, cfg, nr_io_queues, 0);
420426
MERGE_CFG_OPTION(ctrl_cfg, cfg, nr_write_queues, 0);
@@ -440,7 +446,7 @@ static void merge_config(libnvme_ctrl_t c,
440446
if ((n)->o != d) (c)->o = (n)->o
441447
__public void libnvmf_update_config(libnvme_ctrl_t c, const struct libnvme_fabrics_config *cfg)
442448
{
443-
struct libnvme_fabrics_config *ctrl_cfg = libnvme_ctrl_get_config(c);
449+
struct libnvme_fabrics_config *ctrl_cfg = libnvmf_ctrl_get_config(c);
444450

445451
UPDATE_CFG_OPTION(ctrl_cfg, cfg, nr_io_queues, 0);
446452
UPDATE_CFG_OPTION(ctrl_cfg, cfg, nr_write_queues, 0);
@@ -744,7 +750,7 @@ static bool traddr_is_hostname(struct libnvme_global_ctx *ctx, libnvme_ctrl_t c)
744750

745751
static int build_options(libnvme_host_t h, libnvme_ctrl_t c, char **argstr)
746752
{
747-
struct libnvme_fabrics_config *cfg = libnvme_ctrl_get_config(c);
753+
struct libnvme_fabrics_config *cfg = libnvmf_ctrl_get_config(c);
748754
const char *transport = libnvme_ctrl_get_transport(c);
749755
const char *hostnqn, *hostid, *hostkey, *ctrlkey = NULL;
750756
bool discover = false, discovery_nqn = false;
@@ -1057,6 +1063,24 @@ static const char *lookup_context(struct libnvme_global_ctx *ctx, libnvme_ctrl_t
10571063
return NULL;
10581064
}
10591065

1066+
__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);
1082+
}
1083+
10601084
__public int libnvmf_add_ctrl(libnvme_host_t h, libnvme_ctrl_t c,
10611085
const struct libnvmf_context *fctx)
10621086
{
@@ -1085,7 +1109,7 @@ __public int libnvmf_add_ctrl(libnvme_host_t h, libnvme_ctrl_t c,
10851109
if (fc) {
10861110
const char *key;
10871111

1088-
merge_config(c, libnvme_ctrl_get_config(fc));
1112+
merge_config(c, libnvmf_ctrl_get_config(fc));
10891113
/*
10901114
* An authentication key might already been set
10911115
* in @cfg, so ensure to update @c with the correct
@@ -1169,6 +1193,24 @@ __public int libnvmf_connect_ctrl(libnvme_ctrl_t c)
11691193
return 0;
11701194
}
11711195

1196+
__public int libnvmf_disconnect_ctrl(libnvme_ctrl_t c)
1197+
{
1198+
struct libnvme_global_ctx *ctx = c->s && c->s->h ? c->s->h->ctx : NULL;
1199+
int ret;
1200+
1201+
ret = libnvme_set_attr(libnvme_ctrl_get_sysfs_dir(c),
1202+
"delete_controller", "1");
1203+
if (ret < 0) {
1204+
libnvme_msg(ctx, LIBNVME_LOG_ERR,
1205+
"%s: failed to disconnect, error %d\n", c->name, errno);
1206+
return ret;
1207+
}
1208+
libnvme_msg(ctx, LIBNVME_LOG_INFO, "%s: %s disconnected\n",
1209+
c->name, c->subsysnqn);
1210+
nvme_deconfigure_ctrl(c);
1211+
return 0;
1212+
}
1213+
11721214
static void nvmf_update_tls_concat(struct nvmf_disc_log_entry *e,
11731215
libnvme_ctrl_t c, libnvme_host_t h)
11741216
{
@@ -2112,7 +2154,7 @@ static int _nvmf_discovery(struct libnvme_global_ctx *ctx,
21122154
_nvmf_discovery(ctx, &nfctx, true, child);
21132155

21142156
if (child && disconnect) {
2115-
libnvme_disconnect_ctrl(child);
2157+
libnvmf_disconnect_ctrl(child);
21162158
libnvme_free_ctrl(child);
21172159
}
21182160
} else if (err == -ENVME_CONNECT_ALREADY) {
@@ -2237,7 +2279,7 @@ static int nvmf_create_discovery_ctrl(struct libnvme_global_ctx *ctx,
22372279
libnvme_msg(ctx, LIBNVME_LOG_ERR,
22382280
"failed to identify controller, error %s\n",
22392281
libnvme_strerror(-ret));
2240-
libnvme_disconnect_ctrl(c);
2282+
libnvmf_disconnect_ctrl(c);
22412283
libnvme_free_ctrl(c);
22422284
return ret;
22432285
}
@@ -2251,7 +2293,7 @@ static int nvmf_create_discovery_ctrl(struct libnvme_global_ctx *ctx,
22512293
* The subsysnqn is not the well-known name. Prefer the unique
22522294
* subsysnqn over the well-known one.
22532295
*/
2254-
libnvme_disconnect_ctrl(c);
2296+
libnvmf_disconnect_ctrl(c);
22552297
libnvme_free_ctrl(c);
22562298

22572299
fctx->subsysnqn = id->subnqn;
@@ -2332,7 +2374,7 @@ int _discovery_config_json(struct libnvme_global_ctx *ctx,
23322374

23332375
_nvmf_discovery(ctx, &nfctx, connect, cn);
23342376
if (!(fctx->persistent || is_persistent_discovery_ctrl(h, cn)))
2335-
ret = libnvme_disconnect_ctrl(cn);
2377+
ret = libnvmf_disconnect_ctrl(cn);
23362378
libnvme_free_ctrl(cn);
23372379

23382380
return ret;
@@ -2486,7 +2528,7 @@ __public int libnvmf_discovery_config_file(struct libnvme_global_ctx *ctx,
24862528
_nvmf_discovery(ctx, &nfctx, connect, c);
24872529
if (!(nfctx.persistent ||
24882530
is_persistent_discovery_ctrl(h, c)))
2489-
err = libnvme_disconnect_ctrl(c);
2531+
err = libnvmf_disconnect_ctrl(c);
24902532
libnvme_free_ctrl(c);
24912533
} while (!err);
24922534

@@ -2741,7 +2783,7 @@ static int nbft_discovery(struct libnvme_global_ctx *ctx,
27412783
if (ret)
27422784
continue;
27432785
nbft_discovery(ctx, &nfctx, dd, h, child);
2744-
libnvme_disconnect_ctrl(child);
2786+
libnvmf_disconnect_ctrl(child);
27452787
libnvme_free_ctrl(child);
27462788
} else {
27472789
ret = nbft_connect(ctx, &nfctx, h, e, NULL);
@@ -2983,7 +3025,7 @@ __public int libnvmf_discovery_nbft(struct libnvme_global_ctx *ctx,
29833025

29843026
rr = nbft_discovery(ctx, &nfctx, *dd, h, c);
29853027
if (!persistent)
2986-
libnvme_disconnect_ctrl(c);
3028+
libnvmf_disconnect_ctrl(c);
29873029
libnvme_free_ctrl(c);
29883030
if (rr == -ENOMEM) {
29893031
ret = rr;
@@ -3085,7 +3127,7 @@ __public int libnvmf_discovery(struct libnvme_global_ctx *ctx, struct libnvmf_co
30853127

30863128
ret = _nvmf_discovery(ctx, fctx, connect, c);
30873129
if (!(fctx->persistent || is_persistent_discovery_ctrl(h, c)))
3088-
libnvme_disconnect_ctrl(c);
3130+
libnvmf_disconnect_ctrl(c);
30893131
libnvme_free_ctrl(c);
30903132

30913133
return ret;

libnvme/src/nvme/fabrics.h

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,14 @@ int libnvmf_context_set_persistent(struct libnvmf_context *fctx, bool persistent
505505
*/
506506
int libnvmf_context_set_device(struct libnvmf_context *fctx, const char *device);
507507

508+
/**
509+
* libnvmf_ctrl_get_config() - Fabrics configuration of a controller
510+
* @c: Controller instance
511+
*
512+
* Return: Fabrics configuration of @c
513+
*/
514+
struct libnvme_fabrics_config *libnvmf_ctrl_get_config(libnvme_ctrl_t c);
515+
508516
/**
509517
* libnvmf_discovery() - Perform fabrics discovery
510518
* @ctx: Global context
@@ -561,6 +569,27 @@ int libnvmf_discovery_config_file(struct libnvme_global_ctx *ctx,
561569
int libnvmf_discovery_nbft(struct libnvme_global_ctx *ctx,
562570
struct libnvmf_context *fctx, bool connect, char *nbft_path);
563571

572+
/**
573+
* libnvmf_create_ctrl() - Allocate an unconnected NVMe controller
574+
* @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
581+
* @c: @libnvme_ctrl_t object to return
582+
*
583+
* Creates an unconnected controller to be used for libnvme_add_ctrl().
584+
*
585+
* Return: 0 on success or negative error code otherwise
586+
*/
587+
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);
592+
564593
/**
565594
* libnvmf_connect() - Connect to fabrics subsystem
566595
* @ctx: Global context
@@ -570,7 +599,18 @@ int libnvmf_discovery_nbft(struct libnvme_global_ctx *ctx,
570599
*
571600
* Return: 0 on success, or a negative error code on failure.
572601
*/
573-
int libnvmf_connect(struct libnvme_global_ctx *ctx, struct libnvmf_context *fctx);
602+
int libnvmf_connect(struct libnvme_global_ctx *ctx,
603+
struct libnvmf_context *fctx);
604+
605+
/**
606+
* libnvmf_disconnect_ctrl() - Disconnect a controller
607+
* @c: Controller instance
608+
*
609+
* Issues a 'disconnect' fabrics command to @c
610+
*
611+
* Return: 0 on success, -1 on failure.
612+
*/
613+
int libnvmf_disconnect_ctrl(libnvme_ctrl_t c);
574614

575615
/**
576616
* libnvmf_connect_config_json() - Connect using JSON config

libnvme/src/nvme/json.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
static void json_update_attributes(libnvme_ctrl_t c,
2727
struct json_object *ctrl_obj)
2828
{
29-
struct libnvme_fabrics_config *cfg = libnvme_ctrl_get_config(c);
29+
struct libnvme_fabrics_config *cfg = libnvmf_ctrl_get_config(c);
3030

3131
json_object_object_foreach(ctrl_obj, key_str, val_obj) {
3232
JSON_UPDATE_INT_OPTION(cfg, key_str,
@@ -275,7 +275,7 @@ int json_read_config(struct libnvme_global_ctx *ctx, const char *config_file)
275275

276276
static void json_update_port(struct json_object *ctrl_array, libnvme_ctrl_t c)
277277
{
278-
struct libnvme_fabrics_config *cfg = libnvme_ctrl_get_config(c);
278+
struct libnvme_fabrics_config *cfg = libnvmf_ctrl_get_config(c);
279279
struct json_object *port_obj = json_object_new_object();
280280
const char *transport, *value;
281281

@@ -443,7 +443,7 @@ int json_update_config(struct libnvme_global_ctx *ctx, int fd)
443443

444444
static void json_dump_ctrl(struct json_object *ctrl_array, libnvme_ctrl_t c)
445445
{
446-
struct libnvme_fabrics_config *cfg = libnvme_ctrl_get_config(c);
446+
struct libnvme_fabrics_config *cfg = libnvmf_ctrl_get_config(c);
447447
struct json_object *ctrl_obj = json_object_new_object();
448448
const char *name, *transport, *value;
449449

libnvme/src/nvme/private.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,8 @@ void *__libnvme_alloc(size_t len);
332332

333333
void *__libnvme_realloc(void *p, size_t len);
334334

335+
void nvme_deconfigure_ctrl(libnvme_ctrl_t c);
336+
335337
libnvme_host_t libnvme_lookup_host(struct libnvme_global_ctx *ctx,
336338
const char *hostnqn, const char *hostid);
337339
libnvme_subsystem_t libnvme_lookup_subsystem(struct libnvme_host *h,

0 commit comments

Comments
 (0)