summaryrefslogtreecommitdiffstats
path: root/fabrics.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--fabrics.c80
1 files changed, 52 insertions, 28 deletions
diff --git a/fabrics.c b/fabrics.c
index 1a53b23..871c20e 100644
--- a/fabrics.c
+++ b/fabrics.c
@@ -38,12 +38,14 @@
#include <sys/types.h>
#include <linux/types.h>
+#include <libnvme.h>
+
#include "common.h"
#include "nvme.h"
#include "nbft.h"
-#include "libnvme.h"
#include "nvme-print.h"
#include "fabrics.h"
+#include "util/logging.h"
#define PATH_NVMF_DISC SYSCONFDIR "/nvme/discovery.conf"
#define PATH_NVMF_CONFIG SYSCONFDIR "/nvme/config.json"
@@ -76,6 +78,7 @@ static const char *nvmf_queue_size = "number of io queue elements to use (defaul
static const char *nvmf_keep_alive_tmo = "keep alive timeout period in seconds";
static const char *nvmf_reconnect_delay = "reconnect timeout period in seconds";
static const char *nvmf_ctrl_loss_tmo = "controller loss timeout period in seconds";
+static const char *nvmf_fast_io_fail_tmo = "fast I/O fail timeout (default off)";
static const char *nvmf_tos = "type of service";
static const char *nvmf_keyring = "Keyring for TLS key lookup";
static const char *nvmf_tls_key = "TLS key to use";
@@ -106,6 +109,7 @@ static const char *nvmf_context = "execution context identification string";
OPT_INT("keep-alive-tmo", 'k', &c.keep_alive_tmo, nvmf_keep_alive_tmo), \
OPT_INT("reconnect-delay", 'c', &c.reconnect_delay, nvmf_reconnect_delay), \
OPT_INT("ctrl-loss-tmo", 'l', &c.ctrl_loss_tmo, nvmf_ctrl_loss_tmo), \
+ OPT_INT("fast_io_fail_tmo", 'F', &c.fast_io_fail_tmo, nvmf_fast_io_fail_tmo),\
OPT_INT("tos", 'T', &c.tos, nvmf_tos), \
OPT_INT("keyring", 0, &c.keyring, nvmf_keyring), \
OPT_INT("tls_key", 0, &c.tls_key, nvmf_tls_key), \
@@ -195,6 +199,7 @@ static nvme_ctrl_t create_discover_ctrl(nvme_root_t r, nvme_host_t h,
struct nvme_fabrics_config *cfg,
struct tr_config *trcfg)
{
+ _cleanup_free_ struct nvme_id_ctrl *id = NULL;
nvme_ctrl_t c;
c = __create_discover_ctrl(r, h, cfg, trcfg);
@@ -204,10 +209,12 @@ static nvme_ctrl_t create_discover_ctrl(nvme_root_t r, nvme_host_t h,
if (nvme_ctrl_is_unique_discovery_ctrl(c))
return c;
- /* Find out the name of discovery controller */
- struct nvme_id_ctrl id = { 0 };
+ id = nvme_alloc(sizeof(*id));
+ if (!id)
+ return NULL;
- if (nvme_ctrl_identify(c, &id)) {
+ /* Find out the name of discovery controller */
+ if (nvme_ctrl_identify(c, id)) {
fprintf(stderr, "failed to identify controller, error %s\n",
nvme_strerror(errno));
nvme_disconnect_ctrl(c);
@@ -215,7 +222,7 @@ static nvme_ctrl_t create_discover_ctrl(nvme_root_t r, nvme_host_t h,
return NULL;
}
- if (!strcmp(id.subnqn, NVME_DISC_SUBSYS_NAME))
+ if (!strcmp(id->subnqn, NVME_DISC_SUBSYS_NAME))
return c;
/*
@@ -225,7 +232,7 @@ static nvme_ctrl_t create_discover_ctrl(nvme_root_t r, nvme_host_t h,
nvme_disconnect_ctrl(c);
nvme_free_ctrl(c);
- trcfg->subsysnqn = id.subnqn;
+ trcfg->subsysnqn = id->subnqn;
return __create_discover_ctrl(r, h, cfg, trcfg);
}
@@ -636,7 +643,8 @@ char *nvmf_hostid_from_hostnqn(const char *hostnqn)
void nvmf_check_hostid_and_hostnqn(const char *hostid, const char *hostnqn, unsigned int verbose)
{
- char *hostid_from_file, *hostid_from_hostnqn;
+ _cleanup_free_ char *hostid_from_file = NULL;
+ _cleanup_free_ char *hostid_from_hostnqn = NULL;
if (!hostid)
return;
@@ -646,7 +654,6 @@ void nvmf_check_hostid_and_hostnqn(const char *hostid, const char *hostnqn, unsi
if (verbose)
fprintf(stderr,
"warning: use generated hostid instead of hostid file\n");
- free(hostid_from_file);
}
if (!hostnqn)
@@ -657,7 +664,6 @@ void nvmf_check_hostid_and_hostnqn(const char *hostid, const char *hostnqn, unsi
if (verbose)
fprintf(stderr,
"warning: use hostid which does not match uuid in hostnqn\n");
- free(hostid_from_hostnqn);
}
}
@@ -714,7 +720,9 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
if (!strcmp(config_file, "none"))
config_file = NULL;
- r = nvme_create_root(stderr, map_log_level(verbose, quiet));
+ log_level = map_log_level(verbose, quiet);
+
+ r = nvme_create_root(stderr, log_level);
if (!r) {
fprintf(stderr, "Failed to create topology root: %s\n",
nvme_strerror(errno));
@@ -724,8 +732,9 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
nvme_root_set_application(r, context);
ret = nvme_scan_topology(r, NULL, NULL);
if (ret < 0) {
- fprintf(stderr, "Failed to scan topology: %s\n",
- nvme_strerror(errno));
+ if (errno != ENOENT)
+ fprintf(stderr, "Failed to scan topology: %s\n",
+ nvme_strerror(errno));
nvme_free_tree(r);
return ret;
}
@@ -942,7 +951,9 @@ int nvmf_connect(const char *desc, int argc, char **argv)
if (!strcmp(config_file, "none"))
config_file = NULL;
- r = nvme_create_root(stderr, map_log_level(verbose, quiet));
+ log_level = map_log_level(verbose, quiet);
+
+ r = nvme_create_root(stderr, log_level);
if (!r) {
fprintf(stderr, "Failed to create topology root: %s\n",
nvme_strerror(errno));
@@ -952,8 +963,9 @@ int nvmf_connect(const char *desc, int argc, char **argv)
nvme_root_set_application(r, context);
ret = nvme_scan_topology(r, NULL, NULL);
if (ret < 0) {
- fprintf(stderr, "Failed to scan topology: %s\n",
- nvme_strerror(errno));
+ if (errno != ENOENT)
+ fprintf(stderr, "Failed to scan topology: %s\n",
+ nvme_strerror(errno));
nvme_free_tree(r);
return ret;
}
@@ -991,7 +1003,7 @@ int nvmf_connect(const char *desc, int argc, char **argv)
};
c = lookup_ctrl(h, &trcfg);
- if (c && nvme_ctrl_get_name(c)) {
+ if (c && nvme_ctrl_get_name(c) && !cfg.duplicate_connect) {
fprintf(stderr, "already connected\n");
errno = EALREADY;
goto out_free;
@@ -1102,7 +1114,9 @@ int nvmf_disconnect(const char *desc, int argc, char **argv)
return -EINVAL;
}
- r = nvme_create_root(stderr, map_log_level(cfg.verbose, false));
+ log_level = map_log_level(cfg.verbose, false);
+
+ r = nvme_create_root(stderr, log_level);
if (!r) {
fprintf(stderr, "Failed to create topology root: %s\n",
nvme_strerror(errno));
@@ -1110,8 +1124,9 @@ int nvmf_disconnect(const char *desc, int argc, char **argv)
}
ret = nvme_scan_topology(r, NULL, NULL);
if (ret < 0) {
- fprintf(stderr, "Failed to scan topology: %s\n",
- nvme_strerror(errno));
+ if (errno != ENOENT)
+ fprintf(stderr, "Failed to scan topology: %s\n",
+ nvme_strerror(errno));
nvme_free_tree(r);
return ret;
}
@@ -1170,7 +1185,9 @@ int nvmf_disconnect_all(const char *desc, int argc, char **argv)
if (ret)
return ret;
- r = nvme_create_root(stderr, map_log_level(cfg.verbose, false));
+ log_level = map_log_level(cfg.verbose, false);
+
+ r = nvme_create_root(stderr, log_level);
if (!r) {
fprintf(stderr, "Failed to create topology root: %s\n",
nvme_strerror(errno));
@@ -1178,8 +1195,9 @@ int nvmf_disconnect_all(const char *desc, int argc, char **argv)
}
ret = nvme_scan_topology(r, NULL, NULL);
if (ret < 0) {
- fprintf(stderr, "Failed to scan topology: %s\n",
- nvme_strerror(errno));
+ if (errno != ENOENT)
+ fprintf(stderr, "Failed to scan topology: %s\n",
+ nvme_strerror(errno));
nvme_free_tree(r);
return ret;
}
@@ -1238,7 +1256,9 @@ int nvmf_config(const char *desc, int argc, char **argv)
if (!strcmp(config_file, "none"))
config_file = NULL;
- r = nvme_create_root(stderr, map_log_level(verbose, quiet));
+ log_level = map_log_level(verbose, quiet);
+
+ r = nvme_create_root(stderr, log_level);
if (!r) {
fprintf(stderr, "Failed to create topology root: %s\n",
nvme_strerror(errno));
@@ -1247,8 +1267,9 @@ int nvmf_config(const char *desc, int argc, char **argv)
if (scan_tree) {
ret = nvme_scan_topology(r, NULL, NULL);
if (ret < 0) {
- fprintf(stderr, "Failed to scan topology: %s\n",
- nvme_strerror(errno));
+ if (errno != ENOENT)
+ fprintf(stderr, "Failed to scan topology: %s\n",
+ nvme_strerror(errno));
nvme_free_tree(r);
return ret;
}
@@ -1390,7 +1411,9 @@ int nvmf_dim(const char *desc, int argc, char **argv)
return -EINVAL;
}
- r = nvme_create_root(stderr, map_log_level(cfg.verbose, false));
+ log_level = map_log_level(cfg.verbose, false);
+
+ r = nvme_create_root(stderr, log_level);
if (!r) {
fprintf(stderr, "Failed to create topology root: %s\n",
nvme_strerror(errno));
@@ -1398,8 +1421,9 @@ int nvmf_dim(const char *desc, int argc, char **argv)
}
ret = nvme_scan_topology(r, NULL, NULL);
if (ret < 0) {
- fprintf(stderr, "Failed to scan topology: %s\n",
- nvme_strerror(errno));
+ if (errno != ENOENT)
+ fprintf(stderr, "Failed to scan topology: %s\n",
+ nvme_strerror(errno));
nvme_free_tree(r);
return ret;
}