return 0;
}
-static int discover_from_conf_file(nvme_host_t h, const char *desc,
- bool connect, const struct nvme_fabrics_config *defcfg)
+static int discover_from_conf_file(nvme_root_t r, nvme_host_t h,
+ const char *desc, bool connect,
+ const struct nvme_fabrics_config *defcfg)
{
char *transport = NULL, *traddr = NULL, *trsvcid = NULL;
char *hostnqn = NULL, *hostid = NULL, *hostkey = NULL, *ctrlkey = NULL;
if (!transport && !traddr)
goto next;
- c = nvme_create_ctrl(subsysnqn, transport, traddr,
+ c = nvme_create_ctrl(r, subsysnqn, transport, traddr,
cfg.host_traddr, cfg.host_iface, trsvcid);
if (!c)
goto next;
if (ret < 0)
return ret;
- switch (verbose) {
- case 0:
- nvme_log_level = LOG_WARNING;
- break;
- case 1:
- nvme_log_level = LOG_NOTICE;
- break;
- case 2:
- nvme_log_level = LOG_INFO;
- break;
- default:
- nvme_log_level = LOG_DEBUG;
- break;
- }
- if (quiet)
- nvme_log_level = LOG_ERR;
-
if (!strcmp(config_file, "none"))
config_file = NULL;
- r = nvme_scan(config_file);
+ r = nvme_create_root(stderr, map_log_level(verbose, quiet));
+ if (!r) {
+ fprintf(stderr, "Failed to create topology root: %s\n",
+ nvme_strerror(errno));
+ return -errno;
+ }
+ ret = nvme_scan_topology(r, NULL);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to scan topoplogy: %s\n",
+ nvme_strerror(errno));
+ return ret;
+ }
+
if (persistent && !cfg.keep_alive_tmo)
cfg.keep_alive_tmo = 30;
if (!hostnqn)
nvme_host_set_dhchap_key(h, hostkey);
if (!device && !transport && !traddr) {
- ret = discover_from_conf_file(h, desc, connect, &cfg);
+ ret = discover_from_conf_file(r, h, desc, connect, &cfg);
goto out_free;
}
}
if (!c) {
/* No device or non-matching device, create a new controller */
- c = nvme_create_ctrl(subsysnqn, transport, traddr,
+ c = nvme_create_ctrl(r, subsysnqn, transport, traddr,
cfg.host_traddr, cfg.host_iface, trsvcid);
if (!c) {
ret = errno;
else
return EINVAL;
- switch (verbose) {
- case 0:
- nvme_log_level = LOG_WARNING;
- break;
- case 1:
- nvme_log_level = LOG_NOTICE;
- break;
- case 2:
- nvme_log_level = LOG_INFO;
- break;
- default:
- nvme_log_level = LOG_DEBUG;
- break;
- }
-
if (!subsysnqn) {
fprintf(stderr,
"required argument [--nqn | -n] not specified\n");
if (!strcmp(config_file, "none"))
config_file = NULL;
- r = nvme_scan(config_file);
+ r = nvme_create_root(stderr, map_log_level(verbose, quiet));
+ if (!r) {
+ fprintf(stderr, "Failed to create topology root: %s\n",
+ nvme_strerror(errno));
+ return -errno;
+ }
+ ret = nvme_scan_topology(r, NULL);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to scan topoplogy: %s\n",
+ nvme_strerror(errno));
+ return ret;
+ }
+ nvme_read_config(r, config_file);
+
if (!hostnqn)
hostnqn = hnqn = nvmf_hostnqn_from_file();
if (!hostid)
}
if (hostkey)
nvme_host_set_dhchap_key(h, hostkey);
- c = nvme_create_ctrl(subsysnqn, transport, traddr,
+ c = nvme_create_ctrl(r, subsysnqn, transport, traddr,
cfg.host_traddr, cfg.host_iface, trsvcid);
if (!c) {
errno = ENOMEM;
if (ret)
return ret;
- switch (cfg.verbose) {
- case 0:
- nvme_log_level = LOG_WARNING;
- break;
- case 1:
- nvme_log_level = LOG_NOTICE;
- break;
- case 2:
- nvme_log_level = LOG_INFO;
- break;
- default:
- nvme_log_level = LOG_DEBUG;
- break;
- }
-
if (!cfg.nqn && !cfg.device) {
fprintf(stderr,
"Neither device name [--device | -d] nor NQN [--nqn | -n] provided\n");
return EINVAL;
}
- r = nvme_scan(NULL);
+
+ r = nvme_create_root(stderr, map_log_level(cfg.verbose, false));
+ if (!r) {
+ fprintf(stderr, "Failed to create topology root: %s\n",
+ nvme_strerror(errno));
+ return -errno;
+ }
+ ret = nvme_scan_topology(r, NULL);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to scan topoplogy: %s\n",
+ nvme_strerror(errno));
+ return ret;
+ }
+
if (cfg.nqn) {
int i = 0;
char *n = cfg.nqn;
if (ret)
return ret;
- switch (cfg.verbose) {
- case 0:
- nvme_log_level = LOG_WARNING;
- break;
- case 1:
- nvme_log_level = LOG_NOTICE;
- break;
- case 2:
- nvme_log_level = LOG_INFO;
- break;
- default:
- nvme_log_level = LOG_DEBUG;
- break;
- }
-
- r = nvme_scan(NULL);
+ r = nvme_create_root(stderr, map_log_level(cfg.verbose, false));
if (!r) {
- fprintf(stderr, "Failed to scan nvme subsystem: %s\n",
+ fprintf(stderr, "Failed to create topology root: %s\n",
+ nvme_strerror(errno));
+ return -errno;
+ }
+ ret = nvme_scan_topology(r, NULL);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to scan topoplogy: %s\n",
nvme_strerror(errno));
- return errno;
+ return ret;
}
nvme_for_each_host(r, h) {
return strerror(errnum);
}
+int map_log_level(int verbose, bool quiet)
+{
+ int log_level;
+
+ switch (verbose) {
+ case 0:
+ log_level = LOG_WARNING;
+ break;
+ case 1:
+ log_level = LOG_NOTICE;
+ break;
+ case 2:
+ log_level = LOG_INFO;
+ break;
+ default:
+ log_level = LOG_DEBUG;
+ break;
+ }
+ if (quiet)
+ log_level = LOG_ERR;
+
+ return log_level;
+}
+
static ssize_t getrandom_bytes(void *buf, size_t buflen)
{
#if HAVE_SYS_RANDOM
enum nvme_print_flags flags;
const char *desc = "Retrieve information for subsystems";
const char *verbose = "Increase output verbosity";
+ nvme_scan_filter_t filter = NULL;
int err;
struct config {
if (cfg.verbose)
flags |= VERBOSE;
- if (devicename)
- r = nvme_scan_filter(nvme_match_device_filter);
- else
- r = nvme_scan(NULL);
-
- if (r) {
- nvme_show_subsystem_list(r, flags);
- nvme_free_tree(r);
- } else {
+ r = nvme_create_root(stderr, map_log_level(cfg.verbose, false));
+ if (!r) {
if (devicename)
- fprintf(stderr, "Failed to scan nvme subsystem for %s\n", devicename);
+ fprintf(stderr,
+ "Failed to scan nvme subsystem for %s\n",
+ devicename);
else
fprintf(stderr, "Failed to scan nvme subsystem\n");
err = -errno;
+ goto ret;
}
+
+ if (devicename)
+ filter = nvme_match_device_filter;
+
+ err = nvme_scan_topology(r, filter);
+ if (err) {
+ fprintf(stderr, "Failed to scan topology: %s\n",
+ nvme_strerror(errno));
+ goto ret;
+ }
+
+ nvme_show_subsystem_list(r, flags);
+ nvme_free_tree(r);
+
ret:
return err;
}
if (cfg.verbose)
flags |= VERBOSE;
- r = nvme_scan(NULL);
- if (r) {
- nvme_show_list_items(r, flags);
- nvme_free_tree(r);
- } else {
- fprintf(stderr, "Failed to scan nvme subsystems\n");
- err = -errno;
+ r = nvme_create_root(stderr, map_log_level(cfg.verbose, false));
+ if (!r) {
+ fprintf(stderr, "Failed to create topology root: %s\n",
+ nvme_strerror(errno));
+ return -errno;
}
+ err = nvme_scan_topology(r, NULL);
+ if (err < 0) {
+ fprintf(stderr, "Failed to scan topoplogy: %s\n",
+ nvme_strerror(errno));
+ return err;
+ }
+
+ nvme_show_list_items(r, flags);
+ nvme_free_tree(r);
return err;
}