]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme: fix device self test log
authorGollu Appalanaidu <anaidu.gollu@samsung.com>
Sat, 23 Jan 2021 10:23:47 +0000 (15:53 +0530)
committerGollu Appalanaidu <anaidu.gollu@samsung.com>
Sat, 23 Jan 2021 10:39:20 +0000 (16:09 +0530)
Namespace ID no need to mention for the device self test log,
removing nsid and adding DST log entries field

Signed-off-by: Gollu Appalanaidu <anaidu.gollu@samsung.com>
Documentation/nvme-self-test-log.1
Documentation/nvme-self-test-log.html
Documentation/nvme-self-test-log.txt
linux/nvme.h
nvme-ioctl.c
nvme-ioctl.h
nvme-print.c
nvme-print.h
nvme.c

index 0f257d92fe3344d3f5ac73751afa4bb9e7cbf781..e00e289dd0ad446783bb54addf6263f84d0f49dd 100644 (file)
@@ -1,13 +1,13 @@
 '\" 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
 .\" -----------------------------------------------------------------
@@ -32,7 +32,8 @@ nvme-self-test-log \- Retrieve the log information initited by device\-self\-tes
 .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
@@ -45,6 +46,11 @@ On success, the returned log structure may be returned in one of several ways de
 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
index 7f02a76f32cd45f6290a0977d9e34cdd00518fe9..3b24a266bae57886aea55b887dcc32e10ff7d29a 100644 (file)
@@ -1,9 +1,10 @@
+<?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
@@ -94,7 +95,9 @@ ul > li > * { color: black; }
   padding: 0;\r
   margin: 0;\r
 }\r
-\r
+pre {\r
+  white-space: pre-wrap;\r
+}\r
 \r
 #author {\r
   color: #527bbd;\r
@@ -223,7 +226,7 @@ div.exampleblock > div.content {
 }\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
@@ -433,7 +436,7 @@ thead, p.table.header {
 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
@@ -746,7 +749,8 @@ nvme-self-test-log(1) Manual Page
 <h2 id="_synopsis">SYNOPSIS</h2>\r
 <div class="sectionbody">\r
 <div class="verseblock">\r
-<pre class="content"><em>nvme self-test</em>-log &lt;device&gt; [--output-format=&lt;FMT&gt; | -o &lt;FMT&gt;]</pre>\r
+<pre class="content"><em>nvme self-test</em>-log &lt;device&gt; [--log-entries=&lt;entries&gt; | -e &lt;entries&gt;]\r
+                    [--output-format=&lt;FMT&gt; | -o &lt;FMT&gt;]</pre>\r
 <div class="attribution">\r
 </div></div>\r
 </div>\r
@@ -771,6 +775,19 @@ json format.</p></div>
 <div class="sectionbody">\r
 <div class="dlist"><dl>\r
 <dt class="hdlist1">\r
+-e &lt;entries&gt;\r
+</dt>\r
+<dt class="hdlist1">\r
+--log-entries=&lt;entries&gt;\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&#8217;t exceed the\r
+        20 entries. Defaults to 20 DST log entries.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
 -o &lt;format&gt;\r
 </dt>\r
 <dt class="hdlist1">\r
@@ -829,7 +846,8 @@ Get the self-test-log and print it in a json format:
 <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
index 78798d9ffd4f52584fb99065f07fa7a9c39d875a..a801cb099f97eef291f70c9f4d4b5b2f0f45b68e 100644 (file)
@@ -8,7 +8,8 @@ nvme-self-test-log - Retrieve the log information initited by device-self-test a
 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
 -----------
@@ -28,6 +29,12 @@ By default the log is printed out in the normal readable format.
 
 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
index 025f6380c1399073c92be222560e7d9a2247977c..b3151797198fa8e9a4a434529ba8e57a9ddd5d0c 100644 (file)
@@ -650,12 +650,14 @@ enum {
        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));
 
index a99d4909872c327c83af4a4999e9e27c05058c2f..0b415aadf8b5f59172fb2751525e741cf074e120 100644 (file)
@@ -591,10 +591,10 @@ int nvme_ana_log(int fd, void *ana_log, size_t ana_log_len, int rgo)
                        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)
index 23c657fe07ff4028d0870feff6ae7c047d0c138c..b3fc650ec9758ebcadbf05cb1d7e88442f7f0dba 100644 (file)
@@ -167,7 +167,7 @@ int nvme_get_property(int fd, int offset, uint64_t *value);
 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,
index 09ada7550a5164dd1c002af3b81d4dc284e6a5ee..dbd3e60c9201bb27868644e411efb1c8bb387f33 100644 (file)
@@ -737,12 +737,13 @@ static void json_ana_log(struct nvme_ana_rsp_hdr *ana_log, const char *devname)
        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",
@@ -751,7 +752,8 @@ static void json_self_test_log(struct nvme_self_test_log *self_test)
                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);
@@ -4615,20 +4617,22 @@ static void nvme_show_self_test_result(struct nvme_self_test_res *res,
                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);
        }
index 368434c52b3ce26d29ebc85d2dd3fdf0d0b2cdc1..c3f19bc76dbd2ddd80af88d9a6565809d0bf9709 100644 (file)
@@ -26,8 +26,8 @@ void nvme_show_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
        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);
diff --git a/nvme.c b/nvme.c
index d1ef6e944acfca3c016cb13241b4ce801bd7376b..78cf5936d4cc86dfed95c1e10e05b06fb6056b53 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -2278,27 +2278,28 @@ static int self_test_log(int argc, char **argv, struct command *cmd, struct plug
        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()
@@ -2314,9 +2315,11 @@ static int self_test_log(int argc, char **argv, struct command *cmd, struct plug
        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