Skip to content

Commit e866ec2

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 128aac4 commit e866ec2

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
@@ -773,7 +773,7 @@ static void nvmf_disconnect_nqn(struct libnvme_global_ctx *ctx, char *nqn)
773773
if (strcmp(libnvme_subsystem_get_subsysnqn(s), p))
774774
continue;
775775
libnvme_subsystem_for_each_ctrl(s, c) {
776-
if (!libnvme_disconnect_ctrl(c))
776+
if (!libnvmf_disconnect_ctrl(c))
777777
i++;
778778
}
779779
}
@@ -856,7 +856,7 @@ int fabrics_disconnect(const char *desc, int argc, char **argv)
856856
"Did not find device %s\n", p);
857857
return -ENODEV;
858858
}
859-
ret = libnvme_disconnect_ctrl(c);
859+
ret = libnvmf_disconnect_ctrl(c);
860860
if (ret)
861861
fprintf(stderr,
862862
"Failed to disconnect %s: %s\n",
@@ -922,7 +922,7 @@ int fabrics_disconnect_all(const char *desc, int argc, char **argv)
922922
else if (!strcmp(libnvme_ctrl_get_transport(c),
923923
"pcie"))
924924
continue;
925-
if (libnvme_disconnect_ctrl(c))
925+
if (libnvmf_disconnect_ctrl(c))
926926
fprintf(stderr,
927927
"failed to disconnect %s\n",
928928
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);
@@ -749,7 +755,7 @@ bool traddr_is_hostname(struct libnvme_global_ctx *ctx,
749755

750756
static int build_options(libnvme_host_t h, libnvme_ctrl_t c, char **argstr)
751757
{
752-
struct libnvme_fabrics_config *cfg = libnvme_ctrl_get_config(c);
758+
struct libnvme_fabrics_config *cfg = libnvmf_ctrl_get_config(c);
753759
const char *transport = libnvme_ctrl_get_transport(c);
754760
const char *hostnqn, *hostid, *hostkey, *ctrlkey = NULL;
755761
bool discover = false, discovery_nqn = false;
@@ -1062,6 +1068,24 @@ static const char *lookup_context(struct libnvme_global_ctx *ctx, libnvme_ctrl_t
10621068
return NULL;
10631069
}
10641070

1071+
__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);
1087+
}
1088+
10651089
__public int libnvmf_add_ctrl(libnvme_host_t h, libnvme_ctrl_t c,
10661090
const struct libnvmf_context *fctx)
10671091
{
@@ -1090,7 +1114,7 @@ __public int libnvmf_add_ctrl(libnvme_host_t h, libnvme_ctrl_t c,
10901114
if (fc) {
10911115
const char *key;
10921116

1093-
merge_config(c, libnvme_ctrl_get_config(fc));
1117+
merge_config(c, libnvmf_ctrl_get_config(fc));
10941118
/*
10951119
* An authentication key might already been set
10961120
* in @cfg, so ensure to update @c with the correct
@@ -1174,6 +1198,24 @@ __public int libnvmf_connect_ctrl(libnvme_ctrl_t c)
11741198
return 0;
11751199
}
11761200

1201+
__public int libnvmf_disconnect_ctrl(libnvme_ctrl_t c)
1202+
{
1203+
struct libnvme_global_ctx *ctx = c->s && c->s->h ? c->s->h->ctx : NULL;
1204+
int ret;
1205+
1206+
ret = libnvme_set_attr(libnvme_ctrl_get_sysfs_dir(c),
1207+
"delete_controller", "1");
1208+
if (ret < 0) {
1209+
libnvme_msg(ctx, LIBNVME_LOG_ERR,
1210+
"%s: failed to disconnect, error %d\n", c->name, errno);
1211+
return ret;
1212+
}
1213+
libnvme_msg(ctx, LIBNVME_LOG_INFO, "%s: %s disconnected\n",
1214+
c->name, c->subsysnqn);
1215+
nvme_deconfigure_ctrl(c);
1216+
return 0;
1217+
}
1218+
11771219
static void nvmf_update_tls_concat(struct nvmf_disc_log_entry *e,
11781220
libnvme_ctrl_t c, libnvme_host_t h)
11791221
{
@@ -2117,7 +2159,7 @@ static int _nvmf_discovery(struct libnvme_global_ctx *ctx,
21172159
_nvmf_discovery(ctx, &nfctx, true, child);
21182160

21192161
if (child && disconnect) {
2120-
libnvme_disconnect_ctrl(child);
2162+
libnvmf_disconnect_ctrl(child);
21212163
libnvme_free_ctrl(child);
21222164
}
21232165
} else if (err == -ENVME_CONNECT_ALREADY) {
@@ -2242,7 +2284,7 @@ static int nvmf_create_discovery_ctrl(struct libnvme_global_ctx *ctx,
22422284
libnvme_msg(ctx, LIBNVME_LOG_ERR,
22432285
"failed to identify controller, error %s\n",
22442286
libnvme_strerror(-ret));
2245-
libnvme_disconnect_ctrl(c);
2287+
libnvmf_disconnect_ctrl(c);
22462288
libnvme_free_ctrl(c);
22472289
return ret;
22482290
}
@@ -2256,7 +2298,7 @@ static int nvmf_create_discovery_ctrl(struct libnvme_global_ctx *ctx,
22562298
* The subsysnqn is not the well-known name. Prefer the unique
22572299
* subsysnqn over the well-known one.
22582300
*/
2259-
libnvme_disconnect_ctrl(c);
2301+
libnvmf_disconnect_ctrl(c);
22602302
libnvme_free_ctrl(c);
22612303

22622304
fctx->subsysnqn = id->subnqn;
@@ -2337,7 +2379,7 @@ int _discovery_config_json(struct libnvme_global_ctx *ctx,
23372379

23382380
_nvmf_discovery(ctx, &nfctx, connect, cn);
23392381
if (!(fctx->persistent || is_persistent_discovery_ctrl(h, cn)))
2340-
ret = libnvme_disconnect_ctrl(cn);
2382+
ret = libnvmf_disconnect_ctrl(cn);
23412383
libnvme_free_ctrl(cn);
23422384

23432385
return ret;
@@ -2491,7 +2533,7 @@ __public int libnvmf_discovery_config_file(struct libnvme_global_ctx *ctx,
24912533
_nvmf_discovery(ctx, &nfctx, connect, c);
24922534
if (!(nfctx.persistent ||
24932535
is_persistent_discovery_ctrl(h, c)))
2494-
err = libnvme_disconnect_ctrl(c);
2536+
err = libnvmf_disconnect_ctrl(c);
24952537
libnvme_free_ctrl(c);
24962538
} while (!err);
24972539

@@ -2746,7 +2788,7 @@ static int nbft_discovery(struct libnvme_global_ctx *ctx,
27462788
if (ret)
27472789
continue;
27482790
nbft_discovery(ctx, &nfctx, dd, h, child);
2749-
libnvme_disconnect_ctrl(child);
2791+
libnvmf_disconnect_ctrl(child);
27502792
libnvme_free_ctrl(child);
27512793
} else {
27522794
ret = nbft_connect(ctx, &nfctx, h, e, NULL);
@@ -2988,7 +3030,7 @@ __public int libnvmf_discovery_nbft(struct libnvme_global_ctx *ctx,
29883030

29893031
rr = nbft_discovery(ctx, &nfctx, *dd, h, c);
29903032
if (!persistent)
2991-
libnvme_disconnect_ctrl(c);
3033+
libnvmf_disconnect_ctrl(c);
29923034
libnvme_free_ctrl(c);
29933035
if (rr == -ENOMEM) {
29943036
ret = rr;
@@ -3090,7 +3132,7 @@ __public int libnvmf_discovery(struct libnvme_global_ctx *ctx, struct libnvmf_co
30903132

30913133
ret = _nvmf_discovery(ctx, fctx, connect, c);
30923134
if (!(fctx->persistent || is_persistent_discovery_ctrl(h, c)))
3093-
libnvme_disconnect_ctrl(c);
3135+
libnvmf_disconnect_ctrl(c);
30943136
libnvme_free_ctrl(c);
30953137

30963138
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)