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 \
-Subproject commit e806afa1c2ce05708d496824a7d3b5716f0043f5
+Subproject commit 5a0b27adc70c92ee2c37b09b006d1e4098278e59
.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;
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;
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;
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()
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
}
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",
#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);
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 */
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;
}
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)
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)
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)
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);
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);
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)
};
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",
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");
* 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");*/
}
/* 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) {
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;
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);
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;
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;
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;
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;
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;
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;
};
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)
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__,
}
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);
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);
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);
}
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;
}
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)
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);