'\" t
.\" Title: nvme-self-test-log
-.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
-.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\" Date: 10/20/2020
+.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author]
+.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
+.\" Date: 01/23/2021
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SELF\-TEST\-LO" "1" "10/20/2020" "NVMe" "NVMe Manual"
+.TH "NVME\-SELF\-TEST\-LO" "1" "01/23/2021" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.SH "SYNOPSIS"
.sp
.nf
-\fInvme self\-test\fR\-log <device> [\-\-output\-format=<FMT> | \-o <FMT>]
+\fInvme self\-test\fR\-log <device> [\-\-log\-entries=<entries> | \-e <entries>]
+ [\-\-output\-format=<FMT> | \-o <FMT>]
.fi
.SH "DESCRIPTION"
.sp
By default the log is printed out in the normal readable format\&.
.SH "OPTION"
.PP
+\-e <entries>, \-\-log\-entries=<entries>
+.RS 4
+Specifies how many DST log entries the program should request from the device\&. This must be at least one, and shouldn\(cqt exceed the 20 entries\&. Defaults to 20 DST log entries\&.
+.RE
+.PP
\-o <format>, \-\-output\-format=<format>
.RS 4
Set the reporting format to
+<?xml version="1.0" encoding="UTF-8"?>\r
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
<head>\r
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />\r
-<meta name="generator" content="AsciiDoc 8.6.8" />\r
+<meta name="generator" content="AsciiDoc 8.6.10" />\r
<title>nvme-self-test-log(1)</title>\r
<style type="text/css">\r
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */\r
padding: 0;\r
margin: 0;\r
}\r
-\r
+pre {\r
+ white-space: pre-wrap;\r
+}\r
\r
#author {\r
color: #527bbd;\r
}\r
\r
div.imageblock div.content { padding-left: 0; }\r
-span.image img { border-style: none; }\r
+span.image img { border-style: none; vertical-align: text-bottom; }\r
a.image:visited { color: white; }\r
\r
dl {\r
p.table {\r
margin-top: 0;\r
}\r
-/* Because the table frame attribute is overridden by CSS in most browsers. */\r
+/* Because the table frame attribute is overriden by CSS in most browsers. */\r
div.tableblock > table[frame="void"] {\r
border-style: none;\r
}\r
<h2 id="_synopsis">SYNOPSIS</h2>\r
<div class="sectionbody">\r
<div class="verseblock">\r
-<pre class="content"><em>nvme self-test</em>-log <device> [--output-format=<FMT> | -o <FMT>]</pre>\r
+<pre class="content"><em>nvme self-test</em>-log <device> [--log-entries=<entries> | -e <entries>]\r
+ [--output-format=<FMT> | -o <FMT>]</pre>\r
<div class="attribution">\r
</div></div>\r
</div>\r
<div class="sectionbody">\r
<div class="dlist"><dl>\r
<dt class="hdlist1">\r
+-e <entries>\r
+</dt>\r
+<dt class="hdlist1">\r
+--log-entries=<entries>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Specifies how many DST log entries the program should request from\r
+ the device. This must be at least one, and shouldn’t exceed the\r
+ 20 entries. Defaults to 20 DST log entries.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
-o <format>\r
</dt>\r
<dt class="hdlist1">\r
<div id="footnotes"><hr /></div>\r
<div id="footer">\r
<div id="footer-text">\r
-Last updated 2018-06-15 13:12:28 MDT\r
+Last updated\r
+ 2021-01-23 16:07:45 IST\r
</div>\r
</div>\r
</body>\r
SYNOPSIS
--------
[verse]
-'nvme self-test'-log <device> [--output-format=<FMT> | -o <FMT>]
+'nvme self-test'-log <device> [--log-entries=<entries> | -e <entries>]
+ [--output-format=<FMT> | -o <FMT>]
DESCRIPTION
-----------
OPTION
-------
+-e <entries>::
+--log-entries=<entries>::
+ Specifies how many DST log entries the program should request from
+ the device. This must be at least one, and shouldn't exceed the
+ 20 entries. Defaults to 20 DST log entries.
+
-o <format>::
--output-format=<format>::
Set the reporting format to 'normal', 'json', or
NVME_ST_VALID_SCT = 1 << 2,
NVME_ST_VALID_SC = 1 << 3,
NVME_ST_REPORTS = 20,
+ NVME_ST_LOG_ENTRY_SIZE = 28,
+ NVME_ST_LOG_HEAD_SIZE = 4,
};
struct nvme_self_test_log {
__u8 crnt_dev_selftest_oprn;
__u8 crnt_dev_selftest_compln;
- __u8 rsvd[2];
+ __u8 rsvd2[2];
struct nvme_self_test_res result[20];
} __attribute__((packed));
true, ana_log_len, ana_log);
}
-int nvme_self_test_log(int fd, __u32 nsid, struct nvme_self_test_log *self_test_log)
+int nvme_self_test_log(int fd, __u32 size, struct nvme_self_test_log *self_test_log)
{
- return nvme_get_log(fd, nsid, NVME_LOG_DEVICE_SELF_TEST, false,
- NVME_NO_LOG_LSP, sizeof(*self_test_log), self_test_log);
+ return nvme_get_log(fd, NVME_NSID_ALL, NVME_LOG_DEVICE_SELF_TEST, false,
+ NVME_NO_LOG_LSP, size, self_test_log);
}
int nvme_effects_log(int fd, struct nvme_effects_log_page *effects_log)
int nvme_sanitize(int fd, __u8 sanact, __u8 ause, __u8 owpass, __u8 oipbp,
__u8 no_dealloc, __u32 ovrpat);
int nvme_self_test_start(int fd, __u32 nsid, __u32 cdw10);
-int nvme_self_test_log(int fd, __u32 nsid, struct nvme_self_test_log *self_test_log);
+int nvme_self_test_log(int fd, __u32 size, struct nvme_self_test_log *self_test_log);
int nvme_virtual_mgmt(int fd, __u32 cdw10, __u32 cdw11, __u32 *result);
int nvme_zns_mgmt_send(int fd, __u32 nsid, __u64 slba, bool select_all,
json_free_object(root);
}
-static void json_self_test_log(struct nvme_self_test_log *self_test)
+static void json_self_test_log(struct nvme_self_test_log *self_test, __u8 dst_entries)
{
struct json_object *valid_attrs;
struct json_object *root;
struct json_array *valid;
int i;
+ __u32 num_entries;
root = json_create_object();
json_object_add_value_int(root, "Current Device Self-Test Operation",
self_test->crnt_dev_selftest_compln);
valid = json_create_array();
- for (i = 0; i < NVME_ST_REPORTS; i++) {
+ num_entries = min(dst_entries, NVME_ST_REPORTS);
+ for (i = 0; i < num_entries; i++) {
valid_attrs = json_create_object();
json_object_add_value_int(valid_attrs, "Self test result",
self_test->result[i].dsts & 0xf);
res->vs[0], res->vs[1]);
}
-void nvme_show_self_test_log(struct nvme_self_test_log *self_test, const char *devname,
- enum nvme_print_flags flags)
+void nvme_show_self_test_log(struct nvme_self_test_log *self_test, __u8 dst_entries,
+ __u32 size, const char *devname, enum nvme_print_flags flags)
{
int i;
+ __u8 num_entries;
if (flags & BINARY)
- return d_raw((unsigned char *)self_test, sizeof(*self_test));
+ return d_raw((unsigned char *)self_test, size);
if (flags & JSON)
- return json_self_test_log(self_test);
+ return json_self_test_log(self_test, dst_entries);
printf("Device Self Test Log for NVME device:%s\n", devname);
printf("Current operation : %#x\n", self_test->crnt_dev_selftest_oprn);
printf("Current Completion : %u%%\n", self_test->crnt_dev_selftest_compln);
- for (i = 0; i < NVME_ST_REPORTS; i++) {
+ num_entries = min(dst_entries, NVME_ST_REPORTS);
+ for (i = 0; i < num_entries; i++) {
printf("Self Test Result[%d]:\n", i);
nvme_show_self_test_result(&self_test->result[i], flags);
}
const char *devname, enum nvme_print_flags flags);
void nvme_show_ana_log(struct nvme_ana_rsp_hdr *ana_log, const char *devname,
enum nvme_print_flags flags, size_t len);
-void nvme_show_self_test_log(struct nvme_self_test_log *self_test, const char *devname,
- enum nvme_print_flags flags);
+void nvme_show_self_test_log(struct nvme_self_test_log *self_test, __u8 dst_entries,
+ __u32 size, const char *devname, enum nvme_print_flags flags);
void nvme_show_fw_log(struct nvme_firmware_log_page *fw_log, const char *devname,
enum nvme_print_flags flags);
void nvme_show_effects_log(struct nvme_effects_log_page *effects, unsigned int flags);
const char *desc = "Retrieve the self-test log for the given device and given test "\
"(or optionally a namespace) in either decoded format "\
"(default) or binary.";
- const char *namespace_id = "Indicate the namespace from which the self-test "\
- "log has to be obtained";
+ const char *dst_entries = "Indicate how many DST log entries to be retrieved, "\
+ "by default all the 20 entries will be retrieved";
const char *verbose = "Increase output verbosity";
struct nvme_self_test_log self_test_log;
enum nvme_print_flags flags;
int err, fd;
+ __u32 log_size;
struct config {
- __u32 namespace_id;
+ __u8 dst_entries;
char *output_format;
int verbose;
};
struct config cfg = {
- .namespace_id = NVME_NSID_ALL,
+ .dst_entries = NVME_ST_REPORTS,
.output_format = "normal",
};
OPT_ARGS(opts) = {
- OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id),
+ OPT_UINT("dst-entries", 'e', &cfg.dst_entries, dst_entries),
OPT_FMT("output-format", 'o', &cfg.output_format, output_format),
OPT_FLAG("verbose", 'v', &cfg.verbose, verbose),
OPT_END()
if (cfg.verbose)
flags |= VERBOSE;
- err = nvme_self_test_log(fd, cfg.namespace_id, &self_test_log);
+ log_size = NVME_ST_LOG_HEAD_SIZE + cfg.dst_entries * NVME_ST_LOG_ENTRY_SIZE;
+ err = nvme_self_test_log(fd, log_size, &self_test_log);
if (!err)
- nvme_show_self_test_log(&self_test_log, devicename, flags);
+ nvme_show_self_test_log(&self_test_log, cfg.dst_entries, log_size,
+ devicename, flags);
else if (err > 0)
nvme_show_status(err);
else