]> www.infradead.org Git - users/hch/nvme-cli.git/commitdiff
zns
authorKeith Busch <kbusch@kernel.org>
Wed, 3 Jun 2020 17:29:51 +0000 (10:29 -0700)
committerKeith Busch <kbusch@kernel.org>
Wed, 3 Jun 2020 17:29:51 +0000 (10:29 -0700)
Signed-off-by: Keith Busch <kbusch@kernel.org>
14 files changed:
Makefile
libnvme
nvme.c
nvme.h
plugins/dera/dera-nvme.c
plugins/intel/intel-nvme.c
plugins/lnvm/lnvm-nvme.c
plugins/memblaze/memblaze-nvme.c
plugins/seagate/seagate-nvme.c
plugins/shannon/shannon-nvme.c
plugins/toshiba/toshiba-nvme.c
plugins/wdc/wdc-nvme.c
util/user-types.c
util/user-types.h

index 52f01ceadffb7414dc6c52f37f83e208ea1eb73e..0583fecef8da094f94dffeb3d1d419291a391467 100644 (file)
--- 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 e806afa1c2ce05708d496824a7d3b5716f0043f5..5a0b27adc70c92ee2c37b09b006d1e4098278e59 160000 (submodule)
--- a/libnvme
+++ b/libnvme
@@ -1 +1 @@
-Subproject commit e806afa1c2ce05708d496824a7d3b5716f0043f5
+Subproject commit 5a0b27adc70c92ee2c37b09b006d1e4098278e59
diff --git a/nvme.c b/nvme.c
index 7fc43094921e9e7e094269db08cf73736a96c0df..2eba49445fd8204a6a087645df0f297126560ad1 100644 (file)
--- 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 469e92fb9c062f93ae775111abcaf66adc6a2c2f..535535fc25b89eb3a2d6811d92f558bc4efbec82 100644 (file)
--- 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 */
index 76e668b29910a3051944d6f895a6f8f8ce3ef341..b2c9b933a95be4c756ccd6ba1b7403b5c70c9958 100644 (file)
@@ -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;
        }
index 3e716eb3b31e7c4c6a98323ecb48e69f128ec42b..b6263823d69856790ac665a8148cbebe69371844 100644 (file)
@@ -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);
index d76362ad76ef575e9858d1e3d27b7a451779e38d..0190f0bda9de12de3d74108dbfd7b0ab14d4b492 100644 (file)
@@ -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);
index 347452390398b14eb43bab263b2ea6bc34e835a6..d715ebe2ecc61def58cb3c77a0a42f5a10163613 100644 (file)
@@ -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)
index c46493791c2d167716fece6673253411220715f5..2babe190df707ee314329c0d2b23baabe7d78ba2 100644 (file)
@@ -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;
index 24d53cccaf9e29d28035789792ffd8ab4eca1fea..457ef846f78feb19344d7cde61e4ef85a7c07709 100644 (file)
@@ -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)
index 5114c251f4c4b0e44677dbfcbef357d79b2e5c3d..706d582ab1823a4f7798a6da7c55acdfef70fd3b 100644 (file)
@@ -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__,
index 34a2c4425e3b8b43fb268a33c7bdfa76134c8a3e..9650dae5d30d26e29e69ca9b9eba7dccf0cd1984 100644 (file)
@@ -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;
index c847a952bbb0d16d34df93d45e921398829a6368..5f708798f78e4e33291a2c5b256a0b23a64b06d9 100644 (file)
@@ -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)
index 3f53a5c7624bd07277309f27b9e8ca48b3b6c135..0202d78ee0c82d03c0e28c7a78e32204f3b1aeab 100644 (file)
@@ -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);