diff --git a/nvme.c b/nvme.c index 4a65c4b7c7..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; } @@ -3269,7 +3282,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; @@ -3279,9 +3292,9 @@ 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) - goto ret; + return err; devname = NULL; if (optind < argc) @@ -3303,8 +3316,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 +3324,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,27 +3333,24 @@ 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); - err = argconfig_parse(argc, argv, desc, opts); + err = parse_args(argc, argv, desc, opts); if (err < 0) return err; @@ -3364,12 +3372,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; } @@ -6128,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; @@ -7783,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); @@ -8975,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; @@ -9089,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; @@ -9208,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) { @@ -9326,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; @@ -9508,7 +9514,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 +9566,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/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 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