From 6b4b67414cd4960272b7f90bee335ed73b60aa69 Mon Sep 17 00:00:00 2001 From: Keith Busch Date: Wed, 3 Jun 2020 10:29:51 -0700 Subject: [PATCH] zns Signed-off-by: Keith Busch --- Makefile | 1 + libnvme | 2 +- nvme.c | 13 +++++++++---- nvme.h | 3 +++ plugins/dera/dera-nvme.c | 2 +- plugins/intel/intel-nvme.c | 8 ++++---- plugins/lnvm/lnvm-nvme.c | 2 +- plugins/memblaze/memblaze-nvme.c | 2 +- plugins/seagate/seagate-nvme.c | 24 ++++++++++++------------ plugins/shannon/shannon-nvme.c | 2 +- plugins/toshiba/toshiba-nvme.c | 2 +- plugins/wdc/wdc-nvme.c | 8 ++++---- util/user-types.c | 16 +++++++++++++++- util/user-types.h | 4 ++++ 14 files changed, 58 insertions(+), 31 deletions(-) diff --git a/Makefile b/Makefile index 52f01ce..0583fec 100644 --- a/Makefile +++ b/Makefile @@ -66,6 +66,7 @@ OBJS := models.o plugin.o UTIL_OBJS := util/argconfig.o util/suffix.o util/json.o util/parser.o util/user-types.o PLUGIN_OBJS := \ + plugins/zns/zns.o \ plugins/intel/intel-nvme.o \ plugins/lnvm/lnvm-nvme.o \ plugins/memblaze/memblaze-nvme.o \ diff --git a/libnvme b/libnvme index e806afa..5a0b27a 160000 --- a/libnvme +++ b/libnvme @@ -1 +1 @@ -Subproject commit e806afa1c2ce05708d496824a7d3b5716f0043f5 +Subproject commit 5a0b27adc70c92ee2c37b09b006d1e4098278e59 diff --git a/nvme.c b/nvme.c index 7fc4309..2eba494 100644 --- a/nvme.c +++ b/nvme.c @@ -64,7 +64,7 @@ static struct program nvme = { .extensions = &builtin, }; -static const char *output_format = "Output format: normal|json|binary"; +const char *output_format = "Output format: normal|json|binary"; /* Name of file to output log pages in their raw format */ static char *raw; @@ -230,7 +230,7 @@ void nvme_show_status(const char *prefix, int status) nvme_status_to_string(status, false), status); } -static void nvme_print_object(struct json_object *j) +void nvme_print_object(struct json_object *j) { const unsigned long jflags = JSON_C_TO_STRING_SPACED|JSON_C_TO_STRING_PRETTY; @@ -637,6 +637,7 @@ static int get_effects_log(int argc, char **argv, struct command *cmd, struct pl const char *desc = "Retrieve command effects log page and print the table."; const char *raw = "show log in binary format"; const char *human_readable = "show log in readable format"; + const char *csi = "command set indicator"; struct nvme_cmd_effects_log log; int err, fd; @@ -645,15 +646,18 @@ static int get_effects_log(int argc, char **argv, struct command *cmd, struct pl struct config { int raw_binary; int human_readable; + int csi; char *output_format; }; struct config cfg = { + .csi = NVME_CSI_NVM, .output_format = "normal", }; OPT_ARGS(opts) = { OPT_FMT("output-format", 'o', &cfg.output_format, output_format), + OPT_INT("csi", 'c', &cfg.csi, csi), OPT_FLAG("human-readable",'H', &cfg.human_readable, human_readable), OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), OPT_END() @@ -671,7 +675,7 @@ static int get_effects_log(int argc, char **argv, struct command *cmd, struct pl if (cfg.human_readable) flags |= VERBOSE; - err = nvme_get_log_cmd_effects(fd, &log); + err = nvme_get_log_cmd_effects(fd, cfg.csi, &log); if (!err) nvme_show_effects_log(&log, flags); else @@ -926,7 +930,8 @@ static int get_log(int argc, char **argv, struct command *cmd, struct plugin *pl } err = nvme_get_log(fd, cfg.log_id, cfg.namespace_id, cfg.lpo, cfg.lsp, - 0, cfg.rae, cfg.uuid_index, cfg.log_len, log); + 0, cfg.rae, cfg.uuid_index, NVME_CSI_NVM, + cfg.log_len, log); if (!err) { if (!cfg.raw_binary) { printf("Device:%s log-id:%d namespace-id:%#x\n", diff --git a/nvme.h b/nvme.h index 469e92f..535535f 100644 --- a/nvme.h +++ b/nvme.h @@ -30,6 +30,8 @@ #define BINARY NVME_JSON_BINARY #define VERBOSE (NVME_JSON_DECODE_COMPLEX|NVME_JSON_HUMAN) +extern const char *output_format; + void register_extension(struct plugin *plugin); int parse_and_open(int argc, char **argv, const char *desc, const struct argconfig_commandline_options *clo); @@ -40,5 +42,6 @@ void nvme_show_status(const char *prefix, int status); int validate_output_format(char *format); int __id_ctrl(int argc, char **argv, struct command *cmd, struct plugin *plugin, void (*vs)(__u8 *vs, struct json_object *root)); +void nvme_print_object(struct json_object *j); #endif /* _NVME_H */ diff --git a/plugins/dera/dera-nvme.c b/plugins/dera/dera-nvme.c index 76e668b..b2c9b93 100644 --- a/plugins/dera/dera-nvme.c +++ b/plugins/dera/dera-nvme.c @@ -129,7 +129,7 @@ static int get_status(int argc, char **argv, struct command *cmd, struct plugin if (fd < 0) return fd; - err = nvme_get_log(fd, 0xc0, 0xffffffff, 0, 0, 0, false, 0, sizeof(log), &log); + err = nvme_get_log(fd, 0xc0, 0xffffffff, 0, 0, 0, false, 0, 0, sizeof(log), &log); if (err) { goto exit; } diff --git a/plugins/intel/intel-nvme.c b/plugins/intel/intel-nvme.c index 3e716eb..b626382 100644 --- a/plugins/intel/intel-nvme.c +++ b/plugins/intel/intel-nvme.c @@ -303,7 +303,7 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd, if (fd < 0) return fd; - err = nvme_get_log(fd, 0xca, cfg.namespace_id, 0, 0, 0, false, 0, + err = nvme_get_log(fd, 0xca, cfg.namespace_id, 0, 0, 0, false, 0, 0, sizeof(smart_log), &smart_log); if (!err) { if (cfg.json) @@ -343,7 +343,7 @@ static int get_market_log(int argc, char **argv, struct command *cmd, struct plu if (fd < 0) return fd; - err = nvme_get_log(fd, 0xdd, NVME_NSID_ALL, 0, 0, 0, false, 0, + err = nvme_get_log(fd, 0xdd, NVME_NSID_ALL, 0, 0, 0, false, 0, 0, sizeof(log), log); if (!err) { if (!cfg.raw_binary) @@ -405,7 +405,7 @@ static int get_temp_stats_log(int argc, char **argv, struct command *cmd, struct if (fd < 0) return fd; - err = nvme_get_log(fd, 0xc5, NVME_NSID_ALL, 0, 0, 0, false, 0, + err = nvme_get_log(fd, 0xc5, NVME_NSID_ALL, 0, 0, 0, false, 0, 0, sizeof(stats), &stats); if (!err) { if (!cfg.raw_binary) @@ -827,7 +827,7 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct flags = NVME_JSON_BINARY; err = nvme_get_log(fd, cfg.write ? 0xc2 : 0xc1, NVME_NSID_ALL, 0, 0, 0, - false, 0, sizeof(stats), &stats); + false, 0, 0, sizeof(stats), &stats); if (!err) { if (flags & NVME_JSON_HUMAN) show_lat_stats(&stats, cfg.write); diff --git a/plugins/lnvm/lnvm-nvme.c b/plugins/lnvm/lnvm-nvme.c index d76362a..0190f0b 100644 --- a/plugins/lnvm/lnvm-nvme.c +++ b/plugins/lnvm/lnvm-nvme.c @@ -794,7 +794,7 @@ int lnvm_do_chunk_log(int fd, __u32 nsid, __u32 data_len, void *data, int err; err = nvme_get_log(fd, NVM_LID_CHUNK_INFO, nsid, 0, 0, 0, - false, 0, data_len, data); + false, 0, 0, data_len, data); if (err > 0) { fprintf(stderr, "NVMe Status:%s(%x) NSID:%d\n", nvme_status_to_string(err, false), err, nsid); diff --git a/plugins/memblaze/memblaze-nvme.c b/plugins/memblaze/memblaze-nvme.c index 3474523..d715ebe 100644 --- a/plugins/memblaze/memblaze-nvme.c +++ b/plugins/memblaze/memblaze-nvme.c @@ -561,7 +561,7 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd, if (fd < 0) return fd; - err = nvme_get_log(fd, 0xca, cfg.namespace_id, 0, 0, 0, false, 0, + err = nvme_get_log(fd, 0xca, cfg.namespace_id, 0, 0, 0, false, 0, 0, sizeof(smart_log), &smart_log); if (!err) { if (!cfg.raw_binary) diff --git a/plugins/seagate/seagate-nvme.c b/plugins/seagate/seagate-nvme.c index c464937..2babe19 100644 --- a/plugins/seagate/seagate-nvme.c +++ b/plugins/seagate/seagate-nvme.c @@ -174,7 +174,7 @@ static int log_pages_supp(int argc, char **argv, struct command *cmd, }; fd = parse_and_open(argc, argv, desc, opts); - err = nvme_get_log(fd, 0xc5, 1, 0, 0, 0, false, 0, sizeof(logPageMap), &logPageMap); + err = nvme_get_log(fd, 0xc5, 1, 0, 0, 0, false, 0, 0, sizeof(logPageMap), &logPageMap); if (!err) { if (strcmp(cfg.output_format,"json")) { printf ("Seagate Supported Log-pages count :%d\n", @@ -738,7 +738,7 @@ static int vs_smart_log(int argc, char **argv, struct command *cmd, struct plugi if (strcmp(cfg.output_format,"json")) printf("Seagate Extended SMART Information :\n"); - err = nvme_get_log(fd, 0xC4, 1, 0, 0, 0, false, 0, sizeof(ExtdSMARTInfo), &ExtdSMARTInfo); + err = nvme_get_log(fd, 0xC4, 1, 0, 0, 0, false, 0, 0, sizeof(ExtdSMARTInfo), &ExtdSMARTInfo); if (!err) { if (strcmp(cfg.output_format,"json")) { printf("%-39s %-15s %-19s \n", "Description", "Ext-Smart-Id", "Ext-Smart-Value"); @@ -760,7 +760,7 @@ static int vs_smart_log(int argc, char **argv, struct command *cmd, struct plugi * Next get Log Page 0xCF */ - err = nvme_get_log(fd, 0xCF, 1, 0, 0, 0, false, 0, sizeof(logPageCF), &logPageCF); + err = nvme_get_log(fd, 0xCF, 1, 0, 0, 0, false, 0, 0, sizeof(logPageCF), &logPageCF); if (!err) { if(strcmp(cfg.output_format,"json")) { /*printf("Seagate DRAM Supercap SMART Attributes :\n");*/ @@ -857,7 +857,7 @@ static int temp_stats(int argc, char **argv, struct command *cmd, struct plugin } /* STEP-2 : Get Max temperature form Ext SMART-id 194 */ - err = nvme_get_log(fd, 0xC4, 1, 0, 0, 0, false, 0, sizeof(ExtdSMARTInfo), &ExtdSMARTInfo); + err = nvme_get_log(fd, 0xC4, 1, 0, 0, 0, false, 0, 0, sizeof(ExtdSMARTInfo), &ExtdSMARTInfo); if (!err) { for(index = 0; index < NUMBER_EXTENDED_SMART_ATTRIBUTES; index++) { if (ExtdSMARTInfo.vendorData[index].AttributeNumber == VS_ATTR_ID_MAX_LIFE_TEMPERATURE) { @@ -879,7 +879,7 @@ static int temp_stats(int argc, char **argv, struct command *cmd, struct plugin fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(err, false), err); - cf_err = nvme_get_log(fd, 0xCF, 1, 0, 0, 0, false, 0, sizeof(ExtdSMARTInfo), &logPageCF); + cf_err = nvme_get_log(fd, 0xCF, 1, 0, 0, 0, false, 0, 0, sizeof(ExtdSMARTInfo), &logPageCF); if(!cf_err) { scCurrentTemp = logPageCF.AttrCF.SuperCapCurrentTemperature; @@ -1008,7 +1008,7 @@ static int vs_pcie_error_log(int argc, char **argv, struct command *cmd, struct if(strcmp(cfg.output_format,"json")) printf("Seagate PCIe error counters Information :\n"); - err = nvme_get_log(fd, 0xCB, 1, 0, 0, 0, false, 0, sizeof(pcieErrorLog), &pcieErrorLog); + err = nvme_get_log(fd, 0xCB, 1, 0, 0, 0, false, 0, 0, sizeof(pcieErrorLog), &pcieErrorLog); if (!err) { if(strcmp(cfg.output_format,"json")) { print_vs_pcie_error_log(pcieErrorLog); @@ -1094,7 +1094,7 @@ static int get_host_tele(int argc, char **argv, struct command *cmd, struct plug dump_fd = STDOUT_FILENO; cfg.log_id = (cfg.log_id << 8) | 0x07; err = nvme_get_log(fd, cfg.log_id, cfg.namespace_id, - NVME_LOG_LSP_NONE, offset, 0, false, 0, + NVME_LOG_LSP_NONE, offset, 0, false, 0, 0, sizeof(tele_log), (void *)(&tele_log)); if (!err) { maxBlk = tele_log.tele_data_area3; @@ -1134,7 +1134,7 @@ static int get_host_tele(int argc, char **argv, struct command *cmd, struct plug memset(log, 0, blksToGet * 512); err = nvme_get_log(fd, cfg.log_id, cfg.namespace_id, - NVME_LOG_LSP_NONE, offset, 0, false, 0, + NVME_LOG_LSP_NONE, offset, 0, false, 0, 0, blksToGet * 512, (void *)log); if (!err) { offset += blksToGet * 512; @@ -1195,7 +1195,7 @@ static int get_ctrl_tele(int argc, char **argv, struct command *cmd, struct plug log_id = 0x08; err = nvme_get_log(fd, log_id, cfg.namespace_id, - NVME_LOG_LSP_NONE, offset, 0, false, 0, + NVME_LOG_LSP_NONE, offset, 0, false, 0, 0, sizeof(tele_log), (void *)(&tele_log)); if (!err) { maxBlk = tele_log.tele_data_area3; @@ -1234,7 +1234,7 @@ static int get_ctrl_tele(int argc, char **argv, struct command *cmd, struct plug memset(log, 0, blksToGet * 512); err = nvme_get_log(fd, log_id, cfg.namespace_id, - NVME_LOG_LSP_NONE, offset, 0, false, 0, + NVME_LOG_LSP_NONE, offset, 0, false, 0, 0, blksToGet * 512, (void *)log); if (!err) { offset += blksToGet * 512; @@ -1320,7 +1320,7 @@ static int vs_internal_log(int argc, char **argv, struct command *cmd, struct pl log_id = 0x08; err = nvme_get_log(fd, log_id, cfg.namespace_id, - NVME_LOG_LSP_NONE, offset, 0, false, 0, + NVME_LOG_LSP_NONE, offset, 0, false, 0, 0, sizeof(tele_log), (void *)(&tele_log)); if (!err) { maxBlk = tele_log.tele_data_area3; @@ -1356,7 +1356,7 @@ static int vs_internal_log(int argc, char **argv, struct command *cmd, struct pl memset(log, 0, blksToGet * 512); err = nvme_get_log(fd, log_id, cfg.namespace_id, - NVME_LOG_LSP_NONE, offset, 0, false, 0, + NVME_LOG_LSP_NONE, offset, 0, false, 0, 0, blksToGet * 512, (void *)log); if (!err) { offset += blksToGet * 512; diff --git a/plugins/shannon/shannon-nvme.c b/plugins/shannon/shannon-nvme.c index 24d53cc..457ef84 100644 --- a/plugins/shannon/shannon-nvme.c +++ b/plugins/shannon/shannon-nvme.c @@ -137,7 +137,7 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd, }; fd = parse_and_open(argc, argv, desc, opts); - err = nvme_get_log(fd, 0xca, cfg.namespace_id, 0, 0, 0, false, 0, + err = nvme_get_log(fd, 0xca, cfg.namespace_id, 0, 0, 0, false, 0, 0, sizeof(smart_log), &smart_log); if (!err) { if (!cfg.raw_binary) diff --git a/plugins/toshiba/toshiba-nvme.c b/plugins/toshiba/toshiba-nvme.c index 5114c25..706d582 100644 --- a/plugins/toshiba/toshiba-nvme.c +++ b/plugins/toshiba/toshiba-nvme.c @@ -389,7 +389,7 @@ static int nvme_get_vendor_log(int fd, __u32 namespace_id, int log_page, if (err) { goto end; } - err = nvme_get_log(fd, log_page, namespace_id, 0, 0, 0, false, 0, + err = nvme_get_log(fd, log_page, namespace_id, 0, 0, 0, false, 0, 0, log_len, log); if (err) { fprintf(stderr, "%s: couldn't get log 0x%x\n", __func__, diff --git a/plugins/wdc/wdc-nvme.c b/plugins/wdc/wdc-nvme.c index 34a2c44..9650dae 100644 --- a/plugins/wdc/wdc-nvme.c +++ b/plugins/wdc/wdc-nvme.c @@ -1060,7 +1060,7 @@ static bool get_dev_mgment_cbs_data(int fd, __u8 log_id, void **cbs_data) } ret = nvme_get_log(fd, 0xFFFFFFFF, WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_OPCODE, 0, 0, 0, - false, 0, le32_to_cpu(hdr_ptr->length), data); + false, 0, 0, le32_to_cpu(hdr_ptr->length), data); /* parse the data until the List of log page ID's is found */ if (ret) { fprintf(stderr, "ERROR : WDC : Unable to read C2 Log Page data, ret = 0x%x\n", ret); @@ -3963,7 +3963,7 @@ static int wdc_get_fw_act_history(int fd, char *format) memset(data, 0, sizeof (__u8) * WDC_FW_ACT_HISTORY_LOG_BUF_LEN); ret = nvme_get_log(fd, WDC_NVME_GET_FW_ACT_HISTORY_LOG_ID, 0xFFFFFFFF, 0, 0, 0, - false, 0, WDC_FW_ACT_HISTORY_LOG_BUF_LEN, data); + false, 0, 0, WDC_FW_ACT_HISTORY_LOG_BUF_LEN, data); if (strcmp(format, "json")) fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret, false), ret); @@ -4725,7 +4725,7 @@ static int wdc_do_drive_essentials(int fd, char *dir, char *key) memset(dataBuffer, 0, dataBufferSize); ret = nvme_get_log(fd, deVULogPagesList[vuLogIdx].logPageId, WDC_DE_GLOBAL_NSID, 0, 0, 0, - false, 0, dataBufferSize, dataBuffer); + false, 0, 0, dataBufferSize, dataBuffer); if (ret) { fprintf(stderr, "ERROR : WDC : nvme_get_log() for log page 0x%x failed, ret = %d\n", deVULogPagesList[vuLogIdx].logPageId, ret); @@ -5461,7 +5461,7 @@ static int wdc_do_vs_nand_stats(int fd, char *format) } ret = nvme_get_log(fd, WDC_NVME_NAND_STATS_LOG_ID, 0xFFFFFFFF, 0, 0, 0, - false, 0, WDC_NVME_NAND_STATS_SIZE, (void*)output); + false, 0, 0, WDC_NVME_NAND_STATS_SIZE, (void*)output); if (ret) { fprintf(stderr, "ERROR : WDC : %s : Failed to retreive NAND stats\n", __func__); goto out; diff --git a/util/user-types.c b/util/user-types.c index c847a95..5f70879 100644 --- a/util/user-types.c +++ b/util/user-types.c @@ -4219,7 +4219,21 @@ struct json_object *nvme_resv_report_to_json( } json_object_object_add(jrs, "nsids", jrcs); - return NULL; + return jrs; +} + +struct json_object *nvme_zns_id_ctrl_to_json( + struct nvme_zns_id_ctrl *ctrl, unsigned long flags) +{ + struct json_object *jctrl; + + if (flags & NVME_JSON_BINARY) + return nvme_json_new_str_len_flags(ctrl, sizeof(*ctrl), flags); + + jctrl = nvme_json_new_object(flags); + nvme_json_add_int(jctrl, "zamds", ctrl->zamds); + + return jctrl; } static void nvme_show_ns_details(nvme_ns_t n) diff --git a/util/user-types.h b/util/user-types.h index 3f53a5c..0202d78 100644 --- a/util/user-types.h +++ b/util/user-types.h @@ -134,6 +134,10 @@ struct json_object *nvme_resv_report_to_json( struct nvme_resv_status *status, bool ext, unsigned long flags); +struct json_object *nvme_zns_id_ctrl_to_json( + struct nvme_zns_id_ctrl *ctrl, + unsigned long flags); + struct json_object *nvme_json_new_str_len(const char *v, int len); struct json_object *nvme_json_new_str_len_flags(const void *v, int len, unsigned long flags); -- 2.50.1