From 56e10e681fd6e7f5c08d3393562df5c19981d645 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 10 May 2024 09:16:18 +0200 Subject: [PATCH 1/3] build: bump libnvme wrap Import nvme_init_default_logging. Signed-off-by: Daniel Wagner --- subprojects/libnvme.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libnvme.wrap b/subprojects/libnvme.wrap index 271bc75a49..2046481307 100644 --- a/subprojects/libnvme.wrap +++ b/subprojects/libnvme.wrap @@ -1,6 +1,6 @@ [wrap-git] url = https://github.com/linux-nvme/libnvme.git -revision = 80c5cf2aa45f4afc7571dc48850fae3fd62828af +revision = bec7a98636546f68ff1efe6794b2d546cf63febc [provide] libnvme = libnvme_dep From 4f599d730f4bfd7d45d1f5e083fa641d9b1228cc Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Wed, 27 Mar 2024 17:08:10 +0100 Subject: [PATCH 2/3] nvme: use cleanup helper for nvme_root_t objects Use a cleanup helper for the nvme_root_t objects which simplifies the error paths and ensures we are always removing all the allocated resources. Signed-off-by: Daniel Wagner --- nvme.c | 24 ++++++++---------------- util/cleanup.h | 9 +++++++++ 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/nvme.c b/nvme.c index 4a65c4b7c7..968ced583a 100644 --- a/nvme.c +++ b/nvme.c @@ -3269,7 +3269,7 @@ static bool nvme_match_device_filter(nvme_subsystem_t s, static int list_subsys(int argc, char **argv, struct command *cmd, struct plugin *plugin) { - nvme_root_t r = NULL; + _cleanup_nvme_root_ nvme_root_t r = NULL; enum nvme_print_flags flags; const char *desc = "Retrieve information for subsystems"; nvme_scan_filter_t filter = NULL; @@ -3281,7 +3281,7 @@ static int list_subsys(int argc, char **argv, struct command *cmd, err = argconfig_parse(argc, argv, desc, opts); if (err < 0) - goto ret; + return err; devname = NULL; if (optind < argc) @@ -3303,8 +3303,7 @@ static int list_subsys(int argc, char **argv, struct command *cmd, nvme_show_error("Failed to scan nvme subsystem for %s", devname); else nvme_show_error("Failed to scan nvme subsystem"); - err = -errno; - goto ret; + return -errno; } if (devname) { @@ -3312,8 +3311,7 @@ static int list_subsys(int argc, char **argv, struct command *cmd, if (sscanf(devname, "nvme%dn%d", &subsys_num, &nsid) != 2) { nvme_show_error("Invalid device name %s", devname); - err = -EINVAL; - goto ret; + return -EINVAL; } filter = nvme_match_device_filter; } @@ -3322,22 +3320,19 @@ static int list_subsys(int argc, char **argv, struct command *cmd, if (err) { if (errno != ENOENT) nvme_show_error("Failed to scan topology: %s", nvme_strerror(errno)); - goto ret; + return -errno; } nvme_show_subsystem_list(r, nsid != NVME_NSID_ALL, flags); -ret: - if (r) - nvme_free_tree(r); - return err; + return 0; } static int list(int argc, char **argv, struct command *cmd, struct plugin *plugin) { const char *desc = "Retrieve basic information for all NVMe namespaces"; enum nvme_print_flags flags; - nvme_root_t r; + _cleanup_nvme_root_ nvme_root_t r = NULL; int err = 0; NVME_ARGS(opts); @@ -3364,12 +3359,10 @@ static int list(int argc, char **argv, struct command *cmd, struct plugin *plugi if (err < 0) { if (errno != ENOENT) nvme_show_error("Failed to scan topology: %s", nvme_strerror(errno)); - nvme_free_tree(r); return err; } nvme_show_list_items(r, flags); - nvme_free_tree(r); return err; } @@ -9508,7 +9501,7 @@ static int show_topology_cmd(int argc, char **argv, struct command *command, str const char *desc = "Show the topology\n"; const char *ranking = "Ranking order: namespace|ctrl"; enum nvme_print_flags flags; - nvme_root_t r; + _cleanup_nvme_root_ nvme_root_t r = NULL; enum nvme_cli_topo_ranking rank; int err; @@ -9560,7 +9553,6 @@ static int show_topology_cmd(int argc, char **argv, struct command *command, str } nvme_show_topology(r, rank, flags); - nvme_free_tree(r); return err; } diff --git a/util/cleanup.h b/util/cleanup.h index ee9b120606..c1e0394dc9 100644 --- a/util/cleanup.h +++ b/util/cleanup.h @@ -5,6 +5,8 @@ #include #include +#include + #include "util/mem.h" #define __cleanup__(fn) __attribute__((cleanup(fn))) @@ -34,4 +36,11 @@ static inline void close_file(int *f) } #define _cleanup_file_ __cleanup__(close_file) +static inline void cleanup_nvme_root(nvme_root_t *r) +{ + if (r) + nvme_free_tree(*r); +} +#define _cleanup_nvme_root_ __cleanup__(cleanup_nvme_root) + #endif From 0774603a5dffef36fedc89d7682768da25c19baa Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Wed, 27 Mar 2024 16:59:32 +0100 Subject: [PATCH 3/3] nvme: initialize default library logging The library will only print errors unless we initialize default logging. By doing so, all nvme commands are enabled to also print debug information. Signed-off-by: Daniel Wagner --- nvme.c | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/nvme.c b/nvme.c index 968ced583a..8c767b0682 100644 --- a/nvme.c +++ b/nvme.c @@ -432,21 +432,34 @@ static int get_dev(struct nvme_dev **dev, int argc, char **argv, int flags) return ret != 0 ? -errno : 0; } +static int parse_args(int argc, char *argv[], const char *desc, + struct argconfig_commandline_options *opts) +{ + int ret; + + ret = argconfig_parse(argc, argv, desc, opts); + if (ret) + return ret; + + log_level = map_log_level(verbose_level, false); + nvme_init_default_logging(stderr, log_level, false, false); + + return 0; +} + int parse_and_open(struct nvme_dev **dev, int argc, char **argv, const char *desc, struct argconfig_commandline_options *opts) { int ret; - ret = argconfig_parse(argc, argv, desc, opts); + ret = parse_args(argc, argv, desc, opts); if (ret) return ret; ret = get_dev(dev, argc, argv, O_RDONLY); if (ret < 0) argconfig_print_help(desc, opts); - else - log_level = map_log_level(verbose_level, false); return ret; } @@ -3279,7 +3292,7 @@ static int list_subsys(int argc, char **argv, struct command *cmd, NVME_ARGS(opts); - err = argconfig_parse(argc, argv, desc, opts); + err = parse_args(argc, argv, desc, opts); if (err < 0) return err; @@ -3337,7 +3350,7 @@ static int list(int argc, char **argv, struct command *cmd, struct plugin *plugi NVME_ARGS(opts); - err = argconfig_parse(argc, argv, desc, opts); + err = parse_args(argc, argv, desc, opts); if (err < 0) return err; @@ -6121,7 +6134,7 @@ static int format_cmd(int argc, char **argv, struct command *cmd, struct plugin OPT_FLAG("force", 0, &cfg.force, force), OPT_SUFFIX("block-size", 'b', &cfg.bs, bs)); - err = argconfig_parse(argc, argv, desc, opts); + err = parse_args(argc, argv, desc, opts); if (err) return err; @@ -7776,7 +7789,7 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char if (err) return err; } else { - err = argconfig_parse(argc, argv, desc, opts); + err = parse_args(argc, argv, desc, opts); if (err) return err; err = open_exclusive(&dev, argc, argv, cfg.force); @@ -8968,7 +8981,7 @@ static int gen_dhchap_key(int argc, char **argv, struct command *command, struct OPT_STR("nqn", 'n', &cfg.nqn, nqn), OPT_UINT("hmac", 'm', &cfg.hmac, hmac)); - err = argconfig_parse(argc, argv, desc, opts); + err = parse_args(argc, argv, desc, opts); if (err) return err; @@ -9082,7 +9095,7 @@ static int check_dhchap_key(int argc, char **argv, struct command *command, stru NVME_ARGS(opts, OPT_STR("key", 'k', &cfg.key, key)); - err = argconfig_parse(argc, argv, desc, opts); + err = parse_args(argc, argv, desc, opts); if (err) return err; @@ -9201,7 +9214,7 @@ static int gen_tls_key(int argc, char **argv, struct command *command, struct pl OPT_UINT("identity", 'I', &cfg.identity, identity), OPT_FLAG("insert", 'i', &cfg.insert, insert)); - err = argconfig_parse(argc, argv, desc, opts); + err = parse_args(argc, argv, desc, opts); if (err) return err; if (cfg.hmac < 1 || cfg.hmac > 2) { @@ -9319,7 +9332,7 @@ static int check_tls_key(int argc, char **argv, struct command *command, struct OPT_UINT("identity", 'I', &cfg.identity, identity), OPT_FLAG("insert", 'i', &cfg.insert, insert)); - err = argconfig_parse(argc, argv, desc, opts); + err = parse_args(argc, argv, desc, opts); if (err) return err;