Merging upstream version 1.15.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
14665a711e
commit
d975eb29d0
116 changed files with 6031 additions and 2284 deletions
|
@ -1,13 +1,13 @@
|
|||
'\" t
|
||||
.\" Title: nvme-admin-passthru
|
||||
.\" 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: 06/04/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-ADMIN\-PASSTHR" "1" "10/20/2020" "NVMe" "NVMe Manual"
|
||||
.TH "NVME\-ADMIN\-PASSTHR" "1" "06/04/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
|
@ -46,6 +46,7 @@ nvme-admin-passthru \- Submit an arbitrary admin command, return results
|
|||
[\-\-dry\-run | \-d]
|
||||
[\-\-raw\-binary | \-b]
|
||||
[\-\-prefill=<prefill> | \-p <prefill>]
|
||||
[\-\-latency | \-T]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -123,6 +124,11 @@ Print the raw returned buffer to stdout if the command returns a structure\&.
|
|||
.RS 4
|
||||
Prefill the buffer with a predetermined byte value\&. Defaults to 0\&. This may be useful if the data you are writing is shorter than the required buffer, and you need to pad it with a known value\&. It may also be useful if you need to confirm if a device is overwriting a buffer for a data\-in command\&.
|
||||
.RE
|
||||
.PP
|
||||
\-T, \-\-latency
|
||||
.RS 4
|
||||
Print out the latency the IOCTL took (in us)\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
.RS 4
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.10" />
|
||||
<title>nvme-admin-passthru(1)</title>
|
||||
<style type="text/css">
|
||||
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
||||
|
@ -94,7 +95,9 @@ ul > li > * { color: black; }
|
|||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
#author {
|
||||
color: #527bbd;
|
||||
|
@ -223,7 +226,7 @@ div.exampleblock > div.content {
|
|||
}
|
||||
|
||||
div.imageblock div.content { padding-left: 0; }
|
||||
span.image img { border-style: none; }
|
||||
span.image img { border-style: none; vertical-align: text-bottom; }
|
||||
a.image:visited { color: white; }
|
||||
|
||||
dl {
|
||||
|
@ -759,7 +762,8 @@ nvme-admin-passthru(1) Manual Page
|
|||
[--show-command | -s]
|
||||
[--dry-run | -d]
|
||||
[--raw-binary | -b]
|
||||
[--prefill=<prefill> | -p <prefill>]</pre>
|
||||
[--prefill=<prefill> | -p <prefill>]
|
||||
[--latency | -T]</pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
</div>
|
||||
|
@ -941,6 +945,17 @@ printed to stdout for another program to parse.</p></div>
|
|||
is overwriting a buffer for a data-in command.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-T
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--latency
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Print out the latency the IOCTL took (in us).
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -982,7 +997,8 @@ Or if you want to save that structure to a file:
|
|||
<div id="footnotes"><hr /></div>
|
||||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated 2019-09-06 10:35:44 MDT
|
||||
Last updated
|
||||
2021-06-04 10:59:04 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -22,6 +22,7 @@ SYNOPSIS
|
|||
[--dry-run | -d]
|
||||
[--raw-binary | -b]
|
||||
[--prefill=<prefill> | -p <prefill>]
|
||||
[--latency | -T]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
@ -105,6 +106,10 @@ OPTIONS
|
|||
value. It may also be useful if you need to confirm if a device
|
||||
is overwriting a buffer for a data-in command.
|
||||
|
||||
-T::
|
||||
--latency::
|
||||
Print out the latency the IOCTL took (in us).
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
* The following will run the admin command with opcode=6 and cdw10=1, which
|
||||
|
|
71
Documentation/nvme-capacity-mgmt.1
Normal file
71
Documentation/nvme-capacity-mgmt.1
Normal file
|
@ -0,0 +1,71 @@
|
|||
'\" t
|
||||
.\" Title: nvme-capacity-mgmt
|
||||
.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author]
|
||||
.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
|
||||
.\" Date: 07/02/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-CAPACITY\-MGMT" "1" "07/02/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.\" http://bugs.debian.org/507673
|
||||
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.ie \n(.g .ds Aq \(aq
|
||||
.el .ds Aq '
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * set default formatting
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" disable hyphenation
|
||||
.nh
|
||||
.\" disable justification (adjust text to left margin only)
|
||||
.ad l
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * MAIN CONTENT STARTS HERE *
|
||||
.\" -----------------------------------------------------------------
|
||||
.SH "NAME"
|
||||
nvme-capacity-mgmt \- Send capacity management command to configure/create/delete Endurance Groups or NVM Sets, returns results\&.
|
||||
.SH "SYNOPSIS"
|
||||
.sp
|
||||
.nf
|
||||
\fInvme capacity\-mgmt\fR <device> [\-\-operation=<operation> | \-o <operation>]
|
||||
[\-\-element\-id=<element\-id> | \-i <element\-id>]
|
||||
[\-\-cap\-lower=<cap\-lower> | \-l <cap\-lower>]
|
||||
[\-\-cap\-upper=<cap\-upper> | \-u <cap\-upper>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
For the NVMe device given, sends a capacity management command to configure/create/delete the Endurance Groups or NVM Sets with the requested operation and element_id\&. On success, if the Operation is Create Endurance group or NVM Set, CQE CDW0 contains Created element identifier else CQE CDW0 is reserved\&.
|
||||
.sp
|
||||
The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
|
||||
.SH "OPTIONS"
|
||||
.PP
|
||||
\-o <operation>, \-\-operation=<operation>
|
||||
.RS 4
|
||||
Operation to be performed by the controller
|
||||
.RE
|
||||
.PP
|
||||
\-i <element\-id>, \-\-element\-id=<element\-id>
|
||||
.RS 4
|
||||
Value specific to the value of the Operation field\&.
|
||||
.RE
|
||||
.PP
|
||||
\-l <cap\-lower>, \-\-cap\-lower=<cap\-lower>
|
||||
.RS 4
|
||||
Least significant 32 bits of the capacity in bytes of the Endurance Group or NVM Set to be created
|
||||
.RE
|
||||
.PP
|
||||
\-u <cap\-upper>, \-\-cap\-upper=<cap\-upper>
|
||||
.RS 4
|
||||
Most significant 32 bits of the capacity in bytes of the Endurance Group or NVM Set to be created
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
No examples provided yet\&.
|
||||
.SH "NVME"
|
||||
.sp
|
||||
Part of the nvme\-user suite
|
845
Documentation/nvme-capacity-mgmt.html
Normal file
845
Documentation/nvme-capacity-mgmt.html
Normal file
|
@ -0,0 +1,845 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.10" />
|
||||
<title>nvme-capacity-mgmt(1)</title>
|
||||
<style type="text/css">
|
||||
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
||||
|
||||
/* Default font. */
|
||||
body {
|
||||
font-family: Georgia,serif;
|
||||
}
|
||||
|
||||
/* Title font. */
|
||||
h1, h2, h3, h4, h5, h6,
|
||||
div.title, caption.title,
|
||||
thead, p.table.header,
|
||||
#toctitle,
|
||||
#author, #revnumber, #revdate, #revremark,
|
||||
#footer {
|
||||
font-family: Arial,Helvetica,sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 1em 5% 1em 5%;
|
||||
}
|
||||
|
||||
a {
|
||||
color: blue;
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:visited {
|
||||
color: fuchsia;
|
||||
}
|
||||
|
||||
em {
|
||||
font-style: italic;
|
||||
color: navy;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: bold;
|
||||
color: #083194;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #527bbd;
|
||||
margin-top: 1.2em;
|
||||
margin-bottom: 0.5em;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
border-bottom: 2px solid silver;
|
||||
}
|
||||
h2 {
|
||||
padding-top: 0.5em;
|
||||
}
|
||||
h3 {
|
||||
float: left;
|
||||
}
|
||||
h3 + * {
|
||||
clear: left;
|
||||
}
|
||||
h5 {
|
||||
font-size: 1.0em;
|
||||
}
|
||||
|
||||
div.sectionbody {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: 1px solid silver;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
ul, ol, li > p {
|
||||
margin-top: 0;
|
||||
}
|
||||
ul > li { color: #aaa; }
|
||||
ul > li > * { color: black; }
|
||||
|
||||
.monospaced, code, pre {
|
||||
font-family: "Courier New", Courier, monospace;
|
||||
font-size: inherit;
|
||||
color: navy;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
#author {
|
||||
color: #527bbd;
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
#email {
|
||||
}
|
||||
#revnumber, #revdate, #revremark {
|
||||
}
|
||||
|
||||
#footer {
|
||||
font-size: small;
|
||||
border-top: 2px solid silver;
|
||||
padding-top: 0.5em;
|
||||
margin-top: 4.0em;
|
||||
}
|
||||
#footer-text {
|
||||
float: left;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
#footer-badges {
|
||||
float: right;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
|
||||
#preamble {
|
||||
margin-top: 1.5em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.imageblock, div.exampleblock, div.verseblock,
|
||||
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
|
||||
div.admonitionblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.admonitionblock {
|
||||
margin-top: 2.0em;
|
||||
margin-bottom: 2.0em;
|
||||
margin-right: 10%;
|
||||
color: #606060;
|
||||
}
|
||||
|
||||
div.content { /* Block element content. */
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* Block element titles. */
|
||||
div.title, caption.title {
|
||||
color: #527bbd;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
div.title + * {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
td div.title:first-child {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
div.content div.title:first-child {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
div.content + div.title {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
|
||||
div.sidebarblock > div.content {
|
||||
background: #ffffee;
|
||||
border: 1px solid #dddddd;
|
||||
border-left: 4px solid #f0f0f0;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.listingblock > div.content {
|
||||
border: 1px solid #dddddd;
|
||||
border-left: 5px solid #f0f0f0;
|
||||
background: #f8f8f8;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.quoteblock, div.verseblock {
|
||||
padding-left: 1.0em;
|
||||
margin-left: 1.0em;
|
||||
margin-right: 10%;
|
||||
border-left: 5px solid #f0f0f0;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
div.quoteblock > div.attribution {
|
||||
padding-top: 0.5em;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.verseblock > pre.content {
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
}
|
||||
div.verseblock > div.attribution {
|
||||
padding-top: 0.75em;
|
||||
text-align: left;
|
||||
}
|
||||
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
|
||||
div.verseblock + div.attribution {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.admonitionblock .icon {
|
||||
vertical-align: top;
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
text-decoration: underline;
|
||||
color: #527bbd;
|
||||
padding-right: 0.5em;
|
||||
}
|
||||
div.admonitionblock td.content {
|
||||
padding-left: 0.5em;
|
||||
border-left: 3px solid #dddddd;
|
||||
}
|
||||
|
||||
div.exampleblock > div.content {
|
||||
border-left: 3px solid #dddddd;
|
||||
padding-left: 0.5em;
|
||||
}
|
||||
|
||||
div.imageblock div.content { padding-left: 0; }
|
||||
span.image img { border-style: none; vertical-align: text-bottom; }
|
||||
a.image:visited { color: white; }
|
||||
|
||||
dl {
|
||||
margin-top: 0.8em;
|
||||
margin-bottom: 0.8em;
|
||||
}
|
||||
dt {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0;
|
||||
font-style: normal;
|
||||
color: navy;
|
||||
}
|
||||
dd > *:first-child {
|
||||
margin-top: 0.1em;
|
||||
}
|
||||
|
||||
ul, ol {
|
||||
list-style-position: outside;
|
||||
}
|
||||
ol.arabic {
|
||||
list-style-type: decimal;
|
||||
}
|
||||
ol.loweralpha {
|
||||
list-style-type: lower-alpha;
|
||||
}
|
||||
ol.upperalpha {
|
||||
list-style-type: upper-alpha;
|
||||
}
|
||||
ol.lowerroman {
|
||||
list-style-type: lower-roman;
|
||||
}
|
||||
ol.upperroman {
|
||||
list-style-type: upper-roman;
|
||||
}
|
||||
|
||||
div.compact ul, div.compact ol,
|
||||
div.compact p, div.compact p,
|
||||
div.compact div, div.compact div {
|
||||
margin-top: 0.1em;
|
||||
margin-bottom: 0.1em;
|
||||
}
|
||||
|
||||
tfoot {
|
||||
font-weight: bold;
|
||||
}
|
||||
td > div.verse {
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
div.hdlist {
|
||||
margin-top: 0.8em;
|
||||
margin-bottom: 0.8em;
|
||||
}
|
||||
div.hdlist tr {
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
dt.hdlist1.strong, td.hdlist1.strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
td.hdlist1 {
|
||||
vertical-align: top;
|
||||
font-style: normal;
|
||||
padding-right: 0.8em;
|
||||
color: navy;
|
||||
}
|
||||
td.hdlist2 {
|
||||
vertical-align: top;
|
||||
}
|
||||
div.hdlist.compact tr {
|
||||
margin: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.comment {
|
||||
background: yellow;
|
||||
}
|
||||
|
||||
.footnote, .footnoteref {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
span.footnote, span.footnoteref {
|
||||
vertical-align: super;
|
||||
}
|
||||
|
||||
#footnotes {
|
||||
margin: 20px 0 20px 0;
|
||||
padding: 7px 0 0 0;
|
||||
}
|
||||
|
||||
#footnotes div.footnote {
|
||||
margin: 0 0 5px 0;
|
||||
}
|
||||
|
||||
#footnotes hr {
|
||||
border: none;
|
||||
border-top: 1px solid silver;
|
||||
height: 1px;
|
||||
text-align: left;
|
||||
margin-left: 0;
|
||||
width: 20%;
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
div.colist td {
|
||||
padding-right: 0.5em;
|
||||
padding-bottom: 0.3em;
|
||||
vertical-align: top;
|
||||
}
|
||||
div.colist td img {
|
||||
margin-top: 0.3em;
|
||||
}
|
||||
|
||||
@media print {
|
||||
#footer-badges { display: none; }
|
||||
}
|
||||
|
||||
#toc {
|
||||
margin-bottom: 2.5em;
|
||||
}
|
||||
|
||||
#toctitle {
|
||||
color: #527bbd;
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 0.1em;
|
||||
}
|
||||
|
||||
div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
div.toclevel2 {
|
||||
margin-left: 2em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
div.toclevel3 {
|
||||
margin-left: 4em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
div.toclevel4 {
|
||||
margin-left: 6em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
span.aqua { color: aqua; }
|
||||
span.black { color: black; }
|
||||
span.blue { color: blue; }
|
||||
span.fuchsia { color: fuchsia; }
|
||||
span.gray { color: gray; }
|
||||
span.green { color: green; }
|
||||
span.lime { color: lime; }
|
||||
span.maroon { color: maroon; }
|
||||
span.navy { color: navy; }
|
||||
span.olive { color: olive; }
|
||||
span.purple { color: purple; }
|
||||
span.red { color: red; }
|
||||
span.silver { color: silver; }
|
||||
span.teal { color: teal; }
|
||||
span.white { color: white; }
|
||||
span.yellow { color: yellow; }
|
||||
|
||||
span.aqua-background { background: aqua; }
|
||||
span.black-background { background: black; }
|
||||
span.blue-background { background: blue; }
|
||||
span.fuchsia-background { background: fuchsia; }
|
||||
span.gray-background { background: gray; }
|
||||
span.green-background { background: green; }
|
||||
span.lime-background { background: lime; }
|
||||
span.maroon-background { background: maroon; }
|
||||
span.navy-background { background: navy; }
|
||||
span.olive-background { background: olive; }
|
||||
span.purple-background { background: purple; }
|
||||
span.red-background { background: red; }
|
||||
span.silver-background { background: silver; }
|
||||
span.teal-background { background: teal; }
|
||||
span.white-background { background: white; }
|
||||
span.yellow-background { background: yellow; }
|
||||
|
||||
span.big { font-size: 2em; }
|
||||
span.small { font-size: 0.6em; }
|
||||
|
||||
span.underline { text-decoration: underline; }
|
||||
span.overline { text-decoration: overline; }
|
||||
span.line-through { text-decoration: line-through; }
|
||||
|
||||
div.unbreakable { page-break-inside: avoid; }
|
||||
|
||||
|
||||
/*
|
||||
* xhtml11 specific
|
||||
*
|
||||
* */
|
||||
|
||||
div.tableblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.tableblock > table {
|
||||
border: 3px solid #527bbd;
|
||||
}
|
||||
thead, p.table.header {
|
||||
font-weight: bold;
|
||||
color: #527bbd;
|
||||
}
|
||||
p.table {
|
||||
margin-top: 0;
|
||||
}
|
||||
/* Because the table frame attribute is overriden by CSS in most browsers. */
|
||||
div.tableblock > table[frame="void"] {
|
||||
border-style: none;
|
||||
}
|
||||
div.tableblock > table[frame="hsides"] {
|
||||
border-left-style: none;
|
||||
border-right-style: none;
|
||||
}
|
||||
div.tableblock > table[frame="vsides"] {
|
||||
border-top-style: none;
|
||||
border-bottom-style: none;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* html5 specific
|
||||
*
|
||||
* */
|
||||
|
||||
table.tableblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
thead, p.tableblock.header {
|
||||
font-weight: bold;
|
||||
color: #527bbd;
|
||||
}
|
||||
p.tableblock {
|
||||
margin-top: 0;
|
||||
}
|
||||
table.tableblock {
|
||||
border-width: 3px;
|
||||
border-spacing: 0px;
|
||||
border-style: solid;
|
||||
border-color: #527bbd;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
th.tableblock, td.tableblock {
|
||||
border-width: 1px;
|
||||
padding: 4px;
|
||||
border-style: solid;
|
||||
border-color: #527bbd;
|
||||
}
|
||||
|
||||
table.tableblock.frame-topbot {
|
||||
border-left-style: hidden;
|
||||
border-right-style: hidden;
|
||||
}
|
||||
table.tableblock.frame-sides {
|
||||
border-top-style: hidden;
|
||||
border-bottom-style: hidden;
|
||||
}
|
||||
table.tableblock.frame-none {
|
||||
border-style: hidden;
|
||||
}
|
||||
|
||||
th.tableblock.halign-left, td.tableblock.halign-left {
|
||||
text-align: left;
|
||||
}
|
||||
th.tableblock.halign-center, td.tableblock.halign-center {
|
||||
text-align: center;
|
||||
}
|
||||
th.tableblock.halign-right, td.tableblock.halign-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
th.tableblock.valign-top, td.tableblock.valign-top {
|
||||
vertical-align: top;
|
||||
}
|
||||
th.tableblock.valign-middle, td.tableblock.valign-middle {
|
||||
vertical-align: middle;
|
||||
}
|
||||
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* manpage specific
|
||||
*
|
||||
* */
|
||||
|
||||
body.manpage h1 {
|
||||
padding-top: 0.5em;
|
||||
padding-bottom: 0.5em;
|
||||
border-top: 2px solid silver;
|
||||
border-bottom: 2px solid silver;
|
||||
}
|
||||
body.manpage h2 {
|
||||
border-style: none;
|
||||
}
|
||||
body.manpage div.sectionbody {
|
||||
margin-left: 3em;
|
||||
}
|
||||
|
||||
@media print {
|
||||
body.manpage div#toc { display: none; }
|
||||
}
|
||||
|
||||
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
/*<+'])');
|
||||
// Function that scans the DOM tree for header elements (the DOM2
|
||||
// nodeIterator API would be a better technique but not supported by all
|
||||
// browsers).
|
||||
var iterate = function (el) {
|
||||
for (var i = el.firstChild; i != null; i = i.nextSibling) {
|
||||
if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
|
||||
var mo = re.exec(i.tagName);
|
||||
if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
|
||||
result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
|
||||
}
|
||||
iterate(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
iterate(el);
|
||||
return result;
|
||||
}
|
||||
|
||||
var toc = document.getElementById("toc");
|
||||
if (!toc) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Delete existing TOC entries in case we're reloading the TOC.
|
||||
var tocEntriesToRemove = [];
|
||||
var i;
|
||||
for (i = 0; i < toc.childNodes.length; i++) {
|
||||
var entry = toc.childNodes[i];
|
||||
if (entry.nodeName.toLowerCase() == 'div'
|
||||
&& entry.getAttribute("class")
|
||||
&& entry.getAttribute("class").match(/^toclevel/))
|
||||
tocEntriesToRemove.push(entry);
|
||||
}
|
||||
for (i = 0; i < tocEntriesToRemove.length; i++) {
|
||||
toc.removeChild(tocEntriesToRemove[i]);
|
||||
}
|
||||
|
||||
// Rebuild TOC entries.
|
||||
var entries = tocEntries(document.getElementById("content"), toclevels);
|
||||
for (var i = 0; i < entries.length; ++i) {
|
||||
var entry = entries[i];
|
||||
if (entry.element.id == "")
|
||||
entry.element.id = "_toc_" + i;
|
||||
var a = document.createElement("a");
|
||||
a.href = "#" + entry.element.id;
|
||||
a.appendChild(document.createTextNode(entry.text));
|
||||
var div = document.createElement("div");
|
||||
div.appendChild(a);
|
||||
div.className = "toclevel" + entry.toclevel;
|
||||
toc.appendChild(div);
|
||||
}
|
||||
if (entries.length == 0)
|
||||
toc.parentNode.removeChild(toc);
|
||||
},
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// Footnotes generator
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
/* Based on footnote generation code from:
|
||||
* http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
|
||||
*/
|
||||
|
||||
footnotes: function () {
|
||||
// Delete existing footnote entries in case we're reloading the footnodes.
|
||||
var i;
|
||||
var noteholder = document.getElementById("footnotes");
|
||||
if (!noteholder) {
|
||||
return;
|
||||
}
|
||||
var entriesToRemove = [];
|
||||
for (i = 0; i < noteholder.childNodes.length; i++) {
|
||||
var entry = noteholder.childNodes[i];
|
||||
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
|
||||
entriesToRemove.push(entry);
|
||||
}
|
||||
for (i = 0; i < entriesToRemove.length; i++) {
|
||||
noteholder.removeChild(entriesToRemove[i]);
|
||||
}
|
||||
|
||||
// Rebuild footnote entries.
|
||||
var cont = document.getElementById("content");
|
||||
var spans = cont.getElementsByTagName("span");
|
||||
var refs = {};
|
||||
var n = 0;
|
||||
for (i=0; i<spans.length; i++) {
|
||||
if (spans[i].className == "footnote") {
|
||||
n++;
|
||||
var note = spans[i].getAttribute("data-note");
|
||||
if (!note) {
|
||||
// Use [\s\S] in place of . so multi-line matches work.
|
||||
// Because JavaScript has no s (dotall) regex flag.
|
||||
note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
|
||||
spans[i].innerHTML =
|
||||
"[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
|
||||
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
||||
spans[i].setAttribute("data-note", note);
|
||||
}
|
||||
noteholder.innerHTML +=
|
||||
"<div class='footnote' id='_footnote_" + n + "'>" +
|
||||
"<a href='#_footnoteref_" + n + "' title='Return to text'>" +
|
||||
n + "</a>. " + note + "</div>";
|
||||
var id =spans[i].getAttribute("id");
|
||||
if (id != null) refs["#"+id] = n;
|
||||
}
|
||||
}
|
||||
if (n == 0)
|
||||
noteholder.parentNode.removeChild(noteholder);
|
||||
else {
|
||||
// Process footnoterefs.
|
||||
for (i=0; i<spans.length; i++) {
|
||||
if (spans[i].className == "footnoteref") {
|
||||
var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
|
||||
href = href.match(/#.*/)[0]; // Because IE return full URL.
|
||||
n = refs[href];
|
||||
spans[i].innerHTML =
|
||||
"[<a href='#_footnote_" + n +
|
||||
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
install: function(toclevels) {
|
||||
var timerId;
|
||||
|
||||
function reinstall() {
|
||||
asciidoc.footnotes();
|
||||
if (toclevels) {
|
||||
asciidoc.toc(toclevels);
|
||||
}
|
||||
}
|
||||
|
||||
function reinstallAndRemoveTimer() {
|
||||
clearInterval(timerId);
|
||||
reinstall();
|
||||
}
|
||||
|
||||
timerId = setInterval(reinstall, 500);
|
||||
if (document.addEventListener)
|
||||
document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
|
||||
else
|
||||
window.onload = reinstallAndRemoveTimer;
|
||||
}
|
||||
|
||||
}
|
||||
asciidoc.install();
|
||||
/*]]>*/
|
||||
</script>
|
||||
</head>
|
||||
<body class="manpage">
|
||||
<div id="header">
|
||||
<h1>
|
||||
nvme-capacity-mgmt(1) Manual Page
|
||||
</h1>
|
||||
<h2>NAME</h2>
|
||||
<div class="sectionbody">
|
||||
<p>nvme-capacity-mgmt -
|
||||
Send capacity management command to configure/create/delete Endurance Groups or NVM Sets, returns results.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="content">
|
||||
<div class="sect1">
|
||||
<h2 id="_synopsis">SYNOPSIS</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="verseblock">
|
||||
<pre class="content"><em>nvme capacity-mgmt</em> <device> [--operation=<operation> | -o <operation>]
|
||||
[--element-id=<element-id> | -i <element-id>]
|
||||
[--cap-lower=<cap-lower> | -l <cap-lower>]
|
||||
[--cap-upper=<cap-upper> | -u <cap-upper>]</pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_description">DESCRIPTION</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>For the NVMe device given, sends a capacity management command to configure/create/delete
|
||||
the Endurance Groups or NVM Sets with the requested operation and element_id. On success,
|
||||
if the Operation is Create Endurance group or NVM Set, CQE CDW0 contains Created element
|
||||
identifier else CQE CDW0 is reserved.</p></div>
|
||||
<div class="paragraph"><p>The <device> parameter is mandatory and may be either the NVMe character
|
||||
device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_options">OPTIONS</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="dlist"><dl>
|
||||
<dt class="hdlist1">
|
||||
-o <operation>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--operation=<operation>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Operation to be performed by the controller
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-i <element-id>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--element-id=<element-id>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Value specific to the value of the Operation field.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-l <cap-lower>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--cap-lower=<cap-lower>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Least significant 32 bits of the capacity in bytes of the Endurance Group or
|
||||
NVM Set to be created
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-u <cap-upper>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--cap-upper=<cap-upper>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Most significant 32 bits of the capacity in bytes of the Endurance Group or
|
||||
NVM Set to be created
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_examples">EXAMPLES</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>No examples provided yet.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_nvme">NVME</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>Part of the nvme-user suite</p></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footnotes"><hr /></div>
|
||||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated
|
||||
2021-07-02 09:55:05 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
54
Documentation/nvme-capacity-mgmt.txt
Normal file
54
Documentation/nvme-capacity-mgmt.txt
Normal file
|
@ -0,0 +1,54 @@
|
|||
nvme-capacity-mgmt(1)
|
||||
=====================
|
||||
|
||||
NAME
|
||||
----
|
||||
nvme-capacity-mgmt - Send capacity management command to configure/create/delete
|
||||
Endurance Groups or NVM Sets, returns results.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'nvme capacity-mgmt' <device> [--operation=<operation> | -o <operation>]
|
||||
[--element-id=<element-id> | -i <element-id>]
|
||||
[--cap-lower=<cap-lower> | -l <cap-lower>]
|
||||
[--cap-upper=<cap-upper> | -u <cap-upper>]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
For the NVMe device given, sends a capacity management command to
|
||||
configure/create/delete the Endurance Groups or NVM Sets with the requested
|
||||
operation and element_id. On success, if the Operation is Create Endurance
|
||||
group or NVM Set, CQE CDW0 contains Created element identifier else CQE CDW0 is
|
||||
reserved.
|
||||
|
||||
The <device> parameter is mandatory and may be either the NVMe character
|
||||
device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
-o <operation>::
|
||||
--operation=<operation>::
|
||||
Operation to be performed by the controller
|
||||
|
||||
-i <element-id>::
|
||||
--element-id=<element-id>::
|
||||
Value specific to the value of the Operation field.
|
||||
|
||||
-l <cap-lower>::
|
||||
--cap-lower=<cap-lower>::
|
||||
Least significant 32 bits of the capacity in bytes of the Endurance Group or
|
||||
NVM Set to be created
|
||||
|
||||
-u <cap-upper>::
|
||||
--cap-upper=<cap-upper>::
|
||||
Most significant 32 bits of the capacity in bytes of the Endurance Group or
|
||||
NVM Set to be created
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
No examples provided yet.
|
||||
|
||||
NVME
|
||||
----
|
||||
Part of the nvme-user suite
|
|
@ -1,13 +1,13 @@
|
|||
'\" t
|
||||
.\" Title: nvme-compare
|
||||
.\" 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: 07/09/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-COMPARE" "1" "10/20/2020" "NVMe" "NVMe Manual"
|
||||
.TH "NVME\-COMPARE" "1" "07/09/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
|
@ -50,6 +50,7 @@ nvme-compare \- Send an NVMe Compare command, provide results
|
|||
[\-\-show\-command | \-v]
|
||||
[\-\-dry\-run | \-w]
|
||||
[\-\-latency | \-t]
|
||||
[\-\-storage\-tag\-check<storage\-tag\-check> | \-C <storage\-tag\-check>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -202,6 +203,11 @@ be set\&. Otherwise \-\-dry\-run option will be
|
|||
.RS 4
|
||||
Print out the latency the IOCTL took (in us)\&.
|
||||
.RE
|
||||
.PP
|
||||
\-\-storage\-tag\-check=<storage\-tag\-check>, \-C <storage\-tag\-check>
|
||||
.RS 4
|
||||
This bit specifies the Storage Tag field shall be checked as part of end\-to\-end data protection processing\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
No examples yet\&.
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.10" />
|
||||
<title>nvme-compare(1)</title>
|
||||
<style type="text/css">
|
||||
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
||||
|
@ -94,7 +95,9 @@ ul > li > * { color: black; }
|
|||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
#author {
|
||||
color: #527bbd;
|
||||
|
@ -223,7 +226,7 @@ div.exampleblock > div.content {
|
|||
}
|
||||
|
||||
div.imageblock div.content { padding-left: 0; }
|
||||
span.image img { border-style: none; }
|
||||
span.image img { border-style: none; vertical-align: text-bottom; }
|
||||
a.image:visited { color: white; }
|
||||
|
||||
dl {
|
||||
|
@ -763,7 +766,8 @@ nvme-compare(1) Manual Page
|
|||
[--dsm=<dsm> | -D <dsm>]
|
||||
[--show-command | -v]
|
||||
[--dry-run | -w]
|
||||
[--latency | -t]</pre>
|
||||
[--latency | -t]
|
||||
[--storage-tag-check<storage-tag-check> | -C <storage-tag-check>]</pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
</div>
|
||||
|
@ -1037,6 +1041,18 @@ metadata is passes.</p></td>
|
|||
Print out the latency the IOCTL took (in us).
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
--storage-tag-check=<storage-tag-check>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-C <storage-tag-check>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
This bit specifies the Storage Tag field shall be checked as part of end-to-end
|
||||
data protection processing.
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1056,7 +1072,8 @@ metadata is passes.</p></td>
|
|||
<div id="footnotes"><hr /></div>
|
||||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated 2018-12-17 13:07:47 MST
|
||||
Last updated
|
||||
2021-07-09 14:16:50 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -26,6 +26,7 @@ SYNOPSIS
|
|||
[--show-command | -v]
|
||||
[--dry-run | -w]
|
||||
[--latency | -t]
|
||||
[--storage-tag-check<storage-tag-check> | -C <storage-tag-check>]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
@ -139,6 +140,11 @@ metadata is passes.
|
|||
--latency::
|
||||
Print out the latency the IOCTL took (in us).
|
||||
|
||||
--storage-tag-check=<storage-tag-check>::
|
||||
-C <storage-tag-check>::
|
||||
This bit specifies the Storage Tag field shall be checked as part of end-to-end
|
||||
data protection processing.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
No examples yet.
|
||||
|
|
|
@ -13,6 +13,7 @@ SYNOPSIS
|
|||
[--traddr=<traddr> | -a <traddr>]
|
||||
[--trsvcid=<trsvcid> | -s <trsvcid>]
|
||||
[--host-traddr=<traddr> | -w <traddr>]
|
||||
[--host-iface=<iface> | -f <iface>]
|
||||
[--hostnqn=<hostnqn> | -q <hostnqn>]
|
||||
[--hostid=<hostid> | -I <hostid>]
|
||||
[--raw=<filename> | -r <filename>]
|
||||
|
@ -77,7 +78,14 @@ OPTIONS
|
|||
-w <traddr>::
|
||||
--host-traddr=<traddr>::
|
||||
This field specifies the network address used on the host to connect
|
||||
to the Discovery Controller.
|
||||
to the Controller. For TCP, this sets the source address on the socket.
|
||||
|
||||
-f <iface>::
|
||||
--host-iface=<iface>::
|
||||
This field specifies the network interface used on the host to connect
|
||||
to the Controller (e.g. IP eth1, enp2s0, enx78e7d1ea46da). This forces
|
||||
the connection to be made on a specific interface instead of letting
|
||||
the system decide.
|
||||
|
||||
-q <hostnqn>::
|
||||
--hostnqn=<hostnqn>::
|
||||
|
|
|
@ -14,6 +14,7 @@ SYNOPSIS
|
|||
[--traddr=<traddr> | -a <traddr>]
|
||||
[--trsvcid=<trsvcid> | -s <trsvcid>]
|
||||
[--host-traddr=<traddr> | -w <traddr>]
|
||||
[--host-iface=<iface> | -f <iface>]
|
||||
[--hostnqn=<hostnqn> | -q <hostnqn>]
|
||||
[--hostid=<hostid> | -I <hostid>]
|
||||
[--nr-io-queues=<#> | -i <#>]
|
||||
|
@ -27,6 +28,7 @@ SYNOPSIS
|
|||
[--disable-sqflow | -d]
|
||||
[--hdr-digest | -g]
|
||||
[--data-digest | -G]
|
||||
[--output-format=<fmt> | -o <fmt>]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
@ -69,7 +71,14 @@ OPTIONS
|
|||
-w <traddr>::
|
||||
--host-traddr=<traddr>::
|
||||
This field specifies the network address used on the host to connect
|
||||
to the Controller.
|
||||
to the Controller. For TCP, this sets the source address on the socket.
|
||||
|
||||
-f <iface>::
|
||||
--host-iface=<iface>::
|
||||
This field specifies the network interface used on the host to connect
|
||||
to the Controller (e.g. IP eth1, enp2s0, enx78e7d1ea46da). This forces
|
||||
the connection to be made on a specific interface instead of letting
|
||||
the system decide.
|
||||
|
||||
-q <hostnqn>::
|
||||
--hostnqn=<hostnqn>::
|
||||
|
@ -132,6 +141,12 @@ OPTIONS
|
|||
--data-digest::
|
||||
Generates/verifies data digest (TCP).
|
||||
|
||||
-o <format>::
|
||||
--output-format=<format>::
|
||||
Set the reporting format to 'normal' or 'json'. Only one output format can
|
||||
be used at a time. When this option is specified, the device associated with
|
||||
the connection will be printed. Nothing is printed otherwise.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
* Connect to a subsystem named nqn.2014-08.com.example:nvme:nvm-subsystem-sn-d78432
|
||||
|
|
|
@ -13,6 +13,7 @@ SYNOPSIS
|
|||
[--traddr=<traddr> | -a <traddr>]
|
||||
[--trsvcid=<trsvcid> | -s <trsvcid>]
|
||||
[--host-traddr=<traddr> | -w <traddr>]
|
||||
[--host-iface=<iface> | -f <iface>]
|
||||
[--hostnqn=<hostnqn> | -q <hostnqn>]
|
||||
[--hostid=<hostid> | -I <hostid>]
|
||||
[--raw=<filename> | -r <filename>]
|
||||
|
@ -35,7 +36,7 @@ DESCRIPTION
|
|||
Send one or more Get Log Page requests to a NVMe-over-Fabrics Discovery
|
||||
Controller.
|
||||
|
||||
If no parameters are given, then 'nvme discover' will attempt to
|
||||
If no parameters are given, then 'nvme discover' will attempt to
|
||||
find a /etc/nvme/discovery.conf file to use to supply a list of
|
||||
Discovery commands to run. If no /etc/nvme/discovery.conf file
|
||||
exists, the command will quit with an error.
|
||||
|
@ -46,7 +47,7 @@ request will then be sent to the specified Discovery Controller.
|
|||
|
||||
BACKGROUND
|
||||
----------
|
||||
The NVMe-over-Fabrics specification defines the concept of a
|
||||
The NVMe-over-Fabrics specification defines the concept of a
|
||||
Discovery Controller that an NVMe Host can query on a fabric
|
||||
network to discover NVMe subsystems contained in NVMe Targets
|
||||
which it can connect to on the network. The Discovery Controller
|
||||
|
@ -66,7 +67,7 @@ resources are allocated to the NVMe Host for a connection.
|
|||
A Discovery Controller has it's own NQN defined in the NVMe-over-Fabrics
|
||||
specification, *nqn.2014-08.org.nvmexpress.discovery*. All Discovery
|
||||
Controllers must use this NQN name. This NQN is used by default by
|
||||
nvme-cli for the 'discover' command.
|
||||
nvme-cli for the 'discover' command.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
|
@ -99,11 +100,18 @@ OPTIONS
|
|||
-w <traddr>::
|
||||
--host-traddr=<traddr>::
|
||||
This field specifies the network address used on the host to connect
|
||||
to the Discovery Controller.
|
||||
|
||||
to the Controller. For TCP, this sets the source address on the socket.
|
||||
|
||||
-f <iface>::
|
||||
--host-iface=<iface>::
|
||||
This field specifies the network interface used on the host to connect
|
||||
to the Controller (e.g. IP eth1, enp2s0, enx78e7d1ea46da). This forces
|
||||
the connection to be made on a specific interface instead of letting
|
||||
the system decide.
|
||||
|
||||
-q <hostnqn>::
|
||||
--hostnqn=<hostnqn>::
|
||||
Overrides the default host NQN that identifies the NVMe Host.
|
||||
Overrides the default host NQN that identifies the NVMe Host.
|
||||
If this option is not specified, the default is read from
|
||||
/etc/nvme/hostnqn first. If that does not exist, the autogenerated
|
||||
NQN value from the NVMe Host kernel module is used next.
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
'\" t
|
||||
.\" Title: nvme-get-feature
|
||||
.\" 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: 05/16/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-GET\-FEATURE" "1" "10/20/2020" "NVMe" "NVMe Manual"
|
||||
.TH "NVME\-GET\-FEATURE" "1" "05/16/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
|
@ -34,6 +34,7 @@ nvme-get-feature \- Gets an NVMe feature, returns applicable results
|
|||
.nf
|
||||
\fInvme get\-feature\fR <device> [\-\-namespace\-id=<nsid> | \-n <nsid>]
|
||||
[\-\-feature\-id=<fid> | \-f <fid>] [\-\-cdw11=<cdw11>]
|
||||
[\-\-uuid\-index=<uuid\-index> | \-U <uuid_index>]
|
||||
[\-\-data\-len=<data\-len> | \-l <data\-len>]
|
||||
[\-\-sel=<select> | \-s <select>]
|
||||
[\-\-raw\-binary | \-b]
|
||||
|
@ -103,6 +104,11 @@ T}
|
|||
.sp 1
|
||||
.RE
|
||||
.PP
|
||||
\-U <uuid\-index>, \-\-uuid\-index=<uuid\-index>
|
||||
.RS 4
|
||||
UUID Index of the feature
|
||||
.RE
|
||||
.PP
|
||||
\-l <data\-len>, \-\-data\-len=<data\-len>
|
||||
.RS 4
|
||||
The data length for the buffer returned for this feature\&. Most known features do not use this value\&. The exception is LBA Range Type
|
||||
|
@ -185,8 +191,20 @@ Retrieves the feature for the some vendor specific feature and specifically requ
|
|||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.sp
|
||||
Get feature with UUID index
|
||||
.RE
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
# nvme get\-feature /dev/nvme0 \-f 0xc0 \-l 512 \-U 0x1
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.sp
|
||||
.RS 4
|
||||
.ie n \{\
|
||||
\h'-04'\(bu\h'+03'\c
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.10" />
|
||||
<title>nvme-get-feature(1)</title>
|
||||
<style type="text/css">
|
||||
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
||||
|
@ -94,7 +95,9 @@ ul > li > * { color: black; }
|
|||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
#author {
|
||||
color: #527bbd;
|
||||
|
@ -223,7 +226,7 @@ div.exampleblock > div.content {
|
|||
}
|
||||
|
||||
div.imageblock div.content { padding-left: 0; }
|
||||
span.image img { border-style: none; }
|
||||
span.image img { border-style: none; vertical-align: text-bottom; }
|
||||
a.image:visited { color: white; }
|
||||
|
||||
dl {
|
||||
|
@ -433,7 +436,7 @@ thead, p.table.header {
|
|||
p.table {
|
||||
margin-top: 0;
|
||||
}
|
||||
/* Because the table frame attribute is overridden by CSS in most browsers. */
|
||||
/* Because the table frame attribute is overriden by CSS in most browsers. */
|
||||
div.tableblock > table[frame="void"] {
|
||||
border-style: none;
|
||||
}
|
||||
|
@ -748,6 +751,7 @@ nvme-get-feature(1) Manual Page
|
|||
<div class="verseblock">
|
||||
<pre class="content"><em>nvme get-feature</em> <device> [--namespace-id=<nsid> | -n <nsid>]
|
||||
[--feature-id=<fid> | -f <fid>] [--cdw11=<cdw11>]
|
||||
[--uuid-index=<uuid-index> | -U <uuid_index>]
|
||||
[--data-len=<data-len> | -l <data-len>]
|
||||
[--sel=<select> | -s <select>]
|
||||
[--raw-binary | -b]
|
||||
|
@ -847,6 +851,17 @@ cellspacing="0" cellpadding="4">
|
|||
</div>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-U <uuid-index>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--uuid-index=<uuid-index>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
UUID Index of the feature
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-l <data-len>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
|
@ -928,7 +943,14 @@ will be displayed to the user in as a hex dump:
|
|||
<div class="content">
|
||||
<pre><code># nvme get-feature /dev/nvme0 -f 0xc0 -l 512</code></pre>
|
||||
</div></div>
|
||||
<div class="paragraph"><p>Get feature with UUID index</p></div>
|
||||
</li>
|
||||
</ul></div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><code># nvme get-feature /dev/nvme0 -f 0xc0 -l 512 -U 0x1</code></pre>
|
||||
</div></div>
|
||||
<div class="ulist"><ul>
|
||||
<li>
|
||||
<p>
|
||||
The following retrieves the feature for the LBA Range Type, which
|
||||
|
@ -954,7 +976,8 @@ format:
|
|||
<div id="footnotes"><hr /></div>
|
||||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated 2018-02-07 09:54:27 MST
|
||||
Last updated
|
||||
2021-05-16 00:13:16 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -10,6 +10,7 @@ SYNOPSIS
|
|||
[verse]
|
||||
'nvme get-feature' <device> [--namespace-id=<nsid> | -n <nsid>]
|
||||
[--feature-id=<fid> | -f <fid>] [--cdw11=<cdw11>]
|
||||
[--uuid-index=<uuid-index> | -U <uuid_index>]
|
||||
[--data-len=<data-len> | -l <data-len>]
|
||||
[--sel=<select> | -s <select>]
|
||||
[--raw-binary | -b]
|
||||
|
@ -57,6 +58,10 @@ OPTIONS
|
|||
|4–7|Reserved
|
||||
|==================
|
||||
|
||||
-U <uuid-index>::
|
||||
--uuid-index=<uuid-index>::
|
||||
UUID Index of the feature
|
||||
|
||||
-l <data-len>::
|
||||
--data-len=<data-len>::
|
||||
The data length for the buffer returned for this feature. Most
|
||||
|
@ -102,6 +107,10 @@ will be displayed to the user in as a hex dump:
|
|||
# nvme get-feature /dev/nvme0 -f 0xc0 -l 512
|
||||
------------
|
||||
+
|
||||
Get feature with UUID index
|
||||
------------
|
||||
# nvme get-feature /dev/nvme0 -f 0xc0 -l 512 -U 0x1
|
||||
------------
|
||||
|
||||
* The following retrieves the feature for the LBA Range Type, which
|
||||
implicitly requires a buffer and will be saved to a file in its raw
|
||||
|
|
134
Documentation/nvme-get-lba-status.1
Normal file
134
Documentation/nvme-get-lba-status.1
Normal file
|
@ -0,0 +1,134 @@
|
|||
'\" t
|
||||
.\" Title: nvme-get-lba-status
|
||||
.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author]
|
||||
.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
|
||||
.\" Date: 05/11/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-GET\-LBA\-STAT" "1" "05/11/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.\" http://bugs.debian.org/507673
|
||||
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.ie \n(.g .ds Aq \(aq
|
||||
.el .ds Aq '
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * set default formatting
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" disable hyphenation
|
||||
.nh
|
||||
.\" disable justification (adjust text to left margin only)
|
||||
.ad l
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * MAIN CONTENT STARTS HERE *
|
||||
.\" -----------------------------------------------------------------
|
||||
.SH "NAME"
|
||||
nvme-get-lba-status \- Get LBA Status from NVMe device
|
||||
.SH "SYNOPSIS"
|
||||
.sp
|
||||
.nf
|
||||
\fInvme get\-lba\-status\fR <device> [\-\-namespace\-id=<nsid> | \-n <nsid>]
|
||||
[\-\-start\-lba=<slba> | \-s <slba>]
|
||||
[\-\-max\-dw=<max\-dw> | \-m <max\-dw>]
|
||||
[\-\-action=<action\-type> | \-a <action\-type>]
|
||||
[\-\-range\-len=<range\-len> | \-l <range\-len>]
|
||||
[\-\-timeout=<timeout> | \-t <timeout> ]
|
||||
[\-\-output\-format=<format> | \-o <format>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
For the NVMe device given, send an nvme Get LBA Status admin command and provides the results\&.
|
||||
.sp
|
||||
The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
|
||||
.sp
|
||||
On success, the returned get lba data structure may be returned in one of several ways depending on the option flags; the structure may parsed by the program and printed in a readable format or the raw buffer may be printed to stdout for another program to parse\&.
|
||||
.SH "OPTIONS"
|
||||
.PP
|
||||
\-n <nsid>, \-\-namespace\-id=<nsid>
|
||||
.RS 4
|
||||
Send the Get LBA Status command for the specified nsid\&. This can be used to override the default value for either character device (unspecified) or the block device (result from NVME_IOCTL_ID)\&.
|
||||
.RE
|
||||
.PP
|
||||
\-s <slba>, \-\-start\-lba=<slba>
|
||||
.RS 4
|
||||
Starting LBA(SLBA) in 64\-bit address of the first logical block addressed
|
||||
.RE
|
||||
.PP
|
||||
\-m <max\-dw>, \-\-max\-dw=<max\-dw>
|
||||
.RS 4
|
||||
Maximum Number of Dwords(MNDW) specifies maximum number of dwords to return
|
||||
.RE
|
||||
.PP
|
||||
\-a <action\-type>, \-\-action=<action\-type>
|
||||
.RS 4
|
||||
Action Type(ATYPE) specifies the mechanism it uses in determining the LBA Status Descriptors\&.
|
||||
.RE
|
||||
.PP
|
||||
\-l <range\-len>, \-\-range\-len=<range\-len>
|
||||
.RS 4
|
||||
Range Length(RL) specifies the length of the range of contiguous LBAs beginning at SLBA
|
||||
.RE
|
||||
.PP
|
||||
\-t <timeout>, \-\-timeout=<timeout>
|
||||
.RS 4
|
||||
Override default timeout value\&. In milliseconds\&.
|
||||
.RE
|
||||
.PP
|
||||
\-o <format>, \-\-output\-format=<format>
|
||||
.RS 4
|
||||
Set the reporting format to
|
||||
\fInormal\fR,
|
||||
\fIjson\fR, or
|
||||
\fIbinary\fR\&. Only one output format can be used at a time\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
.RS 4
|
||||
.ie n \{\
|
||||
\h'-04'\(bu\h'+03'\c
|
||||
.\}
|
||||
.el \{\
|
||||
.sp -1
|
||||
.IP \(bu 2.3
|
||||
.\}
|
||||
Get the LBA Status of the device using all defaults:
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
# nvme get\-lba\-status /dev/nvme0n1
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.RE
|
||||
.sp
|
||||
.RS 4
|
||||
.ie n \{\
|
||||
\h'-04'\(bu\h'+03'\c
|
||||
.\}
|
||||
.el \{\
|
||||
.sp -1
|
||||
.IP \(bu 2.3
|
||||
.\}
|
||||
Get LBA Status of the namespace 1 from SLBA 10 for the max Dwords of 0x1000
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
# nvme get\-lba\-status /dev/nvme0 \-\-namespace\-id=1 \-\-start\-lba=10 \-\-max\-dw=0x1000
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.RE
|
||||
.SH "NVME"
|
||||
.sp
|
||||
Part of the nvme\-user suite
|
903
Documentation/nvme-get-lba-status.html
Normal file
903
Documentation/nvme-get-lba-status.html
Normal file
|
@ -0,0 +1,903 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.10" />
|
||||
<title>nvme-get-lba-status(1)</title>
|
||||
<style type="text/css">
|
||||
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
||||
|
||||
/* Default font. */
|
||||
body {
|
||||
font-family: Georgia,serif;
|
||||
}
|
||||
|
||||
/* Title font. */
|
||||
h1, h2, h3, h4, h5, h6,
|
||||
div.title, caption.title,
|
||||
thead, p.table.header,
|
||||
#toctitle,
|
||||
#author, #revnumber, #revdate, #revremark,
|
||||
#footer {
|
||||
font-family: Arial,Helvetica,sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 1em 5% 1em 5%;
|
||||
}
|
||||
|
||||
a {
|
||||
color: blue;
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:visited {
|
||||
color: fuchsia;
|
||||
}
|
||||
|
||||
em {
|
||||
font-style: italic;
|
||||
color: navy;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: bold;
|
||||
color: #083194;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #527bbd;
|
||||
margin-top: 1.2em;
|
||||
margin-bottom: 0.5em;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
border-bottom: 2px solid silver;
|
||||
}
|
||||
h2 {
|
||||
padding-top: 0.5em;
|
||||
}
|
||||
h3 {
|
||||
float: left;
|
||||
}
|
||||
h3 + * {
|
||||
clear: left;
|
||||
}
|
||||
h5 {
|
||||
font-size: 1.0em;
|
||||
}
|
||||
|
||||
div.sectionbody {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: 1px solid silver;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
ul, ol, li > p {
|
||||
margin-top: 0;
|
||||
}
|
||||
ul > li { color: #aaa; }
|
||||
ul > li > * { color: black; }
|
||||
|
||||
.monospaced, code, pre {
|
||||
font-family: "Courier New", Courier, monospace;
|
||||
font-size: inherit;
|
||||
color: navy;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
#author {
|
||||
color: #527bbd;
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
#email {
|
||||
}
|
||||
#revnumber, #revdate, #revremark {
|
||||
}
|
||||
|
||||
#footer {
|
||||
font-size: small;
|
||||
border-top: 2px solid silver;
|
||||
padding-top: 0.5em;
|
||||
margin-top: 4.0em;
|
||||
}
|
||||
#footer-text {
|
||||
float: left;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
#footer-badges {
|
||||
float: right;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
|
||||
#preamble {
|
||||
margin-top: 1.5em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.imageblock, div.exampleblock, div.verseblock,
|
||||
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
|
||||
div.admonitionblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.admonitionblock {
|
||||
margin-top: 2.0em;
|
||||
margin-bottom: 2.0em;
|
||||
margin-right: 10%;
|
||||
color: #606060;
|
||||
}
|
||||
|
||||
div.content { /* Block element content. */
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* Block element titles. */
|
||||
div.title, caption.title {
|
||||
color: #527bbd;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
div.title + * {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
td div.title:first-child {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
div.content div.title:first-child {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
div.content + div.title {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
|
||||
div.sidebarblock > div.content {
|
||||
background: #ffffee;
|
||||
border: 1px solid #dddddd;
|
||||
border-left: 4px solid #f0f0f0;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.listingblock > div.content {
|
||||
border: 1px solid #dddddd;
|
||||
border-left: 5px solid #f0f0f0;
|
||||
background: #f8f8f8;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.quoteblock, div.verseblock {
|
||||
padding-left: 1.0em;
|
||||
margin-left: 1.0em;
|
||||
margin-right: 10%;
|
||||
border-left: 5px solid #f0f0f0;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
div.quoteblock > div.attribution {
|
||||
padding-top: 0.5em;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.verseblock > pre.content {
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
}
|
||||
div.verseblock > div.attribution {
|
||||
padding-top: 0.75em;
|
||||
text-align: left;
|
||||
}
|
||||
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
|
||||
div.verseblock + div.attribution {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.admonitionblock .icon {
|
||||
vertical-align: top;
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
text-decoration: underline;
|
||||
color: #527bbd;
|
||||
padding-right: 0.5em;
|
||||
}
|
||||
div.admonitionblock td.content {
|
||||
padding-left: 0.5em;
|
||||
border-left: 3px solid #dddddd;
|
||||
}
|
||||
|
||||
div.exampleblock > div.content {
|
||||
border-left: 3px solid #dddddd;
|
||||
padding-left: 0.5em;
|
||||
}
|
||||
|
||||
div.imageblock div.content { padding-left: 0; }
|
||||
span.image img { border-style: none; vertical-align: text-bottom; }
|
||||
a.image:visited { color: white; }
|
||||
|
||||
dl {
|
||||
margin-top: 0.8em;
|
||||
margin-bottom: 0.8em;
|
||||
}
|
||||
dt {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0;
|
||||
font-style: normal;
|
||||
color: navy;
|
||||
}
|
||||
dd > *:first-child {
|
||||
margin-top: 0.1em;
|
||||
}
|
||||
|
||||
ul, ol {
|
||||
list-style-position: outside;
|
||||
}
|
||||
ol.arabic {
|
||||
list-style-type: decimal;
|
||||
}
|
||||
ol.loweralpha {
|
||||
list-style-type: lower-alpha;
|
||||
}
|
||||
ol.upperalpha {
|
||||
list-style-type: upper-alpha;
|
||||
}
|
||||
ol.lowerroman {
|
||||
list-style-type: lower-roman;
|
||||
}
|
||||
ol.upperroman {
|
||||
list-style-type: upper-roman;
|
||||
}
|
||||
|
||||
div.compact ul, div.compact ol,
|
||||
div.compact p, div.compact p,
|
||||
div.compact div, div.compact div {
|
||||
margin-top: 0.1em;
|
||||
margin-bottom: 0.1em;
|
||||
}
|
||||
|
||||
tfoot {
|
||||
font-weight: bold;
|
||||
}
|
||||
td > div.verse {
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
div.hdlist {
|
||||
margin-top: 0.8em;
|
||||
margin-bottom: 0.8em;
|
||||
}
|
||||
div.hdlist tr {
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
dt.hdlist1.strong, td.hdlist1.strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
td.hdlist1 {
|
||||
vertical-align: top;
|
||||
font-style: normal;
|
||||
padding-right: 0.8em;
|
||||
color: navy;
|
||||
}
|
||||
td.hdlist2 {
|
||||
vertical-align: top;
|
||||
}
|
||||
div.hdlist.compact tr {
|
||||
margin: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.comment {
|
||||
background: yellow;
|
||||
}
|
||||
|
||||
.footnote, .footnoteref {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
span.footnote, span.footnoteref {
|
||||
vertical-align: super;
|
||||
}
|
||||
|
||||
#footnotes {
|
||||
margin: 20px 0 20px 0;
|
||||
padding: 7px 0 0 0;
|
||||
}
|
||||
|
||||
#footnotes div.footnote {
|
||||
margin: 0 0 5px 0;
|
||||
}
|
||||
|
||||
#footnotes hr {
|
||||
border: none;
|
||||
border-top: 1px solid silver;
|
||||
height: 1px;
|
||||
text-align: left;
|
||||
margin-left: 0;
|
||||
width: 20%;
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
div.colist td {
|
||||
padding-right: 0.5em;
|
||||
padding-bottom: 0.3em;
|
||||
vertical-align: top;
|
||||
}
|
||||
div.colist td img {
|
||||
margin-top: 0.3em;
|
||||
}
|
||||
|
||||
@media print {
|
||||
#footer-badges { display: none; }
|
||||
}
|
||||
|
||||
#toc {
|
||||
margin-bottom: 2.5em;
|
||||
}
|
||||
|
||||
#toctitle {
|
||||
color: #527bbd;
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 0.1em;
|
||||
}
|
||||
|
||||
div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
div.toclevel2 {
|
||||
margin-left: 2em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
div.toclevel3 {
|
||||
margin-left: 4em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
div.toclevel4 {
|
||||
margin-left: 6em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
span.aqua { color: aqua; }
|
||||
span.black { color: black; }
|
||||
span.blue { color: blue; }
|
||||
span.fuchsia { color: fuchsia; }
|
||||
span.gray { color: gray; }
|
||||
span.green { color: green; }
|
||||
span.lime { color: lime; }
|
||||
span.maroon { color: maroon; }
|
||||
span.navy { color: navy; }
|
||||
span.olive { color: olive; }
|
||||
span.purple { color: purple; }
|
||||
span.red { color: red; }
|
||||
span.silver { color: silver; }
|
||||
span.teal { color: teal; }
|
||||
span.white { color: white; }
|
||||
span.yellow { color: yellow; }
|
||||
|
||||
span.aqua-background { background: aqua; }
|
||||
span.black-background { background: black; }
|
||||
span.blue-background { background: blue; }
|
||||
span.fuchsia-background { background: fuchsia; }
|
||||
span.gray-background { background: gray; }
|
||||
span.green-background { background: green; }
|
||||
span.lime-background { background: lime; }
|
||||
span.maroon-background { background: maroon; }
|
||||
span.navy-background { background: navy; }
|
||||
span.olive-background { background: olive; }
|
||||
span.purple-background { background: purple; }
|
||||
span.red-background { background: red; }
|
||||
span.silver-background { background: silver; }
|
||||
span.teal-background { background: teal; }
|
||||
span.white-background { background: white; }
|
||||
span.yellow-background { background: yellow; }
|
||||
|
||||
span.big { font-size: 2em; }
|
||||
span.small { font-size: 0.6em; }
|
||||
|
||||
span.underline { text-decoration: underline; }
|
||||
span.overline { text-decoration: overline; }
|
||||
span.line-through { text-decoration: line-through; }
|
||||
|
||||
div.unbreakable { page-break-inside: avoid; }
|
||||
|
||||
|
||||
/*
|
||||
* xhtml11 specific
|
||||
*
|
||||
* */
|
||||
|
||||
div.tableblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.tableblock > table {
|
||||
border: 3px solid #527bbd;
|
||||
}
|
||||
thead, p.table.header {
|
||||
font-weight: bold;
|
||||
color: #527bbd;
|
||||
}
|
||||
p.table {
|
||||
margin-top: 0;
|
||||
}
|
||||
/* Because the table frame attribute is overriden by CSS in most browsers. */
|
||||
div.tableblock > table[frame="void"] {
|
||||
border-style: none;
|
||||
}
|
||||
div.tableblock > table[frame="hsides"] {
|
||||
border-left-style: none;
|
||||
border-right-style: none;
|
||||
}
|
||||
div.tableblock > table[frame="vsides"] {
|
||||
border-top-style: none;
|
||||
border-bottom-style: none;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* html5 specific
|
||||
*
|
||||
* */
|
||||
|
||||
table.tableblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
thead, p.tableblock.header {
|
||||
font-weight: bold;
|
||||
color: #527bbd;
|
||||
}
|
||||
p.tableblock {
|
||||
margin-top: 0;
|
||||
}
|
||||
table.tableblock {
|
||||
border-width: 3px;
|
||||
border-spacing: 0px;
|
||||
border-style: solid;
|
||||
border-color: #527bbd;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
th.tableblock, td.tableblock {
|
||||
border-width: 1px;
|
||||
padding: 4px;
|
||||
border-style: solid;
|
||||
border-color: #527bbd;
|
||||
}
|
||||
|
||||
table.tableblock.frame-topbot {
|
||||
border-left-style: hidden;
|
||||
border-right-style: hidden;
|
||||
}
|
||||
table.tableblock.frame-sides {
|
||||
border-top-style: hidden;
|
||||
border-bottom-style: hidden;
|
||||
}
|
||||
table.tableblock.frame-none {
|
||||
border-style: hidden;
|
||||
}
|
||||
|
||||
th.tableblock.halign-left, td.tableblock.halign-left {
|
||||
text-align: left;
|
||||
}
|
||||
th.tableblock.halign-center, td.tableblock.halign-center {
|
||||
text-align: center;
|
||||
}
|
||||
th.tableblock.halign-right, td.tableblock.halign-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
th.tableblock.valign-top, td.tableblock.valign-top {
|
||||
vertical-align: top;
|
||||
}
|
||||
th.tableblock.valign-middle, td.tableblock.valign-middle {
|
||||
vertical-align: middle;
|
||||
}
|
||||
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* manpage specific
|
||||
*
|
||||
* */
|
||||
|
||||
body.manpage h1 {
|
||||
padding-top: 0.5em;
|
||||
padding-bottom: 0.5em;
|
||||
border-top: 2px solid silver;
|
||||
border-bottom: 2px solid silver;
|
||||
}
|
||||
body.manpage h2 {
|
||||
border-style: none;
|
||||
}
|
||||
body.manpage div.sectionbody {
|
||||
margin-left: 3em;
|
||||
}
|
||||
|
||||
@media print {
|
||||
body.manpage div#toc { display: none; }
|
||||
}
|
||||
|
||||
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
/*<+'])');
|
||||
// Function that scans the DOM tree for header elements (the DOM2
|
||||
// nodeIterator API would be a better technique but not supported by all
|
||||
// browsers).
|
||||
var iterate = function (el) {
|
||||
for (var i = el.firstChild; i != null; i = i.nextSibling) {
|
||||
if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
|
||||
var mo = re.exec(i.tagName);
|
||||
if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
|
||||
result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
|
||||
}
|
||||
iterate(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
iterate(el);
|
||||
return result;
|
||||
}
|
||||
|
||||
var toc = document.getElementById("toc");
|
||||
if (!toc) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Delete existing TOC entries in case we're reloading the TOC.
|
||||
var tocEntriesToRemove = [];
|
||||
var i;
|
||||
for (i = 0; i < toc.childNodes.length; i++) {
|
||||
var entry = toc.childNodes[i];
|
||||
if (entry.nodeName.toLowerCase() == 'div'
|
||||
&& entry.getAttribute("class")
|
||||
&& entry.getAttribute("class").match(/^toclevel/))
|
||||
tocEntriesToRemove.push(entry);
|
||||
}
|
||||
for (i = 0; i < tocEntriesToRemove.length; i++) {
|
||||
toc.removeChild(tocEntriesToRemove[i]);
|
||||
}
|
||||
|
||||
// Rebuild TOC entries.
|
||||
var entries = tocEntries(document.getElementById("content"), toclevels);
|
||||
for (var i = 0; i < entries.length; ++i) {
|
||||
var entry = entries[i];
|
||||
if (entry.element.id == "")
|
||||
entry.element.id = "_toc_" + i;
|
||||
var a = document.createElement("a");
|
||||
a.href = "#" + entry.element.id;
|
||||
a.appendChild(document.createTextNode(entry.text));
|
||||
var div = document.createElement("div");
|
||||
div.appendChild(a);
|
||||
div.className = "toclevel" + entry.toclevel;
|
||||
toc.appendChild(div);
|
||||
}
|
||||
if (entries.length == 0)
|
||||
toc.parentNode.removeChild(toc);
|
||||
},
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// Footnotes generator
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
/* Based on footnote generation code from:
|
||||
* http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
|
||||
*/
|
||||
|
||||
footnotes: function () {
|
||||
// Delete existing footnote entries in case we're reloading the footnodes.
|
||||
var i;
|
||||
var noteholder = document.getElementById("footnotes");
|
||||
if (!noteholder) {
|
||||
return;
|
||||
}
|
||||
var entriesToRemove = [];
|
||||
for (i = 0; i < noteholder.childNodes.length; i++) {
|
||||
var entry = noteholder.childNodes[i];
|
||||
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
|
||||
entriesToRemove.push(entry);
|
||||
}
|
||||
for (i = 0; i < entriesToRemove.length; i++) {
|
||||
noteholder.removeChild(entriesToRemove[i]);
|
||||
}
|
||||
|
||||
// Rebuild footnote entries.
|
||||
var cont = document.getElementById("content");
|
||||
var spans = cont.getElementsByTagName("span");
|
||||
var refs = {};
|
||||
var n = 0;
|
||||
for (i=0; i<spans.length; i++) {
|
||||
if (spans[i].className == "footnote") {
|
||||
n++;
|
||||
var note = spans[i].getAttribute("data-note");
|
||||
if (!note) {
|
||||
// Use [\s\S] in place of . so multi-line matches work.
|
||||
// Because JavaScript has no s (dotall) regex flag.
|
||||
note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
|
||||
spans[i].innerHTML =
|
||||
"[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
|
||||
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
||||
spans[i].setAttribute("data-note", note);
|
||||
}
|
||||
noteholder.innerHTML +=
|
||||
"<div class='footnote' id='_footnote_" + n + "'>" +
|
||||
"<a href='#_footnoteref_" + n + "' title='Return to text'>" +
|
||||
n + "</a>. " + note + "</div>";
|
||||
var id =spans[i].getAttribute("id");
|
||||
if (id != null) refs["#"+id] = n;
|
||||
}
|
||||
}
|
||||
if (n == 0)
|
||||
noteholder.parentNode.removeChild(noteholder);
|
||||
else {
|
||||
// Process footnoterefs.
|
||||
for (i=0; i<spans.length; i++) {
|
||||
if (spans[i].className == "footnoteref") {
|
||||
var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
|
||||
href = href.match(/#.*/)[0]; // Because IE return full URL.
|
||||
n = refs[href];
|
||||
spans[i].innerHTML =
|
||||
"[<a href='#_footnote_" + n +
|
||||
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
install: function(toclevels) {
|
||||
var timerId;
|
||||
|
||||
function reinstall() {
|
||||
asciidoc.footnotes();
|
||||
if (toclevels) {
|
||||
asciidoc.toc(toclevels);
|
||||
}
|
||||
}
|
||||
|
||||
function reinstallAndRemoveTimer() {
|
||||
clearInterval(timerId);
|
||||
reinstall();
|
||||
}
|
||||
|
||||
timerId = setInterval(reinstall, 500);
|
||||
if (document.addEventListener)
|
||||
document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
|
||||
else
|
||||
window.onload = reinstallAndRemoveTimer;
|
||||
}
|
||||
|
||||
}
|
||||
asciidoc.install();
|
||||
/*]]>*/
|
||||
</script>
|
||||
</head>
|
||||
<body class="manpage">
|
||||
<div id="header">
|
||||
<h1>
|
||||
nvme-get-lba-status(1) Manual Page
|
||||
</h1>
|
||||
<h2>NAME</h2>
|
||||
<div class="sectionbody">
|
||||
<p>nvme-get-lba-status -
|
||||
Get LBA Status from NVMe device
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="content">
|
||||
<div class="sect1">
|
||||
<h2 id="_synopsis">SYNOPSIS</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="verseblock">
|
||||
<pre class="content"><em>nvme get-lba-status</em> <device> [--namespace-id=<nsid> | -n <nsid>]
|
||||
[--start-lba=<slba> | -s <slba>]
|
||||
[--max-dw=<max-dw> | -m <max-dw>]
|
||||
[--action=<action-type> | -a <action-type>]
|
||||
[--range-len=<range-len> | -l <range-len>]
|
||||
[--timeout=<timeout> | -t <timeout> ]
|
||||
[--output-format=<format> | -o <format>]</pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_description">DESCRIPTION</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>For the NVMe device given, send an nvme Get LBA Status admin command
|
||||
and provides the results.</p></div>
|
||||
<div class="paragraph"><p>The <device> parameter is mandatory and may be either the NVMe character
|
||||
device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></div>
|
||||
<div class="paragraph"><p>On success, the returned get lba data structure may be returned in one of
|
||||
several ways depending on the option flags; the structure may parsed by
|
||||
the program and printed in a readable format or the raw buffer may be
|
||||
printed to stdout for another program to parse.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_options">OPTIONS</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="dlist"><dl>
|
||||
<dt class="hdlist1">
|
||||
-n <nsid>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--namespace-id=<nsid>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Send the Get LBA Status command for the specified nsid. This can be
|
||||
used to override the default value for either character device
|
||||
(unspecified) or the block device (result from NVME_IOCTL_ID).
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-s <slba>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--start-lba=<slba>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Starting LBA(SLBA) in 64-bit address of the first logical block addressed
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-m <max-dw>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--max-dw=<max-dw>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Maximum Number of Dwords(MNDW) specifies maximum number of dwords to return
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-a <action-type>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--action=<action-type>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Action Type(ATYPE) specifies the mechanism it uses in determining the LBA Status Descriptors.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-l <range-len>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--range-len=<range-len>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Range Length(RL) specifies the length of the range of contiguous LBAs beginning at SLBA
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-t <timeout>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--timeout=<timeout>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Override default timeout value. In milliseconds.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-o <format>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--output-format=<format>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Set the reporting format to <em>normal</em>, <em>json</em>, or
|
||||
<em>binary</em>. Only one output format can be used at a time.
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_examples">EXAMPLES</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="ulist"><ul>
|
||||
<li>
|
||||
<p>
|
||||
Get the LBA Status of the device using all defaults:
|
||||
</p>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><code># nvme get-lba-status /dev/nvme0n1</code></pre>
|
||||
</div></div>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Get LBA Status of the namespace 1 from SLBA 10 for the max Dwords of 0x1000
|
||||
</p>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><code># nvme get-lba-status /dev/nvme0 --namespace-id=1 --start-lba=10 --max-dw=0x1000</code></pre>
|
||||
</div></div>
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_nvme">NVME</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>Part of the nvme-user suite</p></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footnotes"><hr /></div>
|
||||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated
|
||||
2021-05-11 11:28:04 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
82
Documentation/nvme-get-lba-status.txt
Normal file
82
Documentation/nvme-get-lba-status.txt
Normal file
|
@ -0,0 +1,82 @@
|
|||
nvme-get-lba-status(1)
|
||||
======================
|
||||
|
||||
NAME
|
||||
----
|
||||
nvme-get-lba-status - Get LBA Status from NVMe device
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'nvme get-lba-status' <device> [--namespace-id=<nsid> | -n <nsid>]
|
||||
[--start-lba=<slba> | -s <slba>]
|
||||
[--max-dw=<max-dw> | -m <max-dw>]
|
||||
[--action=<action-type> | -a <action-type>]
|
||||
[--range-len=<range-len> | -l <range-len>]
|
||||
[--timeout=<timeout> | -t <timeout> ]
|
||||
[--output-format=<format> | -o <format>]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
For the NVMe device given, send an nvme Get LBA Status admin command
|
||||
and provides the results.
|
||||
|
||||
The <device> parameter is mandatory and may be either the NVMe character
|
||||
device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
|
||||
|
||||
On success, the returned get lba data structure may be returned in one of
|
||||
several ways depending on the option flags; the structure may parsed by
|
||||
the program and printed in a readable format or the raw buffer may be
|
||||
printed to stdout for another program to parse.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
-n <nsid>::
|
||||
--namespace-id=<nsid>::
|
||||
Send the Get LBA Status command for the specified nsid. This can be
|
||||
used to override the default value for either character device
|
||||
(unspecified) or the block device (result from NVME_IOCTL_ID).
|
||||
|
||||
-s <slba>::
|
||||
--start-lba=<slba>::
|
||||
Starting LBA(SLBA) in 64-bit address of the first logical block addressed
|
||||
|
||||
-m <max-dw>::
|
||||
--max-dw=<max-dw>::
|
||||
Maximum Number of Dwords(MNDW) specifies maximum number of dwords to return
|
||||
|
||||
-a <action-type>::
|
||||
--action=<action-type>::
|
||||
Action Type(ATYPE) specifies the mechanism it uses in determining the LBA Status Descriptors.
|
||||
|
||||
-l <range-len>::
|
||||
--range-len=<range-len>::
|
||||
Range Length(RL) specifies the length of the range of contiguous LBAs beginning at SLBA
|
||||
|
||||
-t <timeout>::
|
||||
--timeout=<timeout>::
|
||||
Override default timeout value. In milliseconds.
|
||||
|
||||
-o <format>::
|
||||
--output-format=<format>::
|
||||
Set the reporting format to 'normal', 'json', or
|
||||
'binary'. Only one output format can be used at a time.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
* Get the LBA Status of the device using all defaults:
|
||||
+
|
||||
------------
|
||||
# nvme get-lba-status /dev/nvme0n1
|
||||
------------
|
||||
+
|
||||
|
||||
* Get LBA Status of the namespace 1 from SLBA 10 for the max Dwords of 0x1000
|
||||
+
|
||||
------------
|
||||
# nvme get-lba-status /dev/nvme0 --namespace-id=1 --start-lba=10 --max-dw=0x1000
|
||||
------------
|
||||
|
||||
NVME
|
||||
----
|
||||
Part of the nvme-user suite
|
|
@ -1,13 +1,13 @@
|
|||
'\" t
|
||||
.\" Title: nvme-get-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: 06/12/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-GET\-LOG" "1" "10/20/2020" "NVMe" "NVMe Manual"
|
||||
.TH "NVME\-GET\-LOG" "1" "06/12/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
|
@ -33,13 +33,16 @@ nvme-get-log \- Retrieves a log page from an NVMe device
|
|||
.sp
|
||||
.nf
|
||||
\fInvme get\-log\fR <device> [\-\-log\-id=<log\-id> | \-i <log\-id>]
|
||||
[\-\-log\-len=<log\-len> | \-l <log\-len>]
|
||||
[\-\-aen=<aen> | \-a <aen>]
|
||||
[\-\-namespace\-id=<nsid> | \-n <nsid>]
|
||||
[\-\-raw\-binary | \-b]
|
||||
[\-\-lpo=<offset> | \-o <offset>]
|
||||
[\-\-lsp=<field> | \-s <field>]
|
||||
[\-\-rae | \-r]
|
||||
[\-\-log\-len=<log\-len> | \-l <log\-len>]
|
||||
[\-\-aen=<aen> | \-a <aen>]
|
||||
[\-\-namespace\-id=<nsid> | \-n <nsid>]
|
||||
[\-\-raw\-binary | \-b]
|
||||
[\-\-lpo=<offset> | \-o <offset>]
|
||||
[\-\-lsp=<field> | \-s <field>]
|
||||
[\-\-lsi=<field> | \-S <field>]
|
||||
[\-\-rae | \-r]
|
||||
[\-\-csi=<command_set_identifier> | \-y <command_set_identifier>]
|
||||
[\-\-ot | \-O]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -85,10 +88,25 @@ The log page offset specifies the location within a log page to start returning
|
|||
The log specified field of LID\&.
|
||||
.RE
|
||||
.PP
|
||||
\-S <field>, \-\-lsi=<field>
|
||||
.RS 4
|
||||
The log specified field of Log Specific Identifier\&.
|
||||
.RE
|
||||
.PP
|
||||
\-r, \-\-rae
|
||||
.RS 4
|
||||
Retain an Asynchronous Event\&.
|
||||
.RE
|
||||
.PP
|
||||
\-y <command_set_identifier>, \-\-csi=<command_set_identifier>
|
||||
.RS 4
|
||||
This field specifies the identifier of command set\&. if not issued, NVM Command Set will be selected\&.
|
||||
.RE
|
||||
.PP
|
||||
\-O, \-\-ot
|
||||
.RS 4
|
||||
Offset Type
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
.RS 4
|
||||
|
|
|
@ -750,13 +750,16 @@ nvme-get-log(1) Manual Page
|
|||
<div class="sectionbody">
|
||||
<div class="verseblock">
|
||||
<pre class="content"><em>nvme get-log</em> <device> [--log-id=<log-id> | -i <log-id>]
|
||||
[--log-len=<log-len> | -l <log-len>]
|
||||
[--aen=<aen> | -a <aen>]
|
||||
[--namespace-id=<nsid> | -n <nsid>]
|
||||
[--raw-binary | -b]
|
||||
[--lpo=<offset> | -o <offset>]
|
||||
[--lsp=<field> | -s <field>]
|
||||
[--rae | -r]</pre>
|
||||
[--log-len=<log-len> | -l <log-len>]
|
||||
[--aen=<aen> | -a <aen>]
|
||||
[--namespace-id=<nsid> | -n <nsid>]
|
||||
[--raw-binary | -b]
|
||||
[--lpo=<offset> | -o <offset>]
|
||||
[--lsp=<field> | -s <field>]
|
||||
[--lsi=<field> | -S <field>]
|
||||
[--rae | -r]
|
||||
[--csi=<command_set_identifier> | -y <command_set_identifier>]
|
||||
[--ot | -O]</pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
</div>
|
||||
|
@ -864,6 +867,17 @@ program to parse.</p></div>
|
|||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-S <field>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--lsi=<field>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
The log specified field of Log Specific Identifier.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-r
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
|
@ -874,6 +888,29 @@ program to parse.</p></div>
|
|||
Retain an Asynchronous Event.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-y <command_set_identifier>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--csi=<command_set_identifier>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
This field specifies the identifier of command set.
|
||||
if not issued, NVM Command Set will be selected.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-O
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--ot
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Offset Type
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -918,7 +955,7 @@ Have the program return the raw log page in binary:
|
|||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated
|
||||
2019-09-18 00:00:58 JST
|
||||
2021-06-12 14:47:50 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -9,13 +9,16 @@ SYNOPSIS
|
|||
--------
|
||||
[verse]
|
||||
'nvme get-log' <device> [--log-id=<log-id> | -i <log-id>]
|
||||
[--log-len=<log-len> | -l <log-len>]
|
||||
[--aen=<aen> | -a <aen>]
|
||||
[--namespace-id=<nsid> | -n <nsid>]
|
||||
[--raw-binary | -b]
|
||||
[--lpo=<offset> | -o <offset>]
|
||||
[--lsp=<field> | -s <field>]
|
||||
[--rae | -r]
|
||||
[--log-len=<log-len> | -l <log-len>]
|
||||
[--aen=<aen> | -a <aen>]
|
||||
[--namespace-id=<nsid> | -n <nsid>]
|
||||
[--raw-binary | -b]
|
||||
[--lpo=<offset> | -o <offset>]
|
||||
[--lsp=<field> | -s <field>]
|
||||
[--lsi=<field> | -S <field>]
|
||||
[--rae | -r]
|
||||
[--csi=<command_set_identifier> | -y <command_set_identifier>]
|
||||
[--ot | -O]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
@ -68,10 +71,23 @@ OPTIONS
|
|||
--lsp=<field>::
|
||||
The log specified field of LID.
|
||||
|
||||
-S <field>::
|
||||
--lsi=<field>::
|
||||
The log specified field of Log Specific Identifier.
|
||||
|
||||
-r::
|
||||
--rae::
|
||||
Retain an Asynchronous Event.
|
||||
|
||||
-y <command_set_identifier>::
|
||||
--csi=<command_set_identifier>::
|
||||
This field specifies the identifier of command set.
|
||||
if not issued, NVM Command Set will be selected.
|
||||
|
||||
-O::
|
||||
--ot::
|
||||
Offset Type
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
* Get 512 bytes from log page 2
|
||||
|
|
62
Documentation/nvme-id-domain.1
Normal file
62
Documentation/nvme-id-domain.1
Normal file
|
@ -0,0 +1,62 @@
|
|||
'\" t
|
||||
.\" Title: nvme-id-domain
|
||||
.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author]
|
||||
.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
|
||||
.\" Date: 07/20/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-ID\-DOMAIN" "1" "07/20/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.\" http://bugs.debian.org/507673
|
||||
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.ie \n(.g .ds Aq \(aq
|
||||
.el .ds Aq '
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * set default formatting
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" disable hyphenation
|
||||
.nh
|
||||
.\" disable justification (adjust text to left margin only)
|
||||
.ad l
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * MAIN CONTENT STARTS HERE *
|
||||
.\" -----------------------------------------------------------------
|
||||
.SH "NAME"
|
||||
nvme-id-domain \- Send NVMe Identify Domain List, return result and structure
|
||||
.SH "SYNOPSIS"
|
||||
.sp
|
||||
.nf
|
||||
\fInvme id\-domain\fR <device> [\-\-dom\-id=<domian_id> | \-d <domian_id>]
|
||||
[\-o <fmt> | \-\-output\-format=<fmt>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
For the NVMe device given, send an identify command and return the domian list data structure\&.
|
||||
.sp
|
||||
The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
|
||||
.SH "OPTIONS"
|
||||
.PP
|
||||
\-d <domian_id>, \-\-dom\-id=<domian_id>
|
||||
.RS 4
|
||||
Retrieve the identify domain list data structure for the given domain id\&. If this value is not given, domain id will be 0xffff\&.
|
||||
.RE
|
||||
.PP
|
||||
\-o <format>, \-\-output\-format=<format>
|
||||
.RS 4
|
||||
Set the reporting format to
|
||||
\fInormal\fR,
|
||||
\fIjson\fR, or
|
||||
\fIbinary\fR\&. Only one output format can be used at a time\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
No examples yet\&.
|
||||
.SH "NVME"
|
||||
.sp
|
||||
Part of the nvme\-user suite
|
819
Documentation/nvme-id-domain.html
Normal file
819
Documentation/nvme-id-domain.html
Normal file
|
@ -0,0 +1,819 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.10" />
|
||||
<title>nvme-id-domain(1)</title>
|
||||
<style type="text/css">
|
||||
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
||||
|
||||
/* Default font. */
|
||||
body {
|
||||
font-family: Georgia,serif;
|
||||
}
|
||||
|
||||
/* Title font. */
|
||||
h1, h2, h3, h4, h5, h6,
|
||||
div.title, caption.title,
|
||||
thead, p.table.header,
|
||||
#toctitle,
|
||||
#author, #revnumber, #revdate, #revremark,
|
||||
#footer {
|
||||
font-family: Arial,Helvetica,sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 1em 5% 1em 5%;
|
||||
}
|
||||
|
||||
a {
|
||||
color: blue;
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:visited {
|
||||
color: fuchsia;
|
||||
}
|
||||
|
||||
em {
|
||||
font-style: italic;
|
||||
color: navy;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: bold;
|
||||
color: #083194;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #527bbd;
|
||||
margin-top: 1.2em;
|
||||
margin-bottom: 0.5em;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
border-bottom: 2px solid silver;
|
||||
}
|
||||
h2 {
|
||||
padding-top: 0.5em;
|
||||
}
|
||||
h3 {
|
||||
float: left;
|
||||
}
|
||||
h3 + * {
|
||||
clear: left;
|
||||
}
|
||||
h5 {
|
||||
font-size: 1.0em;
|
||||
}
|
||||
|
||||
div.sectionbody {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: 1px solid silver;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
ul, ol, li > p {
|
||||
margin-top: 0;
|
||||
}
|
||||
ul > li { color: #aaa; }
|
||||
ul > li > * { color: black; }
|
||||
|
||||
.monospaced, code, pre {
|
||||
font-family: "Courier New", Courier, monospace;
|
||||
font-size: inherit;
|
||||
color: navy;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
#author {
|
||||
color: #527bbd;
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
#email {
|
||||
}
|
||||
#revnumber, #revdate, #revremark {
|
||||
}
|
||||
|
||||
#footer {
|
||||
font-size: small;
|
||||
border-top: 2px solid silver;
|
||||
padding-top: 0.5em;
|
||||
margin-top: 4.0em;
|
||||
}
|
||||
#footer-text {
|
||||
float: left;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
#footer-badges {
|
||||
float: right;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
|
||||
#preamble {
|
||||
margin-top: 1.5em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.imageblock, div.exampleblock, div.verseblock,
|
||||
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
|
||||
div.admonitionblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.admonitionblock {
|
||||
margin-top: 2.0em;
|
||||
margin-bottom: 2.0em;
|
||||
margin-right: 10%;
|
||||
color: #606060;
|
||||
}
|
||||
|
||||
div.content { /* Block element content. */
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* Block element titles. */
|
||||
div.title, caption.title {
|
||||
color: #527bbd;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
div.title + * {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
td div.title:first-child {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
div.content div.title:first-child {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
div.content + div.title {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
|
||||
div.sidebarblock > div.content {
|
||||
background: #ffffee;
|
||||
border: 1px solid #dddddd;
|
||||
border-left: 4px solid #f0f0f0;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.listingblock > div.content {
|
||||
border: 1px solid #dddddd;
|
||||
border-left: 5px solid #f0f0f0;
|
||||
background: #f8f8f8;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.quoteblock, div.verseblock {
|
||||
padding-left: 1.0em;
|
||||
margin-left: 1.0em;
|
||||
margin-right: 10%;
|
||||
border-left: 5px solid #f0f0f0;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
div.quoteblock > div.attribution {
|
||||
padding-top: 0.5em;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.verseblock > pre.content {
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
}
|
||||
div.verseblock > div.attribution {
|
||||
padding-top: 0.75em;
|
||||
text-align: left;
|
||||
}
|
||||
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
|
||||
div.verseblock + div.attribution {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.admonitionblock .icon {
|
||||
vertical-align: top;
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
text-decoration: underline;
|
||||
color: #527bbd;
|
||||
padding-right: 0.5em;
|
||||
}
|
||||
div.admonitionblock td.content {
|
||||
padding-left: 0.5em;
|
||||
border-left: 3px solid #dddddd;
|
||||
}
|
||||
|
||||
div.exampleblock > div.content {
|
||||
border-left: 3px solid #dddddd;
|
||||
padding-left: 0.5em;
|
||||
}
|
||||
|
||||
div.imageblock div.content { padding-left: 0; }
|
||||
span.image img { border-style: none; vertical-align: text-bottom; }
|
||||
a.image:visited { color: white; }
|
||||
|
||||
dl {
|
||||
margin-top: 0.8em;
|
||||
margin-bottom: 0.8em;
|
||||
}
|
||||
dt {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0;
|
||||
font-style: normal;
|
||||
color: navy;
|
||||
}
|
||||
dd > *:first-child {
|
||||
margin-top: 0.1em;
|
||||
}
|
||||
|
||||
ul, ol {
|
||||
list-style-position: outside;
|
||||
}
|
||||
ol.arabic {
|
||||
list-style-type: decimal;
|
||||
}
|
||||
ol.loweralpha {
|
||||
list-style-type: lower-alpha;
|
||||
}
|
||||
ol.upperalpha {
|
||||
list-style-type: upper-alpha;
|
||||
}
|
||||
ol.lowerroman {
|
||||
list-style-type: lower-roman;
|
||||
}
|
||||
ol.upperroman {
|
||||
list-style-type: upper-roman;
|
||||
}
|
||||
|
||||
div.compact ul, div.compact ol,
|
||||
div.compact p, div.compact p,
|
||||
div.compact div, div.compact div {
|
||||
margin-top: 0.1em;
|
||||
margin-bottom: 0.1em;
|
||||
}
|
||||
|
||||
tfoot {
|
||||
font-weight: bold;
|
||||
}
|
||||
td > div.verse {
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
div.hdlist {
|
||||
margin-top: 0.8em;
|
||||
margin-bottom: 0.8em;
|
||||
}
|
||||
div.hdlist tr {
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
dt.hdlist1.strong, td.hdlist1.strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
td.hdlist1 {
|
||||
vertical-align: top;
|
||||
font-style: normal;
|
||||
padding-right: 0.8em;
|
||||
color: navy;
|
||||
}
|
||||
td.hdlist2 {
|
||||
vertical-align: top;
|
||||
}
|
||||
div.hdlist.compact tr {
|
||||
margin: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.comment {
|
||||
background: yellow;
|
||||
}
|
||||
|
||||
.footnote, .footnoteref {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
span.footnote, span.footnoteref {
|
||||
vertical-align: super;
|
||||
}
|
||||
|
||||
#footnotes {
|
||||
margin: 20px 0 20px 0;
|
||||
padding: 7px 0 0 0;
|
||||
}
|
||||
|
||||
#footnotes div.footnote {
|
||||
margin: 0 0 5px 0;
|
||||
}
|
||||
|
||||
#footnotes hr {
|
||||
border: none;
|
||||
border-top: 1px solid silver;
|
||||
height: 1px;
|
||||
text-align: left;
|
||||
margin-left: 0;
|
||||
width: 20%;
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
div.colist td {
|
||||
padding-right: 0.5em;
|
||||
padding-bottom: 0.3em;
|
||||
vertical-align: top;
|
||||
}
|
||||
div.colist td img {
|
||||
margin-top: 0.3em;
|
||||
}
|
||||
|
||||
@media print {
|
||||
#footer-badges { display: none; }
|
||||
}
|
||||
|
||||
#toc {
|
||||
margin-bottom: 2.5em;
|
||||
}
|
||||
|
||||
#toctitle {
|
||||
color: #527bbd;
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 0.1em;
|
||||
}
|
||||
|
||||
div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
div.toclevel2 {
|
||||
margin-left: 2em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
div.toclevel3 {
|
||||
margin-left: 4em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
div.toclevel4 {
|
||||
margin-left: 6em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
span.aqua { color: aqua; }
|
||||
span.black { color: black; }
|
||||
span.blue { color: blue; }
|
||||
span.fuchsia { color: fuchsia; }
|
||||
span.gray { color: gray; }
|
||||
span.green { color: green; }
|
||||
span.lime { color: lime; }
|
||||
span.maroon { color: maroon; }
|
||||
span.navy { color: navy; }
|
||||
span.olive { color: olive; }
|
||||
span.purple { color: purple; }
|
||||
span.red { color: red; }
|
||||
span.silver { color: silver; }
|
||||
span.teal { color: teal; }
|
||||
span.white { color: white; }
|
||||
span.yellow { color: yellow; }
|
||||
|
||||
span.aqua-background { background: aqua; }
|
||||
span.black-background { background: black; }
|
||||
span.blue-background { background: blue; }
|
||||
span.fuchsia-background { background: fuchsia; }
|
||||
span.gray-background { background: gray; }
|
||||
span.green-background { background: green; }
|
||||
span.lime-background { background: lime; }
|
||||
span.maroon-background { background: maroon; }
|
||||
span.navy-background { background: navy; }
|
||||
span.olive-background { background: olive; }
|
||||
span.purple-background { background: purple; }
|
||||
span.red-background { background: red; }
|
||||
span.silver-background { background: silver; }
|
||||
span.teal-background { background: teal; }
|
||||
span.white-background { background: white; }
|
||||
span.yellow-background { background: yellow; }
|
||||
|
||||
span.big { font-size: 2em; }
|
||||
span.small { font-size: 0.6em; }
|
||||
|
||||
span.underline { text-decoration: underline; }
|
||||
span.overline { text-decoration: overline; }
|
||||
span.line-through { text-decoration: line-through; }
|
||||
|
||||
div.unbreakable { page-break-inside: avoid; }
|
||||
|
||||
|
||||
/*
|
||||
* xhtml11 specific
|
||||
*
|
||||
* */
|
||||
|
||||
div.tableblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.tableblock > table {
|
||||
border: 3px solid #527bbd;
|
||||
}
|
||||
thead, p.table.header {
|
||||
font-weight: bold;
|
||||
color: #527bbd;
|
||||
}
|
||||
p.table {
|
||||
margin-top: 0;
|
||||
}
|
||||
/* Because the table frame attribute is overriden by CSS in most browsers. */
|
||||
div.tableblock > table[frame="void"] {
|
||||
border-style: none;
|
||||
}
|
||||
div.tableblock > table[frame="hsides"] {
|
||||
border-left-style: none;
|
||||
border-right-style: none;
|
||||
}
|
||||
div.tableblock > table[frame="vsides"] {
|
||||
border-top-style: none;
|
||||
border-bottom-style: none;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* html5 specific
|
||||
*
|
||||
* */
|
||||
|
||||
table.tableblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
thead, p.tableblock.header {
|
||||
font-weight: bold;
|
||||
color: #527bbd;
|
||||
}
|
||||
p.tableblock {
|
||||
margin-top: 0;
|
||||
}
|
||||
table.tableblock {
|
||||
border-width: 3px;
|
||||
border-spacing: 0px;
|
||||
border-style: solid;
|
||||
border-color: #527bbd;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
th.tableblock, td.tableblock {
|
||||
border-width: 1px;
|
||||
padding: 4px;
|
||||
border-style: solid;
|
||||
border-color: #527bbd;
|
||||
}
|
||||
|
||||
table.tableblock.frame-topbot {
|
||||
border-left-style: hidden;
|
||||
border-right-style: hidden;
|
||||
}
|
||||
table.tableblock.frame-sides {
|
||||
border-top-style: hidden;
|
||||
border-bottom-style: hidden;
|
||||
}
|
||||
table.tableblock.frame-none {
|
||||
border-style: hidden;
|
||||
}
|
||||
|
||||
th.tableblock.halign-left, td.tableblock.halign-left {
|
||||
text-align: left;
|
||||
}
|
||||
th.tableblock.halign-center, td.tableblock.halign-center {
|
||||
text-align: center;
|
||||
}
|
||||
th.tableblock.halign-right, td.tableblock.halign-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
th.tableblock.valign-top, td.tableblock.valign-top {
|
||||
vertical-align: top;
|
||||
}
|
||||
th.tableblock.valign-middle, td.tableblock.valign-middle {
|
||||
vertical-align: middle;
|
||||
}
|
||||
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* manpage specific
|
||||
*
|
||||
* */
|
||||
|
||||
body.manpage h1 {
|
||||
padding-top: 0.5em;
|
||||
padding-bottom: 0.5em;
|
||||
border-top: 2px solid silver;
|
||||
border-bottom: 2px solid silver;
|
||||
}
|
||||
body.manpage h2 {
|
||||
border-style: none;
|
||||
}
|
||||
body.manpage div.sectionbody {
|
||||
margin-left: 3em;
|
||||
}
|
||||
|
||||
@media print {
|
||||
body.manpage div#toc { display: none; }
|
||||
}
|
||||
|
||||
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
/*<+'])');
|
||||
// Function that scans the DOM tree for header elements (the DOM2
|
||||
// nodeIterator API would be a better technique but not supported by all
|
||||
// browsers).
|
||||
var iterate = function (el) {
|
||||
for (var i = el.firstChild; i != null; i = i.nextSibling) {
|
||||
if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
|
||||
var mo = re.exec(i.tagName);
|
||||
if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
|
||||
result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
|
||||
}
|
||||
iterate(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
iterate(el);
|
||||
return result;
|
||||
}
|
||||
|
||||
var toc = document.getElementById("toc");
|
||||
if (!toc) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Delete existing TOC entries in case we're reloading the TOC.
|
||||
var tocEntriesToRemove = [];
|
||||
var i;
|
||||
for (i = 0; i < toc.childNodes.length; i++) {
|
||||
var entry = toc.childNodes[i];
|
||||
if (entry.nodeName.toLowerCase() == 'div'
|
||||
&& entry.getAttribute("class")
|
||||
&& entry.getAttribute("class").match(/^toclevel/))
|
||||
tocEntriesToRemove.push(entry);
|
||||
}
|
||||
for (i = 0; i < tocEntriesToRemove.length; i++) {
|
||||
toc.removeChild(tocEntriesToRemove[i]);
|
||||
}
|
||||
|
||||
// Rebuild TOC entries.
|
||||
var entries = tocEntries(document.getElementById("content"), toclevels);
|
||||
for (var i = 0; i < entries.length; ++i) {
|
||||
var entry = entries[i];
|
||||
if (entry.element.id == "")
|
||||
entry.element.id = "_toc_" + i;
|
||||
var a = document.createElement("a");
|
||||
a.href = "#" + entry.element.id;
|
||||
a.appendChild(document.createTextNode(entry.text));
|
||||
var div = document.createElement("div");
|
||||
div.appendChild(a);
|
||||
div.className = "toclevel" + entry.toclevel;
|
||||
toc.appendChild(div);
|
||||
}
|
||||
if (entries.length == 0)
|
||||
toc.parentNode.removeChild(toc);
|
||||
},
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// Footnotes generator
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
/* Based on footnote generation code from:
|
||||
* http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
|
||||
*/
|
||||
|
||||
footnotes: function () {
|
||||
// Delete existing footnote entries in case we're reloading the footnodes.
|
||||
var i;
|
||||
var noteholder = document.getElementById("footnotes");
|
||||
if (!noteholder) {
|
||||
return;
|
||||
}
|
||||
var entriesToRemove = [];
|
||||
for (i = 0; i < noteholder.childNodes.length; i++) {
|
||||
var entry = noteholder.childNodes[i];
|
||||
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
|
||||
entriesToRemove.push(entry);
|
||||
}
|
||||
for (i = 0; i < entriesToRemove.length; i++) {
|
||||
noteholder.removeChild(entriesToRemove[i]);
|
||||
}
|
||||
|
||||
// Rebuild footnote entries.
|
||||
var cont = document.getElementById("content");
|
||||
var spans = cont.getElementsByTagName("span");
|
||||
var refs = {};
|
||||
var n = 0;
|
||||
for (i=0; i<spans.length; i++) {
|
||||
if (spans[i].className == "footnote") {
|
||||
n++;
|
||||
var note = spans[i].getAttribute("data-note");
|
||||
if (!note) {
|
||||
// Use [\s\S] in place of . so multi-line matches work.
|
||||
// Because JavaScript has no s (dotall) regex flag.
|
||||
note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
|
||||
spans[i].innerHTML =
|
||||
"[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
|
||||
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
||||
spans[i].setAttribute("data-note", note);
|
||||
}
|
||||
noteholder.innerHTML +=
|
||||
"<div class='footnote' id='_footnote_" + n + "'>" +
|
||||
"<a href='#_footnoteref_" + n + "' title='Return to text'>" +
|
||||
n + "</a>. " + note + "</div>";
|
||||
var id =spans[i].getAttribute("id");
|
||||
if (id != null) refs["#"+id] = n;
|
||||
}
|
||||
}
|
||||
if (n == 0)
|
||||
noteholder.parentNode.removeChild(noteholder);
|
||||
else {
|
||||
// Process footnoterefs.
|
||||
for (i=0; i<spans.length; i++) {
|
||||
if (spans[i].className == "footnoteref") {
|
||||
var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
|
||||
href = href.match(/#.*/)[0]; // Because IE return full URL.
|
||||
n = refs[href];
|
||||
spans[i].innerHTML =
|
||||
"[<a href='#_footnote_" + n +
|
||||
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
install: function(toclevels) {
|
||||
var timerId;
|
||||
|
||||
function reinstall() {
|
||||
asciidoc.footnotes();
|
||||
if (toclevels) {
|
||||
asciidoc.toc(toclevels);
|
||||
}
|
||||
}
|
||||
|
||||
function reinstallAndRemoveTimer() {
|
||||
clearInterval(timerId);
|
||||
reinstall();
|
||||
}
|
||||
|
||||
timerId = setInterval(reinstall, 500);
|
||||
if (document.addEventListener)
|
||||
document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
|
||||
else
|
||||
window.onload = reinstallAndRemoveTimer;
|
||||
}
|
||||
|
||||
}
|
||||
asciidoc.install();
|
||||
/*]]>*/
|
||||
</script>
|
||||
</head>
|
||||
<body class="manpage">
|
||||
<div id="header">
|
||||
<h1>
|
||||
nvme-id-domain(1) Manual Page
|
||||
</h1>
|
||||
<h2>NAME</h2>
|
||||
<div class="sectionbody">
|
||||
<p>nvme-id-domain -
|
||||
Send NVMe Identify Domain List, return result and structure
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="content">
|
||||
<div class="sect1">
|
||||
<h2 id="_synopsis">SYNOPSIS</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="verseblock">
|
||||
<pre class="content"><em>nvme id-domain</em> <device> [--dom-id=<domian_id> | -d <domian_id>]
|
||||
[-o <fmt> | --output-format=<fmt>]</pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_description">DESCRIPTION</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>For the NVMe device given, send an identify command and return the domian list
|
||||
data structure.</p></div>
|
||||
<div class="paragraph"><p>The <device> parameter is mandatory and may be either the NVMe character
|
||||
device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_options">OPTIONS</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="dlist"><dl>
|
||||
<dt class="hdlist1">
|
||||
-d <domian_id>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--dom-id=<domian_id>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Retrieve the identify domain list data structure for the given
|
||||
domain id. If this value is not given, domain id will be 0xffff.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-o <format>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--output-format=<format>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Set the reporting format to <em>normal</em>, <em>json</em>, or
|
||||
<em>binary</em>. Only one output format can be used at a time.
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_examples">EXAMPLES</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>No examples yet.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_nvme">NVME</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>Part of the nvme-user suite</p></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footnotes"><hr /></div>
|
||||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated
|
||||
2021-07-20 12:04:44 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
40
Documentation/nvme-id-domain.txt
Normal file
40
Documentation/nvme-id-domain.txt
Normal file
|
@ -0,0 +1,40 @@
|
|||
nvme-id-domain(1)
|
||||
=================
|
||||
|
||||
NAME
|
||||
----
|
||||
nvme-id-domain - Send NVMe Identify Domain List, return result and structure
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'nvme id-domain' <device> [--dom-id=<domian_id> | -d <domian_id>]
|
||||
[-o <fmt> | --output-format=<fmt>]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
For the NVMe device given, send an identify command and return the domian list
|
||||
data structure.
|
||||
|
||||
The <device> parameter is mandatory and may be either the NVMe character
|
||||
device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
-d <domian_id>::
|
||||
--dom-id=<domian_id>::
|
||||
Retrieve the identify domain list data structure for the given
|
||||
domain id. If this value is not given, domain id will be 0xffff.
|
||||
|
||||
-o <format>::
|
||||
--output-format=<format>::
|
||||
Set the reporting format to 'normal', 'json', or
|
||||
'binary'. Only one output format can be used at a time.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
No examples yet.
|
||||
|
||||
NVME
|
||||
----
|
||||
Part of the nvme-user suite
|
|
@ -1,13 +1,13 @@
|
|||
'\" t
|
||||
.\" Title: nvme-id-iocs
|
||||
.\" 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: 05/28/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-ID\-IOCS" "1" "10/20/2020" "NVMe" "NVMe Manual"
|
||||
.TH "NVME\-ID\-IOCS" "1" "05/28/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
|
@ -33,6 +33,7 @@ nvme-id-iocs \- Send NVMe Identify I/O Command Set, return result and structure
|
|||
.sp
|
||||
.nf
|
||||
\fInvme id\-iocs\fR <device> [\-\-controller\-id=<cntid> | \-c <cntid>]
|
||||
[\-o <fmt> | \-\-output\-format=<fmt>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -45,6 +46,19 @@ The <device> parameter is mandatory and may be either the NVMe character device
|
|||
.RS 4
|
||||
Retrieve the identify I/O Command set data structure for the given cntid\&. If this value is not given, cntid will be 0xffff\&.
|
||||
.RE
|
||||
.PP
|
||||
\-H, \-\-human\-readable
|
||||
.RS 4
|
||||
This option will parse and format many of the bit fields into human\-readable formats\&.
|
||||
.RE
|
||||
.PP
|
||||
\-o <format>, \-\-output\-format=<format>
|
||||
.RS 4
|
||||
Set the reporting format to
|
||||
\fInormal\fR,
|
||||
\fIjson\fR, or
|
||||
\fIbinary\fR\&. Only one output format can be used at a time\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
.RS 4
|
||||
|
@ -67,6 +81,27 @@ Have the program interpret the returned buffer and display the known fields in a
|
|||
.RE
|
||||
.\}
|
||||
.RE
|
||||
.sp
|
||||
.RS 4
|
||||
.ie n \{\
|
||||
\h'-04'\(bu\h'+03'\c
|
||||
.\}
|
||||
.el \{\
|
||||
.sp -1
|
||||
.IP \(bu 2.3
|
||||
.\}
|
||||
show the fields in human readable format
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
# nvme id\-iocs /dev/nvme0 \-H
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.RE
|
||||
.SH "NVME"
|
||||
.sp
|
||||
Part of the nvme\-user suite
|
||||
|
|
|
@ -749,7 +749,8 @@ nvme-id-iocs(1) Manual Page
|
|||
<h2 id="_synopsis">SYNOPSIS</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="verseblock">
|
||||
<pre class="content"><em>nvme id-iocs</em> <device> [--controller-id=<cntid> | -c <cntid>]</pre>
|
||||
<pre class="content"><em>nvme id-iocs</em> <device> [--controller-id=<cntid> | -c <cntid>]
|
||||
[-o <fmt> | --output-format=<fmt>]</pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
</div>
|
||||
|
@ -779,6 +780,30 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></di
|
|||
cntid. If this value is not given, cntid will be 0xffff.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-H
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--human-readable
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
This option will parse and format many of the bit fields
|
||||
into human-readable formats.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-o <format>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--output-format=<format>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Set the reporting format to <em>normal</em>, <em>json</em>, or
|
||||
<em>binary</em>. Only one output format can be used at a time.
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -796,6 +821,15 @@ fields in a human readable format:
|
|||
<pre><code># nvme id-iocs /dev/nvme0</code></pre>
|
||||
</div></div>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
show the fields in human readable format
|
||||
</p>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><code># nvme id-iocs /dev/nvme0 -H</code></pre>
|
||||
</div></div>
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -810,7 +844,7 @@ fields in a human readable format:
|
|||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated
|
||||
2020-05-06 10:39:59 CEST
|
||||
2021-05-28 23:15:06 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -9,6 +9,7 @@ SYNOPSIS
|
|||
--------
|
||||
[verse]
|
||||
'nvme id-iocs' <device> [--controller-id=<cntid> | -c <cntid>]
|
||||
[-o <fmt> | --output-format=<fmt>]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
@ -24,6 +25,15 @@ OPTIONS
|
|||
--controller-id=<cntid>::
|
||||
Retrieve the identify I/O Command set data structure for the given
|
||||
cntid. If this value is not given, cntid will be 0xffff.
|
||||
-H::
|
||||
--human-readable::
|
||||
This option will parse and format many of the bit fields
|
||||
into human-readable formats.
|
||||
|
||||
-o <format>::
|
||||
--output-format=<format>::
|
||||
Set the reporting format to 'normal', 'json', or
|
||||
'binary'. Only one output format can be used at a time.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
|
@ -33,7 +43,12 @@ fields in a human readable format:
|
|||
------------
|
||||
# nvme id-iocs /dev/nvme0
|
||||
------------
|
||||
|
||||
+
|
||||
* show the fields in human readable format
|
||||
+
|
||||
------------
|
||||
# nvme id-iocs /dev/nvme0 -H
|
||||
------------
|
||||
NVME
|
||||
----
|
||||
Part of the nvme-user suite
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
'\" t
|
||||
.\" Title: nvme-io-passthru
|
||||
.\" 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: 06/04/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-IO\-PASSTHRU" "1" "10/20/2020" "NVMe" "NVMe Manual"
|
||||
.TH "NVME\-IO\-PASSTHRU" "1" "06/04/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
|
@ -47,6 +47,7 @@ nvme-io-passthru \- Submit an arbitrary io command, return results
|
|||
[\-\-dry\-run | \-d]
|
||||
[\-\-raw\-binary | \-b]
|
||||
[\-\-prefill=<prefill> | \-p <prefill>]
|
||||
[\-\-latency | \-T]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -125,6 +126,11 @@ Print the raw returned buffer to stdout if the command returns data or a structu
|
|||
.RS 4
|
||||
Prefill the buffer with a predetermined byte value\&. Defaults to 0\&. This may be useful if the data you are writing is shorter than the required buffer, and you need to pad it with a known value\&. It may also be useful if you need to confirm if a device is overwriting a buffer on a data\-in command\&.
|
||||
.RE
|
||||
.PP
|
||||
\-T, \-\-latency
|
||||
.RS 4
|
||||
Print out the latency the IOCTL took (in us)\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
nvme io\-passthru /dev/nvme0n1 \-\-opcode=2 \-\-namespace\-id=1 \-\-data\-len=4096 \-\-read \-\-cdw10=0 \-\-cdw11=0 \-\-cdw12=0x70000 \-\-raw\-binary
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.9" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.10" />
|
||||
<title>nvme-io-passthru(1)</title>
|
||||
<style type="text/css">
|
||||
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
||||
|
@ -435,7 +436,7 @@ thead, p.table.header {
|
|||
p.table {
|
||||
margin-top: 0;
|
||||
}
|
||||
/* Because the table frame attribute is overridden by CSS in most browsers. */
|
||||
/* Because the table frame attribute is overriden by CSS in most browsers. */
|
||||
div.tableblock > table[frame="void"] {
|
||||
border-style: none;
|
||||
}
|
||||
|
@ -762,7 +763,8 @@ nvme-io-passthru(1) Manual Page
|
|||
[--show-command | -s]
|
||||
[--dry-run | -d]
|
||||
[--raw-binary | -b]
|
||||
[--prefill=<prefill> | -p <prefill>]</pre>
|
||||
[--prefill=<prefill> | -p <prefill>]
|
||||
[--latency | -T]</pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
</div>
|
||||
|
@ -944,6 +946,17 @@ printed to stdout for another program to parse.</p></div>
|
|||
is overwriting a buffer on a data-in command.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-T
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--latency
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Print out the latency the IOCTL took (in us).
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -964,7 +977,7 @@ printed to stdout for another program to parse.</p></div>
|
|||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated
|
||||
2018-01-30 19:28:39 KST
|
||||
2021-06-04 10:59:48 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -23,6 +23,7 @@ SYNOPSIS
|
|||
[--dry-run | -d]
|
||||
[--raw-binary | -b]
|
||||
[--prefill=<prefill> | -p <prefill>]
|
||||
[--latency | -T]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
@ -106,6 +107,10 @@ OPTIONS
|
|||
value. It may also be useful if you need to confirm if a device
|
||||
is overwriting a buffer on a data-in command.
|
||||
|
||||
-T::
|
||||
--latency::
|
||||
Print out the latency the IOCTL took (in us).
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
'\" t
|
||||
.\" Title: nvme-id-ns
|
||||
.\" 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: 05/16/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-ID\-NS" "1" "10/20/2020" "NVMe" "NVMe Manual"
|
||||
.TH "NVME\-ID\-NS" "1" "05/16/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
|
@ -33,7 +33,7 @@ nvme-list-ctrl \- Send NVMe Identify List Controllers, return result and structu
|
|||
.sp
|
||||
.nf
|
||||
\fInvme list\-ctrl\fR <device> [\-\-cntid=<cntid> | \-c <cntid>]
|
||||
[\-\-namespace\-id=<nsid> | \-n <nsid>]
|
||||
[\-\-namespace\-id=<nsid> | \-n <nsid>] [\-o <fmt> | \-\-output\-format=<fmt>]
|
||||
DESCRIPTION
|
||||
.fi
|
||||
.sp
|
||||
|
@ -62,6 +62,14 @@ Retrieve the identify list structure starting with the given controller id\&.
|
|||
.RS 4
|
||||
If provided, will request the controllers attached to the specified namespace\&. If no namespace is given, or set to 0, the command requests the controller list for the entire subsystem, whether or not they are attached to namespace(s)\&.
|
||||
.RE
|
||||
.PP
|
||||
\-o <format>, \-\-output\-format=<format>
|
||||
.RS 4
|
||||
Set the reporting format to
|
||||
\fInormal\fR
|
||||
or
|
||||
\fIjson\fR\&. Only one output format can be used at a time\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
No examples yet\&.
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.10" />
|
||||
<title>nvme-id-ns(1)</title>
|
||||
<style type="text/css">
|
||||
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
||||
|
@ -94,7 +95,9 @@ ul > li > * { color: black; }
|
|||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
#author {
|
||||
color: #527bbd;
|
||||
|
@ -223,7 +226,7 @@ div.exampleblock > div.content {
|
|||
}
|
||||
|
||||
div.imageblock div.content { padding-left: 0; }
|
||||
span.image img { border-style: none; }
|
||||
span.image img { border-style: none; vertical-align: text-bottom; }
|
||||
a.image:visited { color: white; }
|
||||
|
||||
dl {
|
||||
|
@ -433,7 +436,7 @@ thead, p.table.header {
|
|||
p.table {
|
||||
margin-top: 0;
|
||||
}
|
||||
/* Because the table frame attribute is overridden by CSS in most browsers. */
|
||||
/* Because the table frame attribute is overriden by CSS in most browsers. */
|
||||
div.tableblock > table[frame="void"] {
|
||||
border-style: none;
|
||||
}
|
||||
|
@ -747,7 +750,7 @@ nvme-id-ns(1) Manual Page
|
|||
<div class="sectionbody">
|
||||
<div class="verseblock">
|
||||
<pre class="content"><em>nvme list-ctrl</em> <device> [--cntid=<cntid> | -c <cntid>]
|
||||
[--namespace-id=<nsid> | -n <nsid>]
|
||||
[--namespace-id=<nsid> | -n <nsid>] [-o <fmt> | --output-format=<fmt>]
|
||||
DESCRIPTION</pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
|
@ -793,6 +796,18 @@ OPTIONS</code></pre>
|
|||
whether or not they are attached to namespace(s).
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-o <format>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--output-format=<format>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Set the reporting format to <em>normal</em> or <em>json</em>. Only one output
|
||||
format can be used at a time.
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -812,7 +827,8 @@ OPTIONS</code></pre>
|
|||
<div id="footnotes"><hr /></div>
|
||||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated 2016-05-16 12:47:42 EDT
|
||||
Last updated
|
||||
2021-05-16 13:00:43 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -9,7 +9,7 @@ SYNOPSIS
|
|||
--------
|
||||
[verse]
|
||||
'nvme list-ctrl' <device> [--cntid=<cntid> | -c <cntid>]
|
||||
[--namespace-id=<nsid> | -n <nsid>]
|
||||
[--namespace-id=<nsid> | -n <nsid>] [-o <fmt> | --output-format=<fmt>]
|
||||
DESCRIPTION
|
||||
-----------
|
||||
For the NVMe device given, sends an identify command for controller list
|
||||
|
@ -37,6 +37,11 @@ OPTIONS
|
|||
command requests the controller list for the entire subsystem,
|
||||
whether or not they are attached to namespace(s).
|
||||
|
||||
-o <format>::
|
||||
--output-format=<format>::
|
||||
Set the reporting format to 'normal' or 'json'. Only one output
|
||||
format can be used at a time.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
No examples yet.
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
'\" t
|
||||
.\" Title: nvme-id-ns
|
||||
.\" 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: 05/16/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-ID\-NS" "1" "10/20/2020" "NVMe" "NVMe Manual"
|
||||
.TH "NVME\-ID\-NS" "1" "05/16/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
|
@ -34,7 +34,7 @@ nvme-list-ns \- Send NVMe Identify List Namespaces, return result and structure
|
|||
.nf
|
||||
\fInvme list\-ns\fR <device> [\-\-namespace\-id=<nsid> | \-n <nsid>]
|
||||
[\-\-csi=<command_set_identifier> | \-y <command_set_identifier>]
|
||||
[\-\-all | \-a]
|
||||
[\-\-all | \-a] [\-\-output\-format=<fmt> | \-o <fmt>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -59,9 +59,56 @@ If this value is given, retrieve the identify list structure associated with the
|
|||
.RS 4
|
||||
Retrieve the identify list structure for all namespaces in the subsystem, whether attached or inactive\&.
|
||||
.RE
|
||||
.PP
|
||||
\-o <format>, \-\-output\-format=<format>
|
||||
.RS 4
|
||||
Set the reporting format to
|
||||
\fInormal\fR, or
|
||||
\fIjson\fR\&. Only one output format can be used at a time\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
No examples yet\&.
|
||||
.RS 4
|
||||
.ie n \{\
|
||||
\h'-04'\(bu\h'+03'\c
|
||||
.\}
|
||||
.el \{\
|
||||
.sp -1
|
||||
.IP \(bu 2.3
|
||||
.\}
|
||||
Print the namespaces present for zoned command set in JSON format
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
# nvme list\-ns /dev/nvme0 \-y 2 \-a \-o json
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.RE
|
||||
.sp
|
||||
.RS 4
|
||||
.ie n \{\
|
||||
\h'-04'\(bu\h'+03'\c
|
||||
.\}
|
||||
.el \{\
|
||||
.sp -1
|
||||
.IP \(bu 2.3
|
||||
.\}
|
||||
Print the namespaces present for NVM Command Set in normal format
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
# nvme list\-ns /dev/nvme0
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.RE
|
||||
.SH "NVME"
|
||||
.sp
|
||||
Part of the nvme\-user suite
|
||||
|
|
|
@ -751,7 +751,7 @@ nvme-id-ns(1) Manual Page
|
|||
<div class="verseblock">
|
||||
<pre class="content"><em>nvme list-ns</em> <device> [--namespace-id=<nsid> | -n <nsid>]
|
||||
[--csi=<command_set_identifier> | -y <command_set_identifier>]
|
||||
[--all | -a]</pre>
|
||||
[--all | -a] [--output-format=<fmt> | -o <fmt>]</pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
</div>
|
||||
|
@ -808,13 +808,44 @@ a valid nsid.</p></div>
|
|||
subsystem, whether attached or inactive.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-o <format>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--output-format=<format>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Set the reporting format to <em>normal</em>, or <em>json</em>.
|
||||
Only one output format can be used at a time.
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_examples">EXAMPLES</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>No examples yet.</p></div>
|
||||
<div class="ulist"><ul>
|
||||
<li>
|
||||
<p>
|
||||
Print the namespaces present for zoned command set in JSON format
|
||||
</p>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><code># nvme list-ns /dev/nvme0 -y 2 -a -o json</code></pre>
|
||||
</div></div>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Print the namespaces present for NVM Command Set in normal format
|
||||
</p>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><code># nvme list-ns /dev/nvme0</code></pre>
|
||||
</div></div>
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
|
@ -828,7 +859,7 @@ a valid nsid.</p></div>
|
|||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated
|
||||
2020-05-06 10:35:44 CEST
|
||||
2021-05-16 10:13:29 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -10,7 +10,7 @@ SYNOPSIS
|
|||
[verse]
|
||||
'nvme list-ns' <device> [--namespace-id=<nsid> | -n <nsid>]
|
||||
[--csi=<command_set_identifier> | -y <command_set_identifier>]
|
||||
[--all | -a]
|
||||
[--all | -a] [--output-format=<fmt> | -o <fmt>]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
@ -41,9 +41,24 @@ OPTIONS
|
|||
Retrieve the identify list structure for all namespaces in the
|
||||
subsystem, whether attached or inactive.
|
||||
|
||||
-o <format>::
|
||||
--output-format=<format>::
|
||||
Set the reporting format to 'normal', or 'json'.
|
||||
Only one output format can be used at a time.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
No examples yet.
|
||||
* Print the namespaces present for zoned command set in JSON format
|
||||
+
|
||||
------------
|
||||
# nvme list-ns /dev/nvme0 -y 2 -a -o json
|
||||
------------
|
||||
|
||||
* Print the namespaces present for NVM Command Set in normal format
|
||||
+
|
||||
------------
|
||||
# nvme list-ns /dev/nvme0
|
||||
------------
|
||||
|
||||
NVME
|
||||
----
|
||||
|
|
87
Documentation/nvme-micron-smart-add-log.1
Normal file
87
Documentation/nvme-micron-smart-add-log.1
Normal file
|
@ -0,0 +1,87 @@
|
|||
'\" t
|
||||
.\" Title: nvme-micron-smart-add-log
|
||||
.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author]
|
||||
.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
|
||||
.\" Date: 05/31/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-MICRON\-SMART\" "1" "05/31/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.\" http://bugs.debian.org/507673
|
||||
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.ie \n(.g .ds Aq \(aq
|
||||
.el .ds Aq '
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * set default formatting
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" disable hyphenation
|
||||
.nh
|
||||
.\" disable justification (adjust text to left margin only)
|
||||
.ad l
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * MAIN CONTENT STARTS HERE *
|
||||
.\" -----------------------------------------------------------------
|
||||
.SH "NAME"
|
||||
nvme-micron-smart-add-log \- Retrieves NAND statistics (2200 model drives) or Extended SMART information (OCP complaint models) of given micron device
|
||||
.SH "SYNOPSIS"
|
||||
.sp
|
||||
.nf
|
||||
\fInvme micron vs\-smart\-add\-log\fR <device> \-f <json|normal>
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
This command prints NAND information (Total bytes written, Bad block count and Erase failures etc) for the given micron device if its of 2200 model controller\&. For OCP complaint controllers this command print extended SMART health data along with NAND information (if available)
|
||||
.sp
|
||||
The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
|
||||
.sp
|
||||
The \fI\-f\fR option controls the displayed output data format based on the option value\&. If the option value is \fIjson\fR (which is enabled by default), output data is printed in JSON format\&. If option value is \fInormal\fR the output is displayed in non\-JSON format\&.
|
||||
.sp
|
||||
This will only work on Micron devices devices of model numbers 54XX and OCP complaint controllers\&. Support for new devices may be added subsequently\&.
|
||||
.SH "OPTIONS"
|
||||
.sp
|
||||
\-f <json|normal> controls the format of displayed output\&.
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
.RS 4
|
||||
.ie n \{\
|
||||
\h'-04'\(bu\h'+03'\c
|
||||
.\}
|
||||
.el \{\
|
||||
.sp -1
|
||||
.IP \(bu 2.3
|
||||
.\}
|
||||
Retrieve NAND/extended SMART data and display in json format
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
# nvme micron vs\-nand\-stats /dev/nvme0
|
||||
|
||||
* Retrieve NAND/extended SMART data and display in non\-json format
|
||||
+
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.RE
|
||||
.sp
|
||||
# nvme micron vs\-nand\-stats /dev/nvme0 \-f normal
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
NVME
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.sp
|
||||
Part of the nvme\-user suite
|
815
Documentation/nvme-micron-smart-add-log.html
Normal file
815
Documentation/nvme-micron-smart-add-log.html
Normal file
|
@ -0,0 +1,815 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.10" />
|
||||
<title>nvme-micron-smart-add-log(1)</title>
|
||||
<style type="text/css">
|
||||
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
||||
|
||||
/* Default font. */
|
||||
body {
|
||||
font-family: Georgia,serif;
|
||||
}
|
||||
|
||||
/* Title font. */
|
||||
h1, h2, h3, h4, h5, h6,
|
||||
div.title, caption.title,
|
||||
thead, p.table.header,
|
||||
#toctitle,
|
||||
#author, #revnumber, #revdate, #revremark,
|
||||
#footer {
|
||||
font-family: Arial,Helvetica,sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 1em 5% 1em 5%;
|
||||
}
|
||||
|
||||
a {
|
||||
color: blue;
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:visited {
|
||||
color: fuchsia;
|
||||
}
|
||||
|
||||
em {
|
||||
font-style: italic;
|
||||
color: navy;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: bold;
|
||||
color: #083194;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #527bbd;
|
||||
margin-top: 1.2em;
|
||||
margin-bottom: 0.5em;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
border-bottom: 2px solid silver;
|
||||
}
|
||||
h2 {
|
||||
padding-top: 0.5em;
|
||||
}
|
||||
h3 {
|
||||
float: left;
|
||||
}
|
||||
h3 + * {
|
||||
clear: left;
|
||||
}
|
||||
h5 {
|
||||
font-size: 1.0em;
|
||||
}
|
||||
|
||||
div.sectionbody {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: 1px solid silver;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
ul, ol, li > p {
|
||||
margin-top: 0;
|
||||
}
|
||||
ul > li { color: #aaa; }
|
||||
ul > li > * { color: black; }
|
||||
|
||||
.monospaced, code, pre {
|
||||
font-family: "Courier New", Courier, monospace;
|
||||
font-size: inherit;
|
||||
color: navy;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
#author {
|
||||
color: #527bbd;
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
#email {
|
||||
}
|
||||
#revnumber, #revdate, #revremark {
|
||||
}
|
||||
|
||||
#footer {
|
||||
font-size: small;
|
||||
border-top: 2px solid silver;
|
||||
padding-top: 0.5em;
|
||||
margin-top: 4.0em;
|
||||
}
|
||||
#footer-text {
|
||||
float: left;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
#footer-badges {
|
||||
float: right;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
|
||||
#preamble {
|
||||
margin-top: 1.5em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.imageblock, div.exampleblock, div.verseblock,
|
||||
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
|
||||
div.admonitionblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.admonitionblock {
|
||||
margin-top: 2.0em;
|
||||
margin-bottom: 2.0em;
|
||||
margin-right: 10%;
|
||||
color: #606060;
|
||||
}
|
||||
|
||||
div.content { /* Block element content. */
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* Block element titles. */
|
||||
div.title, caption.title {
|
||||
color: #527bbd;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
div.title + * {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
td div.title:first-child {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
div.content div.title:first-child {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
div.content + div.title {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
|
||||
div.sidebarblock > div.content {
|
||||
background: #ffffee;
|
||||
border: 1px solid #dddddd;
|
||||
border-left: 4px solid #f0f0f0;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.listingblock > div.content {
|
||||
border: 1px solid #dddddd;
|
||||
border-left: 5px solid #f0f0f0;
|
||||
background: #f8f8f8;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.quoteblock, div.verseblock {
|
||||
padding-left: 1.0em;
|
||||
margin-left: 1.0em;
|
||||
margin-right: 10%;
|
||||
border-left: 5px solid #f0f0f0;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
div.quoteblock > div.attribution {
|
||||
padding-top: 0.5em;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.verseblock > pre.content {
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
}
|
||||
div.verseblock > div.attribution {
|
||||
padding-top: 0.75em;
|
||||
text-align: left;
|
||||
}
|
||||
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
|
||||
div.verseblock + div.attribution {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.admonitionblock .icon {
|
||||
vertical-align: top;
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
text-decoration: underline;
|
||||
color: #527bbd;
|
||||
padding-right: 0.5em;
|
||||
}
|
||||
div.admonitionblock td.content {
|
||||
padding-left: 0.5em;
|
||||
border-left: 3px solid #dddddd;
|
||||
}
|
||||
|
||||
div.exampleblock > div.content {
|
||||
border-left: 3px solid #dddddd;
|
||||
padding-left: 0.5em;
|
||||
}
|
||||
|
||||
div.imageblock div.content { padding-left: 0; }
|
||||
span.image img { border-style: none; vertical-align: text-bottom; }
|
||||
a.image:visited { color: white; }
|
||||
|
||||
dl {
|
||||
margin-top: 0.8em;
|
||||
margin-bottom: 0.8em;
|
||||
}
|
||||
dt {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0;
|
||||
font-style: normal;
|
||||
color: navy;
|
||||
}
|
||||
dd > *:first-child {
|
||||
margin-top: 0.1em;
|
||||
}
|
||||
|
||||
ul, ol {
|
||||
list-style-position: outside;
|
||||
}
|
||||
ol.arabic {
|
||||
list-style-type: decimal;
|
||||
}
|
||||
ol.loweralpha {
|
||||
list-style-type: lower-alpha;
|
||||
}
|
||||
ol.upperalpha {
|
||||
list-style-type: upper-alpha;
|
||||
}
|
||||
ol.lowerroman {
|
||||
list-style-type: lower-roman;
|
||||
}
|
||||
ol.upperroman {
|
||||
list-style-type: upper-roman;
|
||||
}
|
||||
|
||||
div.compact ul, div.compact ol,
|
||||
div.compact p, div.compact p,
|
||||
div.compact div, div.compact div {
|
||||
margin-top: 0.1em;
|
||||
margin-bottom: 0.1em;
|
||||
}
|
||||
|
||||
tfoot {
|
||||
font-weight: bold;
|
||||
}
|
||||
td > div.verse {
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
div.hdlist {
|
||||
margin-top: 0.8em;
|
||||
margin-bottom: 0.8em;
|
||||
}
|
||||
div.hdlist tr {
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
dt.hdlist1.strong, td.hdlist1.strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
td.hdlist1 {
|
||||
vertical-align: top;
|
||||
font-style: normal;
|
||||
padding-right: 0.8em;
|
||||
color: navy;
|
||||
}
|
||||
td.hdlist2 {
|
||||
vertical-align: top;
|
||||
}
|
||||
div.hdlist.compact tr {
|
||||
margin: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.comment {
|
||||
background: yellow;
|
||||
}
|
||||
|
||||
.footnote, .footnoteref {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
span.footnote, span.footnoteref {
|
||||
vertical-align: super;
|
||||
}
|
||||
|
||||
#footnotes {
|
||||
margin: 20px 0 20px 0;
|
||||
padding: 7px 0 0 0;
|
||||
}
|
||||
|
||||
#footnotes div.footnote {
|
||||
margin: 0 0 5px 0;
|
||||
}
|
||||
|
||||
#footnotes hr {
|
||||
border: none;
|
||||
border-top: 1px solid silver;
|
||||
height: 1px;
|
||||
text-align: left;
|
||||
margin-left: 0;
|
||||
width: 20%;
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
div.colist td {
|
||||
padding-right: 0.5em;
|
||||
padding-bottom: 0.3em;
|
||||
vertical-align: top;
|
||||
}
|
||||
div.colist td img {
|
||||
margin-top: 0.3em;
|
||||
}
|
||||
|
||||
@media print {
|
||||
#footer-badges { display: none; }
|
||||
}
|
||||
|
||||
#toc {
|
||||
margin-bottom: 2.5em;
|
||||
}
|
||||
|
||||
#toctitle {
|
||||
color: #527bbd;
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 0.1em;
|
||||
}
|
||||
|
||||
div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
div.toclevel2 {
|
||||
margin-left: 2em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
div.toclevel3 {
|
||||
margin-left: 4em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
div.toclevel4 {
|
||||
margin-left: 6em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
span.aqua { color: aqua; }
|
||||
span.black { color: black; }
|
||||
span.blue { color: blue; }
|
||||
span.fuchsia { color: fuchsia; }
|
||||
span.gray { color: gray; }
|
||||
span.green { color: green; }
|
||||
span.lime { color: lime; }
|
||||
span.maroon { color: maroon; }
|
||||
span.navy { color: navy; }
|
||||
span.olive { color: olive; }
|
||||
span.purple { color: purple; }
|
||||
span.red { color: red; }
|
||||
span.silver { color: silver; }
|
||||
span.teal { color: teal; }
|
||||
span.white { color: white; }
|
||||
span.yellow { color: yellow; }
|
||||
|
||||
span.aqua-background { background: aqua; }
|
||||
span.black-background { background: black; }
|
||||
span.blue-background { background: blue; }
|
||||
span.fuchsia-background { background: fuchsia; }
|
||||
span.gray-background { background: gray; }
|
||||
span.green-background { background: green; }
|
||||
span.lime-background { background: lime; }
|
||||
span.maroon-background { background: maroon; }
|
||||
span.navy-background { background: navy; }
|
||||
span.olive-background { background: olive; }
|
||||
span.purple-background { background: purple; }
|
||||
span.red-background { background: red; }
|
||||
span.silver-background { background: silver; }
|
||||
span.teal-background { background: teal; }
|
||||
span.white-background { background: white; }
|
||||
span.yellow-background { background: yellow; }
|
||||
|
||||
span.big { font-size: 2em; }
|
||||
span.small { font-size: 0.6em; }
|
||||
|
||||
span.underline { text-decoration: underline; }
|
||||
span.overline { text-decoration: overline; }
|
||||
span.line-through { text-decoration: line-through; }
|
||||
|
||||
div.unbreakable { page-break-inside: avoid; }
|
||||
|
||||
|
||||
/*
|
||||
* xhtml11 specific
|
||||
*
|
||||
* */
|
||||
|
||||
div.tableblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.tableblock > table {
|
||||
border: 3px solid #527bbd;
|
||||
}
|
||||
thead, p.table.header {
|
||||
font-weight: bold;
|
||||
color: #527bbd;
|
||||
}
|
||||
p.table {
|
||||
margin-top: 0;
|
||||
}
|
||||
/* Because the table frame attribute is overriden by CSS in most browsers. */
|
||||
div.tableblock > table[frame="void"] {
|
||||
border-style: none;
|
||||
}
|
||||
div.tableblock > table[frame="hsides"] {
|
||||
border-left-style: none;
|
||||
border-right-style: none;
|
||||
}
|
||||
div.tableblock > table[frame="vsides"] {
|
||||
border-top-style: none;
|
||||
border-bottom-style: none;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* html5 specific
|
||||
*
|
||||
* */
|
||||
|
||||
table.tableblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
thead, p.tableblock.header {
|
||||
font-weight: bold;
|
||||
color: #527bbd;
|
||||
}
|
||||
p.tableblock {
|
||||
margin-top: 0;
|
||||
}
|
||||
table.tableblock {
|
||||
border-width: 3px;
|
||||
border-spacing: 0px;
|
||||
border-style: solid;
|
||||
border-color: #527bbd;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
th.tableblock, td.tableblock {
|
||||
border-width: 1px;
|
||||
padding: 4px;
|
||||
border-style: solid;
|
||||
border-color: #527bbd;
|
||||
}
|
||||
|
||||
table.tableblock.frame-topbot {
|
||||
border-left-style: hidden;
|
||||
border-right-style: hidden;
|
||||
}
|
||||
table.tableblock.frame-sides {
|
||||
border-top-style: hidden;
|
||||
border-bottom-style: hidden;
|
||||
}
|
||||
table.tableblock.frame-none {
|
||||
border-style: hidden;
|
||||
}
|
||||
|
||||
th.tableblock.halign-left, td.tableblock.halign-left {
|
||||
text-align: left;
|
||||
}
|
||||
th.tableblock.halign-center, td.tableblock.halign-center {
|
||||
text-align: center;
|
||||
}
|
||||
th.tableblock.halign-right, td.tableblock.halign-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
th.tableblock.valign-top, td.tableblock.valign-top {
|
||||
vertical-align: top;
|
||||
}
|
||||
th.tableblock.valign-middle, td.tableblock.valign-middle {
|
||||
vertical-align: middle;
|
||||
}
|
||||
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* manpage specific
|
||||
*
|
||||
* */
|
||||
|
||||
body.manpage h1 {
|
||||
padding-top: 0.5em;
|
||||
padding-bottom: 0.5em;
|
||||
border-top: 2px solid silver;
|
||||
border-bottom: 2px solid silver;
|
||||
}
|
||||
body.manpage h2 {
|
||||
border-style: none;
|
||||
}
|
||||
body.manpage div.sectionbody {
|
||||
margin-left: 3em;
|
||||
}
|
||||
|
||||
@media print {
|
||||
body.manpage div#toc { display: none; }
|
||||
}
|
||||
|
||||
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
/*<+'])');
|
||||
// Function that scans the DOM tree for header elements (the DOM2
|
||||
// nodeIterator API would be a better technique but not supported by all
|
||||
// browsers).
|
||||
var iterate = function (el) {
|
||||
for (var i = el.firstChild; i != null; i = i.nextSibling) {
|
||||
if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
|
||||
var mo = re.exec(i.tagName);
|
||||
if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
|
||||
result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
|
||||
}
|
||||
iterate(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
iterate(el);
|
||||
return result;
|
||||
}
|
||||
|
||||
var toc = document.getElementById("toc");
|
||||
if (!toc) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Delete existing TOC entries in case we're reloading the TOC.
|
||||
var tocEntriesToRemove = [];
|
||||
var i;
|
||||
for (i = 0; i < toc.childNodes.length; i++) {
|
||||
var entry = toc.childNodes[i];
|
||||
if (entry.nodeName.toLowerCase() == 'div'
|
||||
&& entry.getAttribute("class")
|
||||
&& entry.getAttribute("class").match(/^toclevel/))
|
||||
tocEntriesToRemove.push(entry);
|
||||
}
|
||||
for (i = 0; i < tocEntriesToRemove.length; i++) {
|
||||
toc.removeChild(tocEntriesToRemove[i]);
|
||||
}
|
||||
|
||||
// Rebuild TOC entries.
|
||||
var entries = tocEntries(document.getElementById("content"), toclevels);
|
||||
for (var i = 0; i < entries.length; ++i) {
|
||||
var entry = entries[i];
|
||||
if (entry.element.id == "")
|
||||
entry.element.id = "_toc_" + i;
|
||||
var a = document.createElement("a");
|
||||
a.href = "#" + entry.element.id;
|
||||
a.appendChild(document.createTextNode(entry.text));
|
||||
var div = document.createElement("div");
|
||||
div.appendChild(a);
|
||||
div.className = "toclevel" + entry.toclevel;
|
||||
toc.appendChild(div);
|
||||
}
|
||||
if (entries.length == 0)
|
||||
toc.parentNode.removeChild(toc);
|
||||
},
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// Footnotes generator
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
/* Based on footnote generation code from:
|
||||
* http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
|
||||
*/
|
||||
|
||||
footnotes: function () {
|
||||
// Delete existing footnote entries in case we're reloading the footnodes.
|
||||
var i;
|
||||
var noteholder = document.getElementById("footnotes");
|
||||
if (!noteholder) {
|
||||
return;
|
||||
}
|
||||
var entriesToRemove = [];
|
||||
for (i = 0; i < noteholder.childNodes.length; i++) {
|
||||
var entry = noteholder.childNodes[i];
|
||||
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
|
||||
entriesToRemove.push(entry);
|
||||
}
|
||||
for (i = 0; i < entriesToRemove.length; i++) {
|
||||
noteholder.removeChild(entriesToRemove[i]);
|
||||
}
|
||||
|
||||
// Rebuild footnote entries.
|
||||
var cont = document.getElementById("content");
|
||||
var spans = cont.getElementsByTagName("span");
|
||||
var refs = {};
|
||||
var n = 0;
|
||||
for (i=0; i<spans.length; i++) {
|
||||
if (spans[i].className == "footnote") {
|
||||
n++;
|
||||
var note = spans[i].getAttribute("data-note");
|
||||
if (!note) {
|
||||
// Use [\s\S] in place of . so multi-line matches work.
|
||||
// Because JavaScript has no s (dotall) regex flag.
|
||||
note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
|
||||
spans[i].innerHTML =
|
||||
"[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
|
||||
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
||||
spans[i].setAttribute("data-note", note);
|
||||
}
|
||||
noteholder.innerHTML +=
|
||||
"<div class='footnote' id='_footnote_" + n + "'>" +
|
||||
"<a href='#_footnoteref_" + n + "' title='Return to text'>" +
|
||||
n + "</a>. " + note + "</div>";
|
||||
var id =spans[i].getAttribute("id");
|
||||
if (id != null) refs["#"+id] = n;
|
||||
}
|
||||
}
|
||||
if (n == 0)
|
||||
noteholder.parentNode.removeChild(noteholder);
|
||||
else {
|
||||
// Process footnoterefs.
|
||||
for (i=0; i<spans.length; i++) {
|
||||
if (spans[i].className == "footnoteref") {
|
||||
var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
|
||||
href = href.match(/#.*/)[0]; // Because IE return full URL.
|
||||
n = refs[href];
|
||||
spans[i].innerHTML =
|
||||
"[<a href='#_footnote_" + n +
|
||||
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
install: function(toclevels) {
|
||||
var timerId;
|
||||
|
||||
function reinstall() {
|
||||
asciidoc.footnotes();
|
||||
if (toclevels) {
|
||||
asciidoc.toc(toclevels);
|
||||
}
|
||||
}
|
||||
|
||||
function reinstallAndRemoveTimer() {
|
||||
clearInterval(timerId);
|
||||
reinstall();
|
||||
}
|
||||
|
||||
timerId = setInterval(reinstall, 500);
|
||||
if (document.addEventListener)
|
||||
document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
|
||||
else
|
||||
window.onload = reinstallAndRemoveTimer;
|
||||
}
|
||||
|
||||
}
|
||||
asciidoc.install();
|
||||
/*]]>*/
|
||||
</script>
|
||||
</head>
|
||||
<body class="manpage">
|
||||
<div id="header">
|
||||
<h1>
|
||||
nvme-micron-smart-add-log(1) Manual Page
|
||||
</h1>
|
||||
<h2>NAME</h2>
|
||||
<div class="sectionbody">
|
||||
<p>nvme-micron-smart-add-log -
|
||||
Retrieves NAND statistics (2200 model drives) or Extended SMART information (OCP complaint models) of given micron device
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="content">
|
||||
<div class="sect1">
|
||||
<h2 id="_synopsis">SYNOPSIS</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="verseblock">
|
||||
<pre class="content"><em>nvme micron vs-smart-add-log</em> <device> -f <json|normal></pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_description">DESCRIPTION</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>This command prints NAND information (Total bytes written, Bad block count and
|
||||
Erase failures etc) for the given micron device if its of 2200 model controller.
|
||||
For OCP complaint controllers this command print extended SMART health data
|
||||
along with NAND information (if available)</p></div>
|
||||
<div class="paragraph"><p>The <device> parameter is mandatory and may be either the NVMe
|
||||
character device (ex: /dev/nvme0), or a namespace block device (ex:
|
||||
/dev/nvme0n1).</p></div>
|
||||
<div class="paragraph"><p>The <em>-f</em> option controls the displayed output data format based on the option
|
||||
value. If the option value is <em>json</em> (which is enabled by default), output data
|
||||
is printed in JSON format. If option value is <em>normal</em> the output is displayed
|
||||
in non-JSON format.</p></div>
|
||||
<div class="paragraph"><p>This will only work on Micron devices devices of model numbers 54XX and OCP
|
||||
complaint controllers. Support for new devices may be added subsequently.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_options">OPTIONS</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>-f <json|normal> controls the format of displayed output.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_examples">EXAMPLES</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="ulist"><ul>
|
||||
<li>
|
||||
<p>
|
||||
Retrieve NAND/extended SMART data and display in json format
|
||||
</p>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><code># nvme micron vs-nand-stats /dev/nvme0
|
||||
|
||||
* Retrieve NAND/extended SMART data and display in non-json format
|
||||
+</code></pre>
|
||||
</div></div>
|
||||
</li>
|
||||
</ul></div>
|
||||
<div class="paragraph"><p># nvme micron vs-nand-stats /dev/nvme0 -f normal</p></div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><code>NVME</code></pre>
|
||||
</div></div>
|
||||
<div class="paragraph"><p>Part of the nvme-user suite</p></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footnotes"><hr /></div>
|
||||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated
|
||||
2021-05-31 19:28:49 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
54
Documentation/nvme-micron-smart-add-log.txt
Normal file
54
Documentation/nvme-micron-smart-add-log.txt
Normal file
|
@ -0,0 +1,54 @@
|
|||
nvme-micron-smart-add-log(1)
|
||||
============================
|
||||
|
||||
NAME
|
||||
----
|
||||
nvme-micron-smart-add-log - Retrieves NAND statistics (2200 model drives)
|
||||
or Extended SMART information (OCP complaint models) of given micron device
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'nvme micron vs-smart-add-log' <device> -f <json|normal>
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
This command prints NAND information (Total bytes written, Bad block count and
|
||||
Erase failures etc) for the given micron device if its of 2200 model controller.
|
||||
For OCP complaint controllers this command print extended SMART health data
|
||||
along with NAND information (if available)
|
||||
|
||||
The <device> parameter is mandatory and may be either the NVMe
|
||||
character device (ex: /dev/nvme0), or a namespace block device (ex:
|
||||
/dev/nvme0n1).
|
||||
|
||||
The '-f' option controls the displayed output data format based on the option
|
||||
value. If the option value is 'json' (which is enabled by default), output data
|
||||
is printed in JSON format. If option value is 'normal' the output is displayed
|
||||
in non-JSON format.
|
||||
|
||||
This will only work on Micron devices devices of model numbers 54XX and OCP
|
||||
complaint controllers. Support for new devices may be added subsequently.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
-f <json|normal> controls the format of displayed output.
|
||||
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
* Retrieve NAND/extended SMART data and display in json format
|
||||
+
|
||||
------------
|
||||
# nvme micron vs-nand-stats /dev/nvme0
|
||||
|
||||
* Retrieve NAND/extended SMART data and display in non-json format
|
||||
+
|
||||
------------
|
||||
# nvme micron vs-nand-stats /dev/nvme0 -f normal
|
||||
|
||||
------------
|
||||
|
||||
NVME
|
||||
----
|
||||
Part of the nvme-user suite
|
104
Documentation/nvme-primary-ctrl-caps.1
Normal file
104
Documentation/nvme-primary-ctrl-caps.1
Normal file
|
@ -0,0 +1,104 @@
|
|||
'\" t
|
||||
.\" Title: nvme-primary-ctrl-caps
|
||||
.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author]
|
||||
.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
|
||||
.\" Date: 05/11/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-PRIMARY\-CTRL\" "1" "05/11/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.\" http://bugs.debian.org/507673
|
||||
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.ie \n(.g .ds Aq \(aq
|
||||
.el .ds Aq '
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * set default formatting
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" disable hyphenation
|
||||
.nh
|
||||
.\" disable justification (adjust text to left margin only)
|
||||
.ad l
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * MAIN CONTENT STARTS HERE *
|
||||
.\" -----------------------------------------------------------------
|
||||
.SH "NAME"
|
||||
nvme-primary-ctrl-caps \- Send identify Primary Controller Caps, return result and structure
|
||||
.SH "SYNOPSIS"
|
||||
.sp
|
||||
.nf
|
||||
\fInvme primary\-ctrl\-caps\fR <device> [\-o <format> | \-\-output\-format=<format>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
For the NVMe device given, sends an identify primary Controller caps command and provides the result and returned structure\&.
|
||||
.sp
|
||||
The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
|
||||
.sp
|
||||
On success, the structure may be returned in one of several ways depending on the option flags; the structure may be parsed by the program or the raw buffer may be printed to stdout\&.
|
||||
.SH "OPTIONS"
|
||||
.PP
|
||||
\-o <format>, \-\-output\-format=<format>
|
||||
.RS 4
|
||||
Set the reporting format to
|
||||
\fInormal\fR,
|
||||
\fIjson\fR, or
|
||||
\fIbinary\fR\&. Only one output format can be used at a time\&.
|
||||
.RE
|
||||
.PP
|
||||
\-H, \-\-human\-readable
|
||||
.RS 4
|
||||
This option will parse and format many of the bit fields into human\-readable formats\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
.RS 4
|
||||
.ie n \{\
|
||||
\h'-04'\(bu\h'+03'\c
|
||||
.\}
|
||||
.el \{\
|
||||
.sp -1
|
||||
.IP \(bu 2.3
|
||||
.\}
|
||||
Get Primary Ctrl Caps of the device in default format
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
# nvme primary\-ctrl\-caps /dev/nvme0
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.RE
|
||||
.sp
|
||||
.RS 4
|
||||
.ie n \{\
|
||||
\h'-04'\(bu\h'+03'\c
|
||||
.\}
|
||||
.el \{\
|
||||
.sp -1
|
||||
.IP \(bu 2.3
|
||||
.\}
|
||||
Has the program interpret the returned buffer and display the known fields in a human readable format:
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
# nvme primary\-ctrl\-caps /dev/nvme0 \-\-human\-readbale
|
||||
# nvme primary\-ctrl\-caps /dev/nvme0 \-H
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.RE
|
||||
.SH "NVME"
|
||||
.sp
|
||||
Part of the nvme\-user suite
|
842
Documentation/nvme-primary-ctrl-caps.html
Normal file
842
Documentation/nvme-primary-ctrl-caps.html
Normal file
|
@ -0,0 +1,842 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.10" />
|
||||
<title>nvme-primary-ctrl-caps(1)</title>
|
||||
<style type="text/css">
|
||||
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
||||
|
||||
/* Default font. */
|
||||
body {
|
||||
font-family: Georgia,serif;
|
||||
}
|
||||
|
||||
/* Title font. */
|
||||
h1, h2, h3, h4, h5, h6,
|
||||
div.title, caption.title,
|
||||
thead, p.table.header,
|
||||
#toctitle,
|
||||
#author, #revnumber, #revdate, #revremark,
|
||||
#footer {
|
||||
font-family: Arial,Helvetica,sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 1em 5% 1em 5%;
|
||||
}
|
||||
|
||||
a {
|
||||
color: blue;
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:visited {
|
||||
color: fuchsia;
|
||||
}
|
||||
|
||||
em {
|
||||
font-style: italic;
|
||||
color: navy;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: bold;
|
||||
color: #083194;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #527bbd;
|
||||
margin-top: 1.2em;
|
||||
margin-bottom: 0.5em;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
border-bottom: 2px solid silver;
|
||||
}
|
||||
h2 {
|
||||
padding-top: 0.5em;
|
||||
}
|
||||
h3 {
|
||||
float: left;
|
||||
}
|
||||
h3 + * {
|
||||
clear: left;
|
||||
}
|
||||
h5 {
|
||||
font-size: 1.0em;
|
||||
}
|
||||
|
||||
div.sectionbody {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: 1px solid silver;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
ul, ol, li > p {
|
||||
margin-top: 0;
|
||||
}
|
||||
ul > li { color: #aaa; }
|
||||
ul > li > * { color: black; }
|
||||
|
||||
.monospaced, code, pre {
|
||||
font-family: "Courier New", Courier, monospace;
|
||||
font-size: inherit;
|
||||
color: navy;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
#author {
|
||||
color: #527bbd;
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
#email {
|
||||
}
|
||||
#revnumber, #revdate, #revremark {
|
||||
}
|
||||
|
||||
#footer {
|
||||
font-size: small;
|
||||
border-top: 2px solid silver;
|
||||
padding-top: 0.5em;
|
||||
margin-top: 4.0em;
|
||||
}
|
||||
#footer-text {
|
||||
float: left;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
#footer-badges {
|
||||
float: right;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
|
||||
#preamble {
|
||||
margin-top: 1.5em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.imageblock, div.exampleblock, div.verseblock,
|
||||
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
|
||||
div.admonitionblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.admonitionblock {
|
||||
margin-top: 2.0em;
|
||||
margin-bottom: 2.0em;
|
||||
margin-right: 10%;
|
||||
color: #606060;
|
||||
}
|
||||
|
||||
div.content { /* Block element content. */
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* Block element titles. */
|
||||
div.title, caption.title {
|
||||
color: #527bbd;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
div.title + * {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
td div.title:first-child {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
div.content div.title:first-child {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
div.content + div.title {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
|
||||
div.sidebarblock > div.content {
|
||||
background: #ffffee;
|
||||
border: 1px solid #dddddd;
|
||||
border-left: 4px solid #f0f0f0;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.listingblock > div.content {
|
||||
border: 1px solid #dddddd;
|
||||
border-left: 5px solid #f0f0f0;
|
||||
background: #f8f8f8;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.quoteblock, div.verseblock {
|
||||
padding-left: 1.0em;
|
||||
margin-left: 1.0em;
|
||||
margin-right: 10%;
|
||||
border-left: 5px solid #f0f0f0;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
div.quoteblock > div.attribution {
|
||||
padding-top: 0.5em;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.verseblock > pre.content {
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
}
|
||||
div.verseblock > div.attribution {
|
||||
padding-top: 0.75em;
|
||||
text-align: left;
|
||||
}
|
||||
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
|
||||
div.verseblock + div.attribution {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.admonitionblock .icon {
|
||||
vertical-align: top;
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
text-decoration: underline;
|
||||
color: #527bbd;
|
||||
padding-right: 0.5em;
|
||||
}
|
||||
div.admonitionblock td.content {
|
||||
padding-left: 0.5em;
|
||||
border-left: 3px solid #dddddd;
|
||||
}
|
||||
|
||||
div.exampleblock > div.content {
|
||||
border-left: 3px solid #dddddd;
|
||||
padding-left: 0.5em;
|
||||
}
|
||||
|
||||
div.imageblock div.content { padding-left: 0; }
|
||||
span.image img { border-style: none; vertical-align: text-bottom; }
|
||||
a.image:visited { color: white; }
|
||||
|
||||
dl {
|
||||
margin-top: 0.8em;
|
||||
margin-bottom: 0.8em;
|
||||
}
|
||||
dt {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0;
|
||||
font-style: normal;
|
||||
color: navy;
|
||||
}
|
||||
dd > *:first-child {
|
||||
margin-top: 0.1em;
|
||||
}
|
||||
|
||||
ul, ol {
|
||||
list-style-position: outside;
|
||||
}
|
||||
ol.arabic {
|
||||
list-style-type: decimal;
|
||||
}
|
||||
ol.loweralpha {
|
||||
list-style-type: lower-alpha;
|
||||
}
|
||||
ol.upperalpha {
|
||||
list-style-type: upper-alpha;
|
||||
}
|
||||
ol.lowerroman {
|
||||
list-style-type: lower-roman;
|
||||
}
|
||||
ol.upperroman {
|
||||
list-style-type: upper-roman;
|
||||
}
|
||||
|
||||
div.compact ul, div.compact ol,
|
||||
div.compact p, div.compact p,
|
||||
div.compact div, div.compact div {
|
||||
margin-top: 0.1em;
|
||||
margin-bottom: 0.1em;
|
||||
}
|
||||
|
||||
tfoot {
|
||||
font-weight: bold;
|
||||
}
|
||||
td > div.verse {
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
div.hdlist {
|
||||
margin-top: 0.8em;
|
||||
margin-bottom: 0.8em;
|
||||
}
|
||||
div.hdlist tr {
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
dt.hdlist1.strong, td.hdlist1.strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
td.hdlist1 {
|
||||
vertical-align: top;
|
||||
font-style: normal;
|
||||
padding-right: 0.8em;
|
||||
color: navy;
|
||||
}
|
||||
td.hdlist2 {
|
||||
vertical-align: top;
|
||||
}
|
||||
div.hdlist.compact tr {
|
||||
margin: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.comment {
|
||||
background: yellow;
|
||||
}
|
||||
|
||||
.footnote, .footnoteref {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
span.footnote, span.footnoteref {
|
||||
vertical-align: super;
|
||||
}
|
||||
|
||||
#footnotes {
|
||||
margin: 20px 0 20px 0;
|
||||
padding: 7px 0 0 0;
|
||||
}
|
||||
|
||||
#footnotes div.footnote {
|
||||
margin: 0 0 5px 0;
|
||||
}
|
||||
|
||||
#footnotes hr {
|
||||
border: none;
|
||||
border-top: 1px solid silver;
|
||||
height: 1px;
|
||||
text-align: left;
|
||||
margin-left: 0;
|
||||
width: 20%;
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
div.colist td {
|
||||
padding-right: 0.5em;
|
||||
padding-bottom: 0.3em;
|
||||
vertical-align: top;
|
||||
}
|
||||
div.colist td img {
|
||||
margin-top: 0.3em;
|
||||
}
|
||||
|
||||
@media print {
|
||||
#footer-badges { display: none; }
|
||||
}
|
||||
|
||||
#toc {
|
||||
margin-bottom: 2.5em;
|
||||
}
|
||||
|
||||
#toctitle {
|
||||
color: #527bbd;
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 0.1em;
|
||||
}
|
||||
|
||||
div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
div.toclevel2 {
|
||||
margin-left: 2em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
div.toclevel3 {
|
||||
margin-left: 4em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
div.toclevel4 {
|
||||
margin-left: 6em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
span.aqua { color: aqua; }
|
||||
span.black { color: black; }
|
||||
span.blue { color: blue; }
|
||||
span.fuchsia { color: fuchsia; }
|
||||
span.gray { color: gray; }
|
||||
span.green { color: green; }
|
||||
span.lime { color: lime; }
|
||||
span.maroon { color: maroon; }
|
||||
span.navy { color: navy; }
|
||||
span.olive { color: olive; }
|
||||
span.purple { color: purple; }
|
||||
span.red { color: red; }
|
||||
span.silver { color: silver; }
|
||||
span.teal { color: teal; }
|
||||
span.white { color: white; }
|
||||
span.yellow { color: yellow; }
|
||||
|
||||
span.aqua-background { background: aqua; }
|
||||
span.black-background { background: black; }
|
||||
span.blue-background { background: blue; }
|
||||
span.fuchsia-background { background: fuchsia; }
|
||||
span.gray-background { background: gray; }
|
||||
span.green-background { background: green; }
|
||||
span.lime-background { background: lime; }
|
||||
span.maroon-background { background: maroon; }
|
||||
span.navy-background { background: navy; }
|
||||
span.olive-background { background: olive; }
|
||||
span.purple-background { background: purple; }
|
||||
span.red-background { background: red; }
|
||||
span.silver-background { background: silver; }
|
||||
span.teal-background { background: teal; }
|
||||
span.white-background { background: white; }
|
||||
span.yellow-background { background: yellow; }
|
||||
|
||||
span.big { font-size: 2em; }
|
||||
span.small { font-size: 0.6em; }
|
||||
|
||||
span.underline { text-decoration: underline; }
|
||||
span.overline { text-decoration: overline; }
|
||||
span.line-through { text-decoration: line-through; }
|
||||
|
||||
div.unbreakable { page-break-inside: avoid; }
|
||||
|
||||
|
||||
/*
|
||||
* xhtml11 specific
|
||||
*
|
||||
* */
|
||||
|
||||
div.tableblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.tableblock > table {
|
||||
border: 3px solid #527bbd;
|
||||
}
|
||||
thead, p.table.header {
|
||||
font-weight: bold;
|
||||
color: #527bbd;
|
||||
}
|
||||
p.table {
|
||||
margin-top: 0;
|
||||
}
|
||||
/* Because the table frame attribute is overriden by CSS in most browsers. */
|
||||
div.tableblock > table[frame="void"] {
|
||||
border-style: none;
|
||||
}
|
||||
div.tableblock > table[frame="hsides"] {
|
||||
border-left-style: none;
|
||||
border-right-style: none;
|
||||
}
|
||||
div.tableblock > table[frame="vsides"] {
|
||||
border-top-style: none;
|
||||
border-bottom-style: none;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* html5 specific
|
||||
*
|
||||
* */
|
||||
|
||||
table.tableblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
thead, p.tableblock.header {
|
||||
font-weight: bold;
|
||||
color: #527bbd;
|
||||
}
|
||||
p.tableblock {
|
||||
margin-top: 0;
|
||||
}
|
||||
table.tableblock {
|
||||
border-width: 3px;
|
||||
border-spacing: 0px;
|
||||
border-style: solid;
|
||||
border-color: #527bbd;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
th.tableblock, td.tableblock {
|
||||
border-width: 1px;
|
||||
padding: 4px;
|
||||
border-style: solid;
|
||||
border-color: #527bbd;
|
||||
}
|
||||
|
||||
table.tableblock.frame-topbot {
|
||||
border-left-style: hidden;
|
||||
border-right-style: hidden;
|
||||
}
|
||||
table.tableblock.frame-sides {
|
||||
border-top-style: hidden;
|
||||
border-bottom-style: hidden;
|
||||
}
|
||||
table.tableblock.frame-none {
|
||||
border-style: hidden;
|
||||
}
|
||||
|
||||
th.tableblock.halign-left, td.tableblock.halign-left {
|
||||
text-align: left;
|
||||
}
|
||||
th.tableblock.halign-center, td.tableblock.halign-center {
|
||||
text-align: center;
|
||||
}
|
||||
th.tableblock.halign-right, td.tableblock.halign-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
th.tableblock.valign-top, td.tableblock.valign-top {
|
||||
vertical-align: top;
|
||||
}
|
||||
th.tableblock.valign-middle, td.tableblock.valign-middle {
|
||||
vertical-align: middle;
|
||||
}
|
||||
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* manpage specific
|
||||
*
|
||||
* */
|
||||
|
||||
body.manpage h1 {
|
||||
padding-top: 0.5em;
|
||||
padding-bottom: 0.5em;
|
||||
border-top: 2px solid silver;
|
||||
border-bottom: 2px solid silver;
|
||||
}
|
||||
body.manpage h2 {
|
||||
border-style: none;
|
||||
}
|
||||
body.manpage div.sectionbody {
|
||||
margin-left: 3em;
|
||||
}
|
||||
|
||||
@media print {
|
||||
body.manpage div#toc { display: none; }
|
||||
}
|
||||
|
||||
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
/*<+'])');
|
||||
// Function that scans the DOM tree for header elements (the DOM2
|
||||
// nodeIterator API would be a better technique but not supported by all
|
||||
// browsers).
|
||||
var iterate = function (el) {
|
||||
for (var i = el.firstChild; i != null; i = i.nextSibling) {
|
||||
if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
|
||||
var mo = re.exec(i.tagName);
|
||||
if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
|
||||
result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
|
||||
}
|
||||
iterate(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
iterate(el);
|
||||
return result;
|
||||
}
|
||||
|
||||
var toc = document.getElementById("toc");
|
||||
if (!toc) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Delete existing TOC entries in case we're reloading the TOC.
|
||||
var tocEntriesToRemove = [];
|
||||
var i;
|
||||
for (i = 0; i < toc.childNodes.length; i++) {
|
||||
var entry = toc.childNodes[i];
|
||||
if (entry.nodeName.toLowerCase() == 'div'
|
||||
&& entry.getAttribute("class")
|
||||
&& entry.getAttribute("class").match(/^toclevel/))
|
||||
tocEntriesToRemove.push(entry);
|
||||
}
|
||||
for (i = 0; i < tocEntriesToRemove.length; i++) {
|
||||
toc.removeChild(tocEntriesToRemove[i]);
|
||||
}
|
||||
|
||||
// Rebuild TOC entries.
|
||||
var entries = tocEntries(document.getElementById("content"), toclevels);
|
||||
for (var i = 0; i < entries.length; ++i) {
|
||||
var entry = entries[i];
|
||||
if (entry.element.id == "")
|
||||
entry.element.id = "_toc_" + i;
|
||||
var a = document.createElement("a");
|
||||
a.href = "#" + entry.element.id;
|
||||
a.appendChild(document.createTextNode(entry.text));
|
||||
var div = document.createElement("div");
|
||||
div.appendChild(a);
|
||||
div.className = "toclevel" + entry.toclevel;
|
||||
toc.appendChild(div);
|
||||
}
|
||||
if (entries.length == 0)
|
||||
toc.parentNode.removeChild(toc);
|
||||
},
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// Footnotes generator
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
/* Based on footnote generation code from:
|
||||
* http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
|
||||
*/
|
||||
|
||||
footnotes: function () {
|
||||
// Delete existing footnote entries in case we're reloading the footnodes.
|
||||
var i;
|
||||
var noteholder = document.getElementById("footnotes");
|
||||
if (!noteholder) {
|
||||
return;
|
||||
}
|
||||
var entriesToRemove = [];
|
||||
for (i = 0; i < noteholder.childNodes.length; i++) {
|
||||
var entry = noteholder.childNodes[i];
|
||||
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
|
||||
entriesToRemove.push(entry);
|
||||
}
|
||||
for (i = 0; i < entriesToRemove.length; i++) {
|
||||
noteholder.removeChild(entriesToRemove[i]);
|
||||
}
|
||||
|
||||
// Rebuild footnote entries.
|
||||
var cont = document.getElementById("content");
|
||||
var spans = cont.getElementsByTagName("span");
|
||||
var refs = {};
|
||||
var n = 0;
|
||||
for (i=0; i<spans.length; i++) {
|
||||
if (spans[i].className == "footnote") {
|
||||
n++;
|
||||
var note = spans[i].getAttribute("data-note");
|
||||
if (!note) {
|
||||
// Use [\s\S] in place of . so multi-line matches work.
|
||||
// Because JavaScript has no s (dotall) regex flag.
|
||||
note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
|
||||
spans[i].innerHTML =
|
||||
"[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
|
||||
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
||||
spans[i].setAttribute("data-note", note);
|
||||
}
|
||||
noteholder.innerHTML +=
|
||||
"<div class='footnote' id='_footnote_" + n + "'>" +
|
||||
"<a href='#_footnoteref_" + n + "' title='Return to text'>" +
|
||||
n + "</a>. " + note + "</div>";
|
||||
var id =spans[i].getAttribute("id");
|
||||
if (id != null) refs["#"+id] = n;
|
||||
}
|
||||
}
|
||||
if (n == 0)
|
||||
noteholder.parentNode.removeChild(noteholder);
|
||||
else {
|
||||
// Process footnoterefs.
|
||||
for (i=0; i<spans.length; i++) {
|
||||
if (spans[i].className == "footnoteref") {
|
||||
var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
|
||||
href = href.match(/#.*/)[0]; // Because IE return full URL.
|
||||
n = refs[href];
|
||||
spans[i].innerHTML =
|
||||
"[<a href='#_footnote_" + n +
|
||||
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
install: function(toclevels) {
|
||||
var timerId;
|
||||
|
||||
function reinstall() {
|
||||
asciidoc.footnotes();
|
||||
if (toclevels) {
|
||||
asciidoc.toc(toclevels);
|
||||
}
|
||||
}
|
||||
|
||||
function reinstallAndRemoveTimer() {
|
||||
clearInterval(timerId);
|
||||
reinstall();
|
||||
}
|
||||
|
||||
timerId = setInterval(reinstall, 500);
|
||||
if (document.addEventListener)
|
||||
document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
|
||||
else
|
||||
window.onload = reinstallAndRemoveTimer;
|
||||
}
|
||||
|
||||
}
|
||||
asciidoc.install();
|
||||
/*]]>*/
|
||||
</script>
|
||||
</head>
|
||||
<body class="manpage">
|
||||
<div id="header">
|
||||
<h1>
|
||||
nvme-primary-ctrl-caps(1) Manual Page
|
||||
</h1>
|
||||
<h2>NAME</h2>
|
||||
<div class="sectionbody">
|
||||
<p>nvme-primary-ctrl-caps -
|
||||
Send identify Primary Controller Caps, return result and structure
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="content">
|
||||
<div class="sect1">
|
||||
<h2 id="_synopsis">SYNOPSIS</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="verseblock">
|
||||
<pre class="content"><em>nvme primary-ctrl-caps</em> <device> [-o <format> | --output-format=<format>]</pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_description">DESCRIPTION</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>For the NVMe device given, sends an identify primary Controller caps command and
|
||||
provides the result and returned structure.</p></div>
|
||||
<div class="paragraph"><p>The <device> parameter is mandatory and may be either the NVMe character
|
||||
device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></div>
|
||||
<div class="paragraph"><p>On success, the structure may be returned in one of several ways depending
|
||||
on the option flags; the structure may be parsed by the program or the
|
||||
raw buffer may be printed to stdout.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_options">OPTIONS</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="dlist"><dl>
|
||||
<dt class="hdlist1">
|
||||
-o <format>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--output-format=<format>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Set the reporting format to <em>normal</em>, <em>json</em>, or
|
||||
<em>binary</em>. Only one output format can be used at a time.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-H
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--human-readable
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
This option will parse and format many of the bit fields
|
||||
into human-readable formats.
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_examples">EXAMPLES</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="ulist"><ul>
|
||||
<li>
|
||||
<p>
|
||||
Get Primary Ctrl Caps of the device in default format
|
||||
</p>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><code># nvme primary-ctrl-caps /dev/nvme0</code></pre>
|
||||
</div></div>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Has the program interpret the returned buffer and display the known
|
||||
fields in a human readable format:
|
||||
</p>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><code># nvme primary-ctrl-caps /dev/nvme0 --human-readbale
|
||||
# nvme primary-ctrl-caps /dev/nvme0 -H</code></pre>
|
||||
</div></div>
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_nvme">NVME</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>Part of the nvme-user suite</p></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footnotes"><hr /></div>
|
||||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated
|
||||
2021-05-11 12:31:04 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
53
Documentation/nvme-primary-ctrl-caps.txt
Normal file
53
Documentation/nvme-primary-ctrl-caps.txt
Normal file
|
@ -0,0 +1,53 @@
|
|||
nvme-primary-ctrl-caps(1)
|
||||
=========================
|
||||
|
||||
NAME
|
||||
----
|
||||
nvme-primary-ctrl-caps - Send identify Primary Controller Caps, return result and structure
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'nvme primary-ctrl-caps' <device> [-o <format> | --output-format=<format>]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
For the NVMe device given, sends an identify primary Controller caps command and
|
||||
provides the result and returned structure.
|
||||
|
||||
The <device> parameter is mandatory and may be either the NVMe character
|
||||
device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
|
||||
|
||||
On success, the structure may be returned in one of several ways depending
|
||||
on the option flags; the structure may be parsed by the program or the
|
||||
raw buffer may be printed to stdout.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
-o <format>::
|
||||
--output-format=<format>::
|
||||
Set the reporting format to 'normal', 'json', or
|
||||
'binary'. Only one output format can be used at a time.
|
||||
|
||||
-H::
|
||||
--human-readable::
|
||||
This option will parse and format many of the bit fields
|
||||
into human-readable formats.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
* Get Primary Ctrl Caps of the device in default format
|
||||
+
|
||||
------------
|
||||
# nvme primary-ctrl-caps /dev/nvme0
|
||||
------------
|
||||
* Has the program interpret the returned buffer and display the known
|
||||
fields in a human readable format:
|
||||
+
|
||||
------------
|
||||
# nvme primary-ctrl-caps /dev/nvme0 --human-readbale
|
||||
# nvme primary-ctrl-caps /dev/nvme0 -H
|
||||
------------
|
||||
NVME
|
||||
----
|
||||
Part of the nvme-user suite
|
|
@ -1,13 +1,13 @@
|
|||
'\" t
|
||||
.\" Title: nvme-read
|
||||
.\" 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: 07/09/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-READ" "1" "10/20/2020" "NVMe" "NVMe Manual"
|
||||
.TH "NVME\-READ" "1" "07/09/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
|
@ -50,6 +50,7 @@ nvme-read \- Send an NVMe Read command, provide results
|
|||
[\-\-show\-command | \-v]
|
||||
[\-\-dry\-run | \-w]
|
||||
[\-\-latency | \-t]
|
||||
[\-\-storage\-tag\-check<storage\-tag\-check> | \-C <storage\-tag\-check>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -178,6 +179,11 @@ be set\&. Otherwise \-\-dry\-run option will be
|
|||
.RS 4
|
||||
Print out the latency the IOCTL took (in us)\&.
|
||||
.RE
|
||||
.PP
|
||||
\-\-storage\-tag\-check=<storage\-tag\-check>, \-C <storage\-tag\-check>
|
||||
.RS 4
|
||||
This bit specifies the Storage Tag field shall be checked as part of end\-to\-end data protection processing\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
No examples yet\&.
|
||||
|
|
|
@ -766,7 +766,8 @@ nvme-read(1) Manual Page
|
|||
[--dsm=<dsm> | -D <dsm>]
|
||||
[--show-command | -v]
|
||||
[--dry-run | -w]
|
||||
[--latency | -t]</pre>
|
||||
[--latency | -t]
|
||||
[--storage-tag-check<storage-tag-check> | -C <storage-tag-check>]</pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
</div>
|
||||
|
@ -1013,6 +1014,18 @@ metadata is passes.</p></td>
|
|||
Print out the latency the IOCTL took (in us).
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
--storage-tag-check=<storage-tag-check>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-C <storage-tag-check>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
This bit specifies the Storage Tag field shall be checked as part of end-to-end
|
||||
data protection processing.
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1033,7 +1046,7 @@ metadata is passes.</p></td>
|
|||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated
|
||||
2019-10-12 00:12:24 JST
|
||||
2021-07-09 14:16:42 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -26,6 +26,7 @@ SYNOPSIS
|
|||
[--show-command | -v]
|
||||
[--dry-run | -w]
|
||||
[--latency | -t]
|
||||
[--storage-tag-check<storage-tag-check> | -C <storage-tag-check>]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
@ -128,6 +129,11 @@ metadata is passes.
|
|||
--latency::
|
||||
Print out the latency the IOCTL took (in us).
|
||||
|
||||
--storage-tag-check=<storage-tag-check>::
|
||||
-C <storage-tag-check>::
|
||||
This bit specifies the Storage Tag field shall be checked as part of end-to-end
|
||||
data protection processing.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
No examples yet.
|
||||
|
|
|
@ -98,7 +98,7 @@ T}
|
|||
.sp 1
|
||||
.RE
|
||||
.PP
|
||||
\-a <rrega>, \-\-rrega=<rrega>
|
||||
\-r <rrega>, \-\-rrega=<rrega>
|
||||
.RS 4
|
||||
Reservation Register Action: This field specifies the registration action that is performed by the command\&.
|
||||
.TS
|
||||
|
|
|
@ -861,7 +861,7 @@ a power loss.</p></td>
|
|||
</div>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-a <rrega>
|
||||
-r <rrega>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--rrega=<rrega>
|
||||
|
|
|
@ -62,7 +62,7 @@ are cleared on a power on.
|
|||
a power loss.
|
||||
|=================
|
||||
|
||||
-a <rrega>::
|
||||
-r <rrega>::
|
||||
--rrega=<rrega>::
|
||||
Reservation Register Action: This field specifies the registration
|
||||
action that is performed by the command.
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
'\" t
|
||||
.\" Title: nvme-set-feature
|
||||
.\" 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: 05/16/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-SET\-FEATURE" "1" "10/20/2020" "NVMe" "NVMe Manual"
|
||||
.TH "NVME\-SET\-FEATURE" "1" "05/16/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
|
@ -34,6 +34,7 @@ nvme-set-feature \- Sets an NVMe feature, returns applicable results
|
|||
.nf
|
||||
\fInvme set\-feature\fR <device> [\-\-namespace\-id=<nsid> | \-n <nsid>]
|
||||
[\-\-feature\-id=<fid> | \-f <fid>] [\-\-value=<value> | \-v <value>]
|
||||
[\-\-uuid\-index=<uuid\-index> | \-U <uuid_index>]
|
||||
[\-\-data\-len=<data\-len> | \-l <data\-len>]
|
||||
[\-\-data=<data\-file> | \-d <data\-file>]
|
||||
[\-\-save| \-s]
|
||||
|
@ -76,6 +77,11 @@ The value for command dword 11, the value you want to set the feature to\&.
|
|||
.RS 4
|
||||
Save the attribute so that it persists through all power states and resets\&.
|
||||
.RE
|
||||
.PP
|
||||
\-U <uuid\-index>, \-\-uuid\-index=<uuid\-index>
|
||||
.RS 4
|
||||
UUID Index of the feature
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
.RS 4
|
||||
|
@ -118,6 +124,8 @@ Sets the host id to the ascii string\&.
|
|||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.sp
|
||||
nvme set\-feature /dev/nvme0 \-f 0x81 \-l 8 \-U 0x1
|
||||
.RE
|
||||
.SH "NVME"
|
||||
.sp
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.10" />
|
||||
<title>nvme-set-feature(1)</title>
|
||||
<style type="text/css">
|
||||
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
||||
|
@ -94,7 +95,9 @@ ul > li > * { color: black; }
|
|||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
#author {
|
||||
color: #527bbd;
|
||||
|
@ -223,7 +226,7 @@ div.exampleblock > div.content {
|
|||
}
|
||||
|
||||
div.imageblock div.content { padding-left: 0; }
|
||||
span.image img { border-style: none; }
|
||||
span.image img { border-style: none; vertical-align: text-bottom; }
|
||||
a.image:visited { color: white; }
|
||||
|
||||
dl {
|
||||
|
@ -433,7 +436,7 @@ thead, p.table.header {
|
|||
p.table {
|
||||
margin-top: 0;
|
||||
}
|
||||
/* Because the table frame attribute is overridden by CSS in most browsers. */
|
||||
/* Because the table frame attribute is overriden by CSS in most browsers. */
|
||||
div.tableblock > table[frame="void"] {
|
||||
border-style: none;
|
||||
}
|
||||
|
@ -748,6 +751,7 @@ nvme-set-feature(1) Manual Page
|
|||
<div class="verseblock">
|
||||
<pre class="content"><em>nvme set-feature</em> <device> [--namespace-id=<nsid> | -n <nsid>]
|
||||
[--feature-id=<fid> | -f <fid>] [--value=<value> | -v <value>]
|
||||
[--uuid-index=<uuid-index> | -U <uuid_index>]
|
||||
[--data-len=<data-len> | -l <data-len>]
|
||||
[--data=<data-file> | -d <data-file>]
|
||||
[--save| -s]</pre>
|
||||
|
@ -844,6 +848,17 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></di
|
|||
Save the attribute so that it persists through all power states and resets.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
-U <uuid-index>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
--uuid-index=<uuid-index>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
UUID Index of the feature
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -868,6 +883,7 @@ Sets the host id to the ascii string.
|
|||
<div class="content">
|
||||
<pre><code># echo "abcdefgh" | nvme set-feature /dev/nvme0 -f 0x81 -l 8</code></pre>
|
||||
</div></div>
|
||||
<div class="paragraph"><p>nvme set-feature /dev/nvme0 -f 0x81 -l 8 -U 0x1</p></div>
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
|
@ -882,7 +898,8 @@ Sets the host id to the ascii string.
|
|||
<div id="footnotes"><hr /></div>
|
||||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated 2017-02-27 10:11:58 EST
|
||||
Last updated
|
||||
2021-05-16 00:14:28 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -10,6 +10,7 @@ SYNOPSIS
|
|||
[verse]
|
||||
'nvme set-feature' <device> [--namespace-id=<nsid> | -n <nsid>]
|
||||
[--feature-id=<fid> | -f <fid>] [--value=<value> | -v <value>]
|
||||
[--uuid-index=<uuid-index> | -U <uuid_index>]
|
||||
[--data-len=<data-len> | -l <data-len>]
|
||||
[--data=<data-file> | -d <data-file>]
|
||||
[--save| -s]
|
||||
|
@ -59,6 +60,10 @@ OPTIONS
|
|||
--save::
|
||||
Save the attribute so that it persists through all power states and resets.
|
||||
|
||||
-U <uuid-index>::
|
||||
--uuid-index=<uuid-index>::
|
||||
UUID Index of the feature
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
* Sets the Power State (PS) to 1 in feature id 2:
|
||||
|
@ -73,6 +78,8 @@ EXAMPLES
|
|||
------------
|
||||
# echo "abcdefgh" | nvme set-feature /dev/nvme0 -f 0x81 -l 8
|
||||
------------
|
||||
+
|
||||
nvme set-feature /dev/nvme0 -f 0x81 -l 8 -U 0x1
|
||||
|
||||
NVME
|
||||
----
|
||||
|
|
151
Documentation/nvme-verify.1
Normal file
151
Documentation/nvme-verify.1
Normal file
|
@ -0,0 +1,151 @@
|
|||
'\" t
|
||||
.\" Title: nvme-verify
|
||||
.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author]
|
||||
.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
|
||||
.\" Date: 07/09/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-VERIFY" "1" "07/09/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.\" http://bugs.debian.org/507673
|
||||
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.ie \n(.g .ds Aq \(aq
|
||||
.el .ds Aq '
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * set default formatting
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" disable hyphenation
|
||||
.nh
|
||||
.\" disable justification (adjust text to left margin only)
|
||||
.ad l
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * MAIN CONTENT STARTS HERE *
|
||||
.\" -----------------------------------------------------------------
|
||||
.SH "NAME"
|
||||
nvme-verify \- Send an NVMe Verify command, return results
|
||||
.SH "SYNOPSIS"
|
||||
.sp
|
||||
.nf
|
||||
\fInvme\-verify\fR <device> [\-\-namespace\-id=<nsid> | \-n <nsid>]
|
||||
[\-\-start\-block=<slba> | \-s <slba>]
|
||||
[\-\-block\-count=<nlb> | \-c <nlb>]
|
||||
[\-\-limited\-retry | \-l]
|
||||
[\-\-force\-unit\-access | \-f]
|
||||
[\-\-prinfo=<prinfo> | \-p <prinfo>]
|
||||
[\-\-ref\-tag=<reftag> | \-r <reftag>]
|
||||
[\-\-app\-tag\-mask=<appmask> | \-m <appmask>]
|
||||
[\-\-app\-tag=<apptag> | \-a <apptag>]
|
||||
[\-\-storage\-tag<storage\-tag> | \-S <storage\-tag>]
|
||||
[\-\-storage\-tag\-check<storage\-tag\-check> | \-C <storage\-tag\-check>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
The Verify command verifies the integrity of the stored information by reading data and metadata\&.
|
||||
.SH "OPTIONS"
|
||||
.PP
|
||||
\-\-namespace\-id=<nsid>, \-n <nsid>
|
||||
.RS 4
|
||||
Namespace ID use in the command\&.
|
||||
.RE
|
||||
.PP
|
||||
\-\-start\-block=<slba>, \-s <slba>
|
||||
.RS 4
|
||||
Start block address\&.
|
||||
.RE
|
||||
.PP
|
||||
\-\-block\-count=<nlb>, \-c <nlb>
|
||||
.RS 4
|
||||
Number of logical blocks to Verify\&.
|
||||
.RE
|
||||
.PP
|
||||
\-\-limited\-retry, \-l
|
||||
.RS 4
|
||||
Sets the limited retry flag\&.
|
||||
.RE
|
||||
.PP
|
||||
\-\-force\-unit\-access, \-f
|
||||
.RS 4
|
||||
Set the force\-unit access flag\&.
|
||||
.RE
|
||||
.PP
|
||||
\-\-prinfo=<prinfo>, \-p <prinfo>
|
||||
.RS 4
|
||||
Protection Information field definition\&.
|
||||
.TS
|
||||
allbox tab(:);
|
||||
lt lt
|
||||
lt lt
|
||||
lt lt
|
||||
lt lt
|
||||
lt lt
|
||||
lt lt.
|
||||
T{
|
||||
Bit
|
||||
T}:T{
|
||||
Description
|
||||
T}
|
||||
T{
|
||||
3
|
||||
T}:T{
|
||||
PRACT: Protection Information Action\&. When set to 1, PI is stripped/inserted on read/write when the block format\(cqs metadata size is 8\&. When set to 0, metadata is passes\&.
|
||||
T}
|
||||
T{
|
||||
2:0
|
||||
T}:T{
|
||||
PRCHK: Protection Information Check:
|
||||
T}
|
||||
T{
|
||||
2
|
||||
T}:T{
|
||||
Set to 1 enables checking the guard tag
|
||||
T}
|
||||
T{
|
||||
1
|
||||
T}:T{
|
||||
Set to 1 enables checking the application tag
|
||||
T}
|
||||
T{
|
||||
0
|
||||
T}:T{
|
||||
Set to 1 enables checking the reference tag
|
||||
T}
|
||||
.TE
|
||||
.sp 1
|
||||
.RE
|
||||
.PP
|
||||
\-\-ref\-tag=<reftag>, \-r <reftag>
|
||||
.RS 4
|
||||
Optional reftag when used with protection information\&.
|
||||
.RE
|
||||
.PP
|
||||
\-\-app\-tag\-mask=<appmask>, \-m <appmask>
|
||||
.RS 4
|
||||
Optional application tag mask when used with protection information\&.
|
||||
.RE
|
||||
.PP
|
||||
\-\-app\-tag=<apptag>, \-a <apptag>
|
||||
.RS 4
|
||||
Optional application tag when used with protection information\&.
|
||||
.RE
|
||||
.PP
|
||||
\-\-storage\-tag=<storage\-tag>, \-S <storage\-tag>
|
||||
.RS 4
|
||||
Variable Sized Expected Logical Block Storage Tag(ELBST) and Expected Logical Block Reference Tag (ELBRT), CDW2 and CDW3 (00:47) bits\&.
|
||||
.RE
|
||||
.PP
|
||||
\-\-storage\-tag\-check=<storage\-tag\-check>, \-C <storage\-tag\-check>
|
||||
.RS 4
|
||||
This bit specifies the Storage Tag field shall be checked as part of Verify operation\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
No examples yet\&.
|
||||
.SH "NVME"
|
||||
.sp
|
||||
Part of the nvme\-user suite
|
961
Documentation/nvme-verify.html
Normal file
961
Documentation/nvme-verify.html
Normal file
|
@ -0,0 +1,961 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.6.10" />
|
||||
<title>nvme-verify(1)</title>
|
||||
<style type="text/css">
|
||||
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
||||
|
||||
/* Default font. */
|
||||
body {
|
||||
font-family: Georgia,serif;
|
||||
}
|
||||
|
||||
/* Title font. */
|
||||
h1, h2, h3, h4, h5, h6,
|
||||
div.title, caption.title,
|
||||
thead, p.table.header,
|
||||
#toctitle,
|
||||
#author, #revnumber, #revdate, #revremark,
|
||||
#footer {
|
||||
font-family: Arial,Helvetica,sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 1em 5% 1em 5%;
|
||||
}
|
||||
|
||||
a {
|
||||
color: blue;
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:visited {
|
||||
color: fuchsia;
|
||||
}
|
||||
|
||||
em {
|
||||
font-style: italic;
|
||||
color: navy;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: bold;
|
||||
color: #083194;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #527bbd;
|
||||
margin-top: 1.2em;
|
||||
margin-bottom: 0.5em;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
border-bottom: 2px solid silver;
|
||||
}
|
||||
h2 {
|
||||
padding-top: 0.5em;
|
||||
}
|
||||
h3 {
|
||||
float: left;
|
||||
}
|
||||
h3 + * {
|
||||
clear: left;
|
||||
}
|
||||
h5 {
|
||||
font-size: 1.0em;
|
||||
}
|
||||
|
||||
div.sectionbody {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: 1px solid silver;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
ul, ol, li > p {
|
||||
margin-top: 0;
|
||||
}
|
||||
ul > li { color: #aaa; }
|
||||
ul > li > * { color: black; }
|
||||
|
||||
.monospaced, code, pre {
|
||||
font-family: "Courier New", Courier, monospace;
|
||||
font-size: inherit;
|
||||
color: navy;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
#author {
|
||||
color: #527bbd;
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
#email {
|
||||
}
|
||||
#revnumber, #revdate, #revremark {
|
||||
}
|
||||
|
||||
#footer {
|
||||
font-size: small;
|
||||
border-top: 2px solid silver;
|
||||
padding-top: 0.5em;
|
||||
margin-top: 4.0em;
|
||||
}
|
||||
#footer-text {
|
||||
float: left;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
#footer-badges {
|
||||
float: right;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
|
||||
#preamble {
|
||||
margin-top: 1.5em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.imageblock, div.exampleblock, div.verseblock,
|
||||
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
|
||||
div.admonitionblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.admonitionblock {
|
||||
margin-top: 2.0em;
|
||||
margin-bottom: 2.0em;
|
||||
margin-right: 10%;
|
||||
color: #606060;
|
||||
}
|
||||
|
||||
div.content { /* Block element content. */
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* Block element titles. */
|
||||
div.title, caption.title {
|
||||
color: #527bbd;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
div.title + * {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
td div.title:first-child {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
div.content div.title:first-child {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
div.content + div.title {
|
||||
margin-top: 0.0em;
|
||||
}
|
||||
|
||||
div.sidebarblock > div.content {
|
||||
background: #ffffee;
|
||||
border: 1px solid #dddddd;
|
||||
border-left: 4px solid #f0f0f0;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.listingblock > div.content {
|
||||
border: 1px solid #dddddd;
|
||||
border-left: 5px solid #f0f0f0;
|
||||
background: #f8f8f8;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div.quoteblock, div.verseblock {
|
||||
padding-left: 1.0em;
|
||||
margin-left: 1.0em;
|
||||
margin-right: 10%;
|
||||
border-left: 5px solid #f0f0f0;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
div.quoteblock > div.attribution {
|
||||
padding-top: 0.5em;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.verseblock > pre.content {
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
}
|
||||
div.verseblock > div.attribution {
|
||||
padding-top: 0.75em;
|
||||
text-align: left;
|
||||
}
|
||||
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
|
||||
div.verseblock + div.attribution {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.admonitionblock .icon {
|
||||
vertical-align: top;
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
text-decoration: underline;
|
||||
color: #527bbd;
|
||||
padding-right: 0.5em;
|
||||
}
|
||||
div.admonitionblock td.content {
|
||||
padding-left: 0.5em;
|
||||
border-left: 3px solid #dddddd;
|
||||
}
|
||||
|
||||
div.exampleblock > div.content {
|
||||
border-left: 3px solid #dddddd;
|
||||
padding-left: 0.5em;
|
||||
}
|
||||
|
||||
div.imageblock div.content { padding-left: 0; }
|
||||
span.image img { border-style: none; vertical-align: text-bottom; }
|
||||
a.image:visited { color: white; }
|
||||
|
||||
dl {
|
||||
margin-top: 0.8em;
|
||||
margin-bottom: 0.8em;
|
||||
}
|
||||
dt {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0;
|
||||
font-style: normal;
|
||||
color: navy;
|
||||
}
|
||||
dd > *:first-child {
|
||||
margin-top: 0.1em;
|
||||
}
|
||||
|
||||
ul, ol {
|
||||
list-style-position: outside;
|
||||
}
|
||||
ol.arabic {
|
||||
list-style-type: decimal;
|
||||
}
|
||||
ol.loweralpha {
|
||||
list-style-type: lower-alpha;
|
||||
}
|
||||
ol.upperalpha {
|
||||
list-style-type: upper-alpha;
|
||||
}
|
||||
ol.lowerroman {
|
||||
list-style-type: lower-roman;
|
||||
}
|
||||
ol.upperroman {
|
||||
list-style-type: upper-roman;
|
||||
}
|
||||
|
||||
div.compact ul, div.compact ol,
|
||||
div.compact p, div.compact p,
|
||||
div.compact div, div.compact div {
|
||||
margin-top: 0.1em;
|
||||
margin-bottom: 0.1em;
|
||||
}
|
||||
|
||||
tfoot {
|
||||
font-weight: bold;
|
||||
}
|
||||
td > div.verse {
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
div.hdlist {
|
||||
margin-top: 0.8em;
|
||||
margin-bottom: 0.8em;
|
||||
}
|
||||
div.hdlist tr {
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
dt.hdlist1.strong, td.hdlist1.strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
td.hdlist1 {
|
||||
vertical-align: top;
|
||||
font-style: normal;
|
||||
padding-right: 0.8em;
|
||||
color: navy;
|
||||
}
|
||||
td.hdlist2 {
|
||||
vertical-align: top;
|
||||
}
|
||||
div.hdlist.compact tr {
|
||||
margin: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.comment {
|
||||
background: yellow;
|
||||
}
|
||||
|
||||
.footnote, .footnoteref {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
span.footnote, span.footnoteref {
|
||||
vertical-align: super;
|
||||
}
|
||||
|
||||
#footnotes {
|
||||
margin: 20px 0 20px 0;
|
||||
padding: 7px 0 0 0;
|
||||
}
|
||||
|
||||
#footnotes div.footnote {
|
||||
margin: 0 0 5px 0;
|
||||
}
|
||||
|
||||
#footnotes hr {
|
||||
border: none;
|
||||
border-top: 1px solid silver;
|
||||
height: 1px;
|
||||
text-align: left;
|
||||
margin-left: 0;
|
||||
width: 20%;
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
div.colist td {
|
||||
padding-right: 0.5em;
|
||||
padding-bottom: 0.3em;
|
||||
vertical-align: top;
|
||||
}
|
||||
div.colist td img {
|
||||
margin-top: 0.3em;
|
||||
}
|
||||
|
||||
@media print {
|
||||
#footer-badges { display: none; }
|
||||
}
|
||||
|
||||
#toc {
|
||||
margin-bottom: 2.5em;
|
||||
}
|
||||
|
||||
#toctitle {
|
||||
color: #527bbd;
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 0.1em;
|
||||
}
|
||||
|
||||
div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
div.toclevel2 {
|
||||
margin-left: 2em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
div.toclevel3 {
|
||||
margin-left: 4em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
div.toclevel4 {
|
||||
margin-left: 6em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
span.aqua { color: aqua; }
|
||||
span.black { color: black; }
|
||||
span.blue { color: blue; }
|
||||
span.fuchsia { color: fuchsia; }
|
||||
span.gray { color: gray; }
|
||||
span.green { color: green; }
|
||||
span.lime { color: lime; }
|
||||
span.maroon { color: maroon; }
|
||||
span.navy { color: navy; }
|
||||
span.olive { color: olive; }
|
||||
span.purple { color: purple; }
|
||||
span.red { color: red; }
|
||||
span.silver { color: silver; }
|
||||
span.teal { color: teal; }
|
||||
span.white { color: white; }
|
||||
span.yellow { color: yellow; }
|
||||
|
||||
span.aqua-background { background: aqua; }
|
||||
span.black-background { background: black; }
|
||||
span.blue-background { background: blue; }
|
||||
span.fuchsia-background { background: fuchsia; }
|
||||
span.gray-background { background: gray; }
|
||||
span.green-background { background: green; }
|
||||
span.lime-background { background: lime; }
|
||||
span.maroon-background { background: maroon; }
|
||||
span.navy-background { background: navy; }
|
||||
span.olive-background { background: olive; }
|
||||
span.purple-background { background: purple; }
|
||||
span.red-background { background: red; }
|
||||
span.silver-background { background: silver; }
|
||||
span.teal-background { background: teal; }
|
||||
span.white-background { background: white; }
|
||||
span.yellow-background { background: yellow; }
|
||||
|
||||
span.big { font-size: 2em; }
|
||||
span.small { font-size: 0.6em; }
|
||||
|
||||
span.underline { text-decoration: underline; }
|
||||
span.overline { text-decoration: overline; }
|
||||
span.line-through { text-decoration: line-through; }
|
||||
|
||||
div.unbreakable { page-break-inside: avoid; }
|
||||
|
||||
|
||||
/*
|
||||
* xhtml11 specific
|
||||
*
|
||||
* */
|
||||
|
||||
div.tableblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
div.tableblock > table {
|
||||
border: 3px solid #527bbd;
|
||||
}
|
||||
thead, p.table.header {
|
||||
font-weight: bold;
|
||||
color: #527bbd;
|
||||
}
|
||||
p.table {
|
||||
margin-top: 0;
|
||||
}
|
||||
/* Because the table frame attribute is overriden by CSS in most browsers. */
|
||||
div.tableblock > table[frame="void"] {
|
||||
border-style: none;
|
||||
}
|
||||
div.tableblock > table[frame="hsides"] {
|
||||
border-left-style: none;
|
||||
border-right-style: none;
|
||||
}
|
||||
div.tableblock > table[frame="vsides"] {
|
||||
border-top-style: none;
|
||||
border-bottom-style: none;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* html5 specific
|
||||
*
|
||||
* */
|
||||
|
||||
table.tableblock {
|
||||
margin-top: 1.0em;
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
thead, p.tableblock.header {
|
||||
font-weight: bold;
|
||||
color: #527bbd;
|
||||
}
|
||||
p.tableblock {
|
||||
margin-top: 0;
|
||||
}
|
||||
table.tableblock {
|
||||
border-width: 3px;
|
||||
border-spacing: 0px;
|
||||
border-style: solid;
|
||||
border-color: #527bbd;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
th.tableblock, td.tableblock {
|
||||
border-width: 1px;
|
||||
padding: 4px;
|
||||
border-style: solid;
|
||||
border-color: #527bbd;
|
||||
}
|
||||
|
||||
table.tableblock.frame-topbot {
|
||||
border-left-style: hidden;
|
||||
border-right-style: hidden;
|
||||
}
|
||||
table.tableblock.frame-sides {
|
||||
border-top-style: hidden;
|
||||
border-bottom-style: hidden;
|
||||
}
|
||||
table.tableblock.frame-none {
|
||||
border-style: hidden;
|
||||
}
|
||||
|
||||
th.tableblock.halign-left, td.tableblock.halign-left {
|
||||
text-align: left;
|
||||
}
|
||||
th.tableblock.halign-center, td.tableblock.halign-center {
|
||||
text-align: center;
|
||||
}
|
||||
th.tableblock.halign-right, td.tableblock.halign-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
th.tableblock.valign-top, td.tableblock.valign-top {
|
||||
vertical-align: top;
|
||||
}
|
||||
th.tableblock.valign-middle, td.tableblock.valign-middle {
|
||||
vertical-align: middle;
|
||||
}
|
||||
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* manpage specific
|
||||
*
|
||||
* */
|
||||
|
||||
body.manpage h1 {
|
||||
padding-top: 0.5em;
|
||||
padding-bottom: 0.5em;
|
||||
border-top: 2px solid silver;
|
||||
border-bottom: 2px solid silver;
|
||||
}
|
||||
body.manpage h2 {
|
||||
border-style: none;
|
||||
}
|
||||
body.manpage div.sectionbody {
|
||||
margin-left: 3em;
|
||||
}
|
||||
|
||||
@media print {
|
||||
body.manpage div#toc { display: none; }
|
||||
}
|
||||
|
||||
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
/*<+'])');
|
||||
// Function that scans the DOM tree for header elements (the DOM2
|
||||
// nodeIterator API would be a better technique but not supported by all
|
||||
// browsers).
|
||||
var iterate = function (el) {
|
||||
for (var i = el.firstChild; i != null; i = i.nextSibling) {
|
||||
if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
|
||||
var mo = re.exec(i.tagName);
|
||||
if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
|
||||
result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
|
||||
}
|
||||
iterate(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
iterate(el);
|
||||
return result;
|
||||
}
|
||||
|
||||
var toc = document.getElementById("toc");
|
||||
if (!toc) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Delete existing TOC entries in case we're reloading the TOC.
|
||||
var tocEntriesToRemove = [];
|
||||
var i;
|
||||
for (i = 0; i < toc.childNodes.length; i++) {
|
||||
var entry = toc.childNodes[i];
|
||||
if (entry.nodeName.toLowerCase() == 'div'
|
||||
&& entry.getAttribute("class")
|
||||
&& entry.getAttribute("class").match(/^toclevel/))
|
||||
tocEntriesToRemove.push(entry);
|
||||
}
|
||||
for (i = 0; i < tocEntriesToRemove.length; i++) {
|
||||
toc.removeChild(tocEntriesToRemove[i]);
|
||||
}
|
||||
|
||||
// Rebuild TOC entries.
|
||||
var entries = tocEntries(document.getElementById("content"), toclevels);
|
||||
for (var i = 0; i < entries.length; ++i) {
|
||||
var entry = entries[i];
|
||||
if (entry.element.id == "")
|
||||
entry.element.id = "_toc_" + i;
|
||||
var a = document.createElement("a");
|
||||
a.href = "#" + entry.element.id;
|
||||
a.appendChild(document.createTextNode(entry.text));
|
||||
var div = document.createElement("div");
|
||||
div.appendChild(a);
|
||||
div.className = "toclevel" + entry.toclevel;
|
||||
toc.appendChild(div);
|
||||
}
|
||||
if (entries.length == 0)
|
||||
toc.parentNode.removeChild(toc);
|
||||
},
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// Footnotes generator
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
/* Based on footnote generation code from:
|
||||
* http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
|
||||
*/
|
||||
|
||||
footnotes: function () {
|
||||
// Delete existing footnote entries in case we're reloading the footnodes.
|
||||
var i;
|
||||
var noteholder = document.getElementById("footnotes");
|
||||
if (!noteholder) {
|
||||
return;
|
||||
}
|
||||
var entriesToRemove = [];
|
||||
for (i = 0; i < noteholder.childNodes.length; i++) {
|
||||
var entry = noteholder.childNodes[i];
|
||||
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
|
||||
entriesToRemove.push(entry);
|
||||
}
|
||||
for (i = 0; i < entriesToRemove.length; i++) {
|
||||
noteholder.removeChild(entriesToRemove[i]);
|
||||
}
|
||||
|
||||
// Rebuild footnote entries.
|
||||
var cont = document.getElementById("content");
|
||||
var spans = cont.getElementsByTagName("span");
|
||||
var refs = {};
|
||||
var n = 0;
|
||||
for (i=0; i<spans.length; i++) {
|
||||
if (spans[i].className == "footnote") {
|
||||
n++;
|
||||
var note = spans[i].getAttribute("data-note");
|
||||
if (!note) {
|
||||
// Use [\s\S] in place of . so multi-line matches work.
|
||||
// Because JavaScript has no s (dotall) regex flag.
|
||||
note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
|
||||
spans[i].innerHTML =
|
||||
"[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
|
||||
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
||||
spans[i].setAttribute("data-note", note);
|
||||
}
|
||||
noteholder.innerHTML +=
|
||||
"<div class='footnote' id='_footnote_" + n + "'>" +
|
||||
"<a href='#_footnoteref_" + n + "' title='Return to text'>" +
|
||||
n + "</a>. " + note + "</div>";
|
||||
var id =spans[i].getAttribute("id");
|
||||
if (id != null) refs["#"+id] = n;
|
||||
}
|
||||
}
|
||||
if (n == 0)
|
||||
noteholder.parentNode.removeChild(noteholder);
|
||||
else {
|
||||
// Process footnoterefs.
|
||||
for (i=0; i<spans.length; i++) {
|
||||
if (spans[i].className == "footnoteref") {
|
||||
var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
|
||||
href = href.match(/#.*/)[0]; // Because IE return full URL.
|
||||
n = refs[href];
|
||||
spans[i].innerHTML =
|
||||
"[<a href='#_footnote_" + n +
|
||||
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
install: function(toclevels) {
|
||||
var timerId;
|
||||
|
||||
function reinstall() {
|
||||
asciidoc.footnotes();
|
||||
if (toclevels) {
|
||||
asciidoc.toc(toclevels);
|
||||
}
|
||||
}
|
||||
|
||||
function reinstallAndRemoveTimer() {
|
||||
clearInterval(timerId);
|
||||
reinstall();
|
||||
}
|
||||
|
||||
timerId = setInterval(reinstall, 500);
|
||||
if (document.addEventListener)
|
||||
document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
|
||||
else
|
||||
window.onload = reinstallAndRemoveTimer;
|
||||
}
|
||||
|
||||
}
|
||||
asciidoc.install();
|
||||
/*]]>*/
|
||||
</script>
|
||||
</head>
|
||||
<body class="manpage">
|
||||
<div id="header">
|
||||
<h1>
|
||||
nvme-verify(1) Manual Page
|
||||
</h1>
|
||||
<h2>NAME</h2>
|
||||
<div class="sectionbody">
|
||||
<p>nvme-verify -
|
||||
Send an NVMe Verify command, return results
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="content">
|
||||
<div class="sect1">
|
||||
<h2 id="_synopsis">SYNOPSIS</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="verseblock">
|
||||
<pre class="content"><em>nvme-verify</em> <device> [--namespace-id=<nsid> | -n <nsid>]
|
||||
[--start-block=<slba> | -s <slba>]
|
||||
[--block-count=<nlb> | -c <nlb>]
|
||||
[--limited-retry | -l]
|
||||
[--force-unit-access | -f]
|
||||
[--prinfo=<prinfo> | -p <prinfo>]
|
||||
[--ref-tag=<reftag> | -r <reftag>]
|
||||
[--app-tag-mask=<appmask> | -m <appmask>]
|
||||
[--app-tag=<apptag> | -a <apptag>]
|
||||
[--storage-tag<storage-tag> | -S <storage-tag>]
|
||||
[--storage-tag-check<storage-tag-check> | -C <storage-tag-check>]</pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_description">DESCRIPTION</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>The Verify command verifies the integrity of the stored information by
|
||||
reading data and metadata.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_options">OPTIONS</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="dlist"><dl>
|
||||
<dt class="hdlist1">
|
||||
--namespace-id=<nsid>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-n <nsid>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Namespace ID use in the command.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
--start-block=<slba>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-s <slba>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Start block address.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
--block-count=<nlb>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-c <nlb>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Number of logical blocks to Verify.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
--limited-retry
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-l
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Sets the limited retry flag.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
--force-unit-access
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-f
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Set the force-unit access flag.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
--prinfo=<prinfo>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-p <prinfo>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Protection Information field definition.
|
||||
</p>
|
||||
<div class="tableblock">
|
||||
<table rules="all"
|
||||
width="100%"
|
||||
frame="border"
|
||||
cellspacing="0" cellpadding="4">
|
||||
<col width="50%" />
|
||||
<col width="50%" />
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="left" valign="top"><p class="table">Bit</p></td>
|
||||
<td align="left" valign="top"><p class="table">Description</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" valign="top"><p class="table">3</p></td>
|
||||
<td align="left" valign="top"><p class="table">PRACT: Protection Information Action. When set to 1, PI is stripped/inserted
|
||||
on read/write when the block format’s metadata size is 8. When set to 0,
|
||||
metadata is passes.</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" valign="top"><p class="table">2:0</p></td>
|
||||
<td align="left" valign="top"><p class="table">PRCHK: Protection Information Check:</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" valign="top"><p class="table">2</p></td>
|
||||
<td align="left" valign="top"><p class="table">Set to 1 enables checking the guard tag</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" valign="top"><p class="table">1</p></td>
|
||||
<td align="left" valign="top"><p class="table">Set to 1 enables checking the application tag</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left" valign="top"><p class="table">0</p></td>
|
||||
<td align="left" valign="top"><p class="table">Set to 1 enables checking the reference tag</p></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
--ref-tag=<reftag>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-r <reftag>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Optional reftag when used with protection information.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
--app-tag-mask=<appmask>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-m <appmask>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Optional application tag mask when used with protection information.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
--app-tag=<apptag>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-a <apptag>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Optional application tag when used with protection information.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
--storage-tag=<storage-tag>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-S <storage-tag>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Variable Sized Expected Logical Block Storage Tag(ELBST) and Expected Logical
|
||||
Block Reference Tag (ELBRT), CDW2 and CDW3 (00:47) bits.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
--storage-tag-check=<storage-tag-check>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-C <storage-tag-check>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
This bit specifies the Storage Tag field shall be checked as part of Verify operation.
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_examples">EXAMPLES</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>No examples yet.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_nvme">NVME</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>Part of the nvme-user suite</p></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footnotes"><hr /></div>
|
||||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated
|
||||
2021-07-09 13:43:04 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
93
Documentation/nvme-verify.txt
Normal file
93
Documentation/nvme-verify.txt
Normal file
|
@ -0,0 +1,93 @@
|
|||
nvme-verify(1)
|
||||
==============
|
||||
|
||||
NAME
|
||||
----
|
||||
nvme-verify - Send an NVMe Verify command, return results
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'nvme-verify' <device> [--namespace-id=<nsid> | -n <nsid>]
|
||||
[--start-block=<slba> | -s <slba>]
|
||||
[--block-count=<nlb> | -c <nlb>]
|
||||
[--limited-retry | -l]
|
||||
[--force-unit-access | -f]
|
||||
[--prinfo=<prinfo> | -p <prinfo>]
|
||||
[--ref-tag=<reftag> | -r <reftag>]
|
||||
[--app-tag-mask=<appmask> | -m <appmask>]
|
||||
[--app-tag=<apptag> | -a <apptag>]
|
||||
[--storage-tag<storage-tag> | -S <storage-tag>]
|
||||
[--storage-tag-check<storage-tag-check> | -C <storage-tag-check>]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
The Verify command verifies the integrity of the stored information by
|
||||
reading data and metadata.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
--namespace-id=<nsid>::
|
||||
-n <nsid>::
|
||||
Namespace ID use in the command.
|
||||
|
||||
--start-block=<slba>::
|
||||
-s <slba>::
|
||||
Start block address.
|
||||
|
||||
--block-count=<nlb>::
|
||||
-c <nlb>::
|
||||
Number of logical blocks to Verify.
|
||||
|
||||
--limited-retry::
|
||||
-l::
|
||||
Sets the limited retry flag.
|
||||
|
||||
--force-unit-access::
|
||||
-f::
|
||||
Set the force-unit access flag.
|
||||
|
||||
--prinfo=<prinfo>::
|
||||
-p <prinfo>::
|
||||
Protection Information field definition.
|
||||
+
|
||||
[]
|
||||
|=================
|
||||
|Bit|Description
|
||||
|3|PRACT: Protection Information Action. When set to 1, PI is stripped/inserted
|
||||
on read/write when the block format's metadata size is 8. When set to 0,
|
||||
metadata is passes.
|
||||
|2:0|PRCHK: Protection Information Check:
|
||||
|2|Set to 1 enables checking the guard tag
|
||||
|1|Set to 1 enables checking the application tag
|
||||
|0|Set to 1 enables checking the reference tag
|
||||
|=================
|
||||
|
||||
--ref-tag=<reftag>::
|
||||
-r <reftag>::
|
||||
Optional reftag when used with protection information.
|
||||
|
||||
--app-tag-mask=<appmask>::
|
||||
-m <appmask>::
|
||||
Optional application tag mask when used with protection information.
|
||||
|
||||
--app-tag=<apptag>::
|
||||
-a <apptag>::
|
||||
Optional application tag when used with protection information.
|
||||
|
||||
--storage-tag=<storage-tag>::
|
||||
-S <storage-tag>::
|
||||
Variable Sized Expected Logical Block Storage Tag(ELBST) and Expected Logical
|
||||
Block Reference Tag (ELBRT), CDW2 and CDW3 (00:47) bits.
|
||||
|
||||
--storage-tag-check=<storage-tag-check>::
|
||||
-C <storage-tag-check>::
|
||||
This bit specifies the Storage Tag field shall be checked as part of Verify operation.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
No examples yet.
|
||||
|
||||
NVME
|
||||
----
|
||||
Part of the nvme-user suite
|
|
@ -1,13 +1,13 @@
|
|||
'\" t
|
||||
.\" Title: nvme-zeroes
|
||||
.\" 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: 07/09/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-ZEROES" "1" "10/20/2020" "NVMe" "NVMe Manual"
|
||||
.TH "NVME\-ZEROES" "1" "07/09/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
|
@ -42,6 +42,8 @@ nvme-write-zeroes \- Send an NVMe write zeroes command, return results
|
|||
[\-\-limited\-retry | \-l]
|
||||
[\-\-force\-unit\-access | \-f]
|
||||
[\-\-namespace\-id=<nsid> | \-n <nsid>]
|
||||
[\-\-storage\-tag<storage\-tag> | \-S <storage\-tag>]
|
||||
[\-\-storage\-tag\-check<storage\-tag\-check> | \-C <storage\-tag\-check>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -137,19 +139,19 @@ Set the force\-unit access flag\&.
|
|||
.RS 4
|
||||
Namespace ID use in the command\&.
|
||||
.RE
|
||||
.sp
|
||||
EXAMPLES EXAMPLES
|
||||
.sp
|
||||
.if n \{\
|
||||
.PP
|
||||
\-\-storage\-tag=<storage\-tag>, \-n <storage\-tag>
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
No examples yet\&.
|
||||
|
||||
NVME
|
||||
.fi
|
||||
.if n \{\
|
||||
Variable Sized Expected Logical Block Storage Tag(ELBST) and Expected Logical Block Reference Tag (ELBRT), CDW2 and CDW3 (00:47) bits\&.
|
||||
.RE
|
||||
.\}
|
||||
.PP
|
||||
\-\-storage\-tag\-check=<storage\-tag\-check>, \-C <storage\-tag\-check>
|
||||
.RS 4
|
||||
This bit specifies the Storage Tag field shall be checked as part of end\-to\-end data protection processing\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
No examples yet\&.
|
||||
.SH "NVME"
|
||||
.sp
|
||||
Part of the nvme\-user suite
|
||||
|
|
|
@ -758,7 +758,9 @@ nvme-zeroes(1) Manual Page
|
|||
[--deac | -d]
|
||||
[--limited-retry | -l]
|
||||
[--force-unit-access | -f]
|
||||
[--namespace-id=<nsid> | -n <nsid>]</pre>
|
||||
[--namespace-id=<nsid> | -n <nsid>]
|
||||
[--storage-tag<storage-tag> | -S <storage-tag>]
|
||||
[--storage-tag-check<storage-tag-check> | -C <storage-tag-check>]</pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
</div>
|
||||
|
@ -920,15 +922,42 @@ metadata is passes.</p></td>
|
|||
Namespace ID use in the command.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
--storage-tag=<storage-tag>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-n <storage-tag>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
Variable Sized Expected Logical Block Storage Tag(ELBST) and Expected Logical
|
||||
Block Reference Tag (ELBRT), CDW2 and CDW3 (00:47) bits.
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
--storage-tag-check=<storage-tag-check>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-C <storage-tag-check>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
This bit specifies the Storage Tag field shall be checked as part of end-to-end
|
||||
data protection processing.
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
<div class="paragraph"><p>EXAMPLES
|
||||
EXAMPLES</p></div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><code>No examples yet.
|
||||
|
||||
NVME</code></pre>
|
||||
</div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_examples">EXAMPLES</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>No examples yet.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sect1">
|
||||
<h2 id="_nvme">NVME</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="paragraph"><p>Part of the nvme-user suite</p></div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -937,7 +966,7 @@ NVME</code></pre>
|
|||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated
|
||||
2019-09-18 00:00:58 JST
|
||||
2021-07-09 13:42:09 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -18,6 +18,8 @@ SYNOPSIS
|
|||
[--limited-retry | -l]
|
||||
[--force-unit-access | -f]
|
||||
[--namespace-id=<nsid> | -n <nsid>]
|
||||
[--storage-tag<storage-tag> | -S <storage-tag>]
|
||||
[--storage-tag-check<storage-tag-check> | -C <storage-tag-check>]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
@ -77,7 +79,16 @@ metadata is passes.
|
|||
-n <nsid>::
|
||||
Namespace ID use in the command.
|
||||
|
||||
EXAMPLES
|
||||
--storage-tag=<storage-tag>::
|
||||
-n <storage-tag>::
|
||||
Variable Sized Expected Logical Block Storage Tag(ELBST) and Expected Logical
|
||||
Block Reference Tag (ELBRT), CDW2 and CDW3 (00:47) bits.
|
||||
|
||||
--storage-tag-check=<storage-tag-check>::
|
||||
-C <storage-tag-check>::
|
||||
This bit specifies the Storage Tag field shall be checked as part of end-to-end
|
||||
data protection processing.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
No examples yet.
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
'\" t
|
||||
.\" Title: nvme-write
|
||||
.\" 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: 07/09/2021
|
||||
.\" Manual: NVMe Manual
|
||||
.\" Source: NVMe
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "NVME\-WRITE" "1" "10/20/2020" "NVMe" "NVMe Manual"
|
||||
.TH "NVME\-WRITE" "1" "07/09/2021" "NVMe" "NVMe Manual"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
|
@ -50,6 +50,7 @@ nvme-write \- Send an NVMe write command, provide results
|
|||
[\-\-show\-command | \-v]
|
||||
[\-\-dry\-run | \-w]
|
||||
[\-\-latency | \-t]
|
||||
[\-\-storage\-tag\-check<storage\-tag\-check> | \-C <storage\-tag\-check>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -188,6 +189,11 @@ be set\&. Otherwise \-\-dry\-run option will be
|
|||
.RS 4
|
||||
Print out the latency the IOCTL took (in us)\&.
|
||||
.RE
|
||||
.PP
|
||||
\-\-storage\-tag\-check=<storage\-tag\-check>, \-C <storage\-tag\-check>
|
||||
.RS 4
|
||||
This bit specifies the Storage Tag field shall be checked as part of end\-to\-end data protection processing\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
No examples yet\&.
|
||||
|
|
|
@ -766,7 +766,8 @@ nvme-write(1) Manual Page
|
|||
[--dsm=<dsm> | -D <dsm>]
|
||||
[--show-command | -v]
|
||||
[--dry-run | -w]
|
||||
[--latency | -t]</pre>
|
||||
[--latency | -t]
|
||||
[--storage-tag-check<storage-tag-check> | -C <storage-tag-check>]</pre>
|
||||
<div class="attribution">
|
||||
</div></div>
|
||||
</div>
|
||||
|
@ -1035,6 +1036,18 @@ metadata is passes.</p></td>
|
|||
Print out the latency the IOCTL took (in us).
|
||||
</p>
|
||||
</dd>
|
||||
<dt class="hdlist1">
|
||||
--storage-tag-check=<storage-tag-check>
|
||||
</dt>
|
||||
<dt class="hdlist1">
|
||||
-C <storage-tag-check>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
This bit specifies the Storage Tag field shall be checked as part of end-to-end
|
||||
data protection processing.
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1055,7 +1068,7 @@ metadata is passes.</p></td>
|
|||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Last updated
|
||||
2018-11-29 13:31:13 GMT
|
||||
2021-07-09 14:16:34 IST
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -26,6 +26,7 @@ SYNOPSIS
|
|||
[--show-command | -v]
|
||||
[--dry-run | -w]
|
||||
[--latency | -t]
|
||||
[--storage-tag-check<storage-tag-check> | -C <storage-tag-check>]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
@ -136,6 +137,11 @@ metadata is passes.
|
|||
--latency::
|
||||
Print out the latency the IOCTL took (in us).
|
||||
|
||||
--storage-tag-check=<storage-tag-check>::
|
||||
-C <storage-tag-check>::
|
||||
This bit specifies the Storage Tag field shall be checked as part of end-to-end
|
||||
data protection processing.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
No examples yet.
|
||||
|
|
|
@ -32,9 +32,10 @@ nvme-zns-close-zone \- Closes one or all zones
|
|||
.SH "SYNOPSIS"
|
||||
.sp
|
||||
.nf
|
||||
\fInvme zns close\-zone nvme zns id\-ctrl\fR <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
|
||||
[\-\-start\-lba=<LBA> | \-s <LBA>]
|
||||
[\-\-select\-all | \-a]
|
||||
\fInvme zns close\-zone\fR <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
|
||||
[\-\-start\-lba=<LBA> | \-s <LBA>]
|
||||
[\-\-select\-all | \-a]
|
||||
[\-\-timeout=<timeout> | \-t <timeout>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -57,6 +58,11 @@ The starting LBA of the zone to close\&.
|
|||
.RS 4
|
||||
Select all zones for this action
|
||||
.RE
|
||||
.PP
|
||||
\-t <timeout>, \-\-timeout=<timeout>
|
||||
.RS 4
|
||||
Override default timeout value\&. In milliseconds\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
.RS 4
|
||||
|
|
|
@ -32,9 +32,10 @@ nvme-zns-finish-zone \- Finishes one or all zones
|
|||
.SH "SYNOPSIS"
|
||||
.sp
|
||||
.nf
|
||||
\fInvme zns finish\-zone nvme zns id\-ctrl\fR <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
|
||||
[\-\-start\-lba=<LBA> | \-s <LBA>]
|
||||
[\-\-select\-all | \-a]
|
||||
\fInvme zns finish\-zone\fR <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
|
||||
[\-\-start\-lba=<LBA> | \-s <LBA>]
|
||||
[\-\-select\-all | \-a]
|
||||
[\-\-timeout=<timeout> | \-t <timeout>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -57,6 +58,11 @@ The starting LBA of the zone to finish\&.
|
|||
.RS 4
|
||||
Select all zones for this action\&.
|
||||
.RE
|
||||
.PP
|
||||
\-t <timeout>, \-\-timeout=<timeout>
|
||||
.RS 4
|
||||
Override default timeout value\&. In milliseconds\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
.RS 4
|
||||
|
|
|
@ -32,9 +32,10 @@ nvme-zns-offline-zone \- Offlines one or all zones
|
|||
.SH "SYNOPSIS"
|
||||
.sp
|
||||
.nf
|
||||
\fInvme zns offline\-zone nvme zns id\-ctrl\fR <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
|
||||
[\-\-start\-lba=<LBA> | \-s <LBA>]
|
||||
[\-\-select\-all | \-a]
|
||||
\fInvme zns offline\-zone\fR <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
|
||||
[\-\-start\-lba=<LBA> | \-s <LBA>]
|
||||
[\-\-select\-all | \-a]
|
||||
[\-\-timeout=<timeout> | \-t <timeout>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -57,6 +58,11 @@ The starting LBA of the zone to offline\&.
|
|||
.RS 4
|
||||
Select all zones for this action
|
||||
.RE
|
||||
.PP
|
||||
\-t <timeout>, \-\-timeout=<timeout>
|
||||
.RS 4
|
||||
Override default timeout value\&. In milliseconds\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
.RS 4
|
||||
|
|
|
@ -32,9 +32,10 @@ nvme-zns-open-zone \- Opens one or all zones
|
|||
.SH "SYNOPSIS"
|
||||
.sp
|
||||
.nf
|
||||
\fInvme zns open\-zone nvme zns id\-ctrl\fR <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
|
||||
[\-\-start\-lba=<LBA> | \-s <LBA>]
|
||||
[\-\-select\-all | \-a]
|
||||
\fInvme zns open\-zone\fR <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
|
||||
[\-\-start\-lba=<LBA> | \-s <LBA>]
|
||||
[\-\-select\-all | \-a]
|
||||
[\-\-timeout=<timeout> | \-t <timeout>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -57,6 +58,11 @@ The starting LBA of the zone to open\&.
|
|||
.RS 4
|
||||
Select all zones for this action
|
||||
.RE
|
||||
.PP
|
||||
\-t <timeout>, \-\-timeout=<timeout>
|
||||
.RS 4
|
||||
Override default timeout value\&. In milliseconds\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
.RS 4
|
||||
|
|
|
@ -33,8 +33,9 @@ nvme-zns-reset-zone \- Resets one or all zones
|
|||
.sp
|
||||
.nf
|
||||
\fInvme zns reset\-zone\fR <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
|
||||
[\-\-start\-lba=<LBA> | \-s <LBA>]
|
||||
[\-\-select\-all | \-a]
|
||||
[\-\-start\-lba=<LBA> | \-s <LBA>]
|
||||
[\-\-select\-all | \-a]
|
||||
[\-\-timeout=<timeout> | \-t <timeout>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -57,6 +58,11 @@ The starting LBA of the zone to reset\&.
|
|||
.RS 4
|
||||
Select all zones for this action
|
||||
.RE
|
||||
.PP
|
||||
\-t <timeout>, \-\-timeout=<timeout>
|
||||
.RS 4
|
||||
Override default timeout value\&. In milliseconds\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
.RS 4
|
||||
|
|
|
@ -33,8 +33,9 @@ nvme-zns-set-zone-desc \- Set extended descriptor data for a zone
|
|||
.sp
|
||||
.nf
|
||||
\fInvme zns setzone\-desc\fR <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
|
||||
[\-\-start\-lba=<IONUM>, \-s <IONUM>]
|
||||
[\-data=<FILE>, \-d <FILE>]
|
||||
[\-\-start\-lba=<IONUM>, \-s <IONUM>]
|
||||
[\-data=<FILE>, \-d <FILE>]
|
||||
[\-\-timeout=<timeout> | \-t <timeout>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -55,6 +56,11 @@ The starting LBA of the zone to manage send\&.
|
|||
.RS 4
|
||||
Optional file for data (default stdin)
|
||||
.RE
|
||||
.PP
|
||||
\-t <timeout>, \-\-timeout=<timeout>
|
||||
.RS 4
|
||||
Override default timeout value\&. In milliseconds\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
.RS 4
|
||||
|
|
|
@ -33,11 +33,12 @@ nvme-zns-zone-mgmt-send \- Zone Management Send command
|
|||
.sp
|
||||
.nf
|
||||
\fInvme zns zone\-mgmt\-send\fR <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
|
||||
[\-\-start\-lba=<IONUM>, \-s <IONUM>]
|
||||
[\-\-select\-all, \-a]
|
||||
[\-\-zsa=<NUM>, \-z <NUM>]
|
||||
[\-\-data\-len=<IONUM>, \-l <IONUM>]
|
||||
[\-data=<FILE>, \-d <FILE>]
|
||||
[\-\-start\-lba=<IONUM>, \-s <IONUM>]
|
||||
[\-\-select\-all, \-a]
|
||||
[\-\-zsa=<NUM>, \-z <NUM>]
|
||||
[\-\-data\-len=<IONUM>, \-l <IONUM>]
|
||||
[\-data=<FILE>, \-d <FILE>]
|
||||
[\-\-timeout=<timeout> | \-t <timeout>]
|
||||
.fi
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
|
@ -78,6 +79,11 @@ Buffer length if data required
|
|||
.RS 4
|
||||
Optional file for data (default stdin)
|
||||
.RE
|
||||
.PP
|
||||
\-t <timeout>, \-\-timeout=<timeout>
|
||||
.RS 4
|
||||
Override default timeout value\&. In milliseconds\&.
|
||||
.RE
|
||||
.SH "EXAMPLES"
|
||||
.sp
|
||||
.RS 4
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/bin/sh
|
||||
|
||||
GVF=NVME-VERSION-FILE
|
||||
DEF_VER=v1.14
|
||||
DEF_VER=v1.15
|
||||
|
||||
LF='
|
||||
'
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*/
|
||||
|
||||
#undef NAME
|
||||
#define NAME(n, d)
|
||||
#define NAME(n, d, v)
|
||||
|
||||
#undef ENTRY
|
||||
#define ENTRY(n, h, f, ...) \
|
||||
|
@ -26,7 +26,7 @@ static int f(int argc, char **argv, struct command *command, struct plugin *plug
|
|||
*/
|
||||
|
||||
#undef NAME
|
||||
#define NAME(n, d)
|
||||
#define NAME(n, d, v)
|
||||
|
||||
#undef ENTRY_W_ALIAS
|
||||
#define ENTRY_W_ALIAS(n, h, f, a) \
|
||||
|
@ -63,7 +63,7 @@ static struct command f ## _cmd = { \
|
|||
*/
|
||||
|
||||
#undef NAME
|
||||
#define NAME(n, d)
|
||||
#define NAME(n, d, v)
|
||||
|
||||
#undef ENTRY
|
||||
#define ENTRY(n, h, f, ...) &f ## _cmd,
|
||||
|
@ -87,7 +87,7 @@ static struct command *commands[] = { \
|
|||
*/
|
||||
|
||||
#undef NAME
|
||||
#define NAME(n, d) .name = n, .desc = d,
|
||||
#define NAME(n, d, v) .name = n, .desc = d, .version = v,
|
||||
|
||||
#undef COMMAND_LIST
|
||||
#define COMMAND_LIST(args...)
|
||||
|
|
|
@ -11,6 +11,7 @@ _nvme () {
|
|||
'id-ns:display information about the namespace'
|
||||
'list-ns:identify all namespace(s) attached'
|
||||
'id-iocs:display information about I/O command sets'
|
||||
'id-domain:display information about domain list'
|
||||
'create-ns:create a new namespace before attachment'
|
||||
'delete-ns:delete a detached namespace'
|
||||
'attach-ns:attach namespace to controller'
|
||||
|
@ -47,6 +48,7 @@ _nvme () {
|
|||
'compare:compare data on device to data elsewhere'
|
||||
'read:submit a read command'
|
||||
'write:submit a write command'
|
||||
'capacity-mgmt: submit capacity management command'
|
||||
'show-regs:shows the controller registers; requires admin character device'
|
||||
'help:print brief descriptions of all nvme commands'
|
||||
)
|
||||
|
@ -113,6 +115,16 @@ _nvme () {
|
|||
_arguments '*:: :->subcmds'
|
||||
_describe -t commands "nvme id-iocs options" _idiocs
|
||||
;;
|
||||
(id-domain)
|
||||
local _iddomain
|
||||
_iddomain=(
|
||||
/dev/nvme':supply a device to use (required)'
|
||||
--dom-id=':show infos for domain id <cntid>'
|
||||
-d':alias of --dom-id'
|
||||
)
|
||||
_arguments '*:: :->subcmds'
|
||||
_describe -t commands "nvme id-domain options" _iddomain
|
||||
;;
|
||||
nvm-id-ctrl)
|
||||
local _nvmidctrl
|
||||
_nvmidctrl=(
|
||||
|
@ -232,14 +244,14 @@ _nvme () {
|
|||
--log-entries=': Number of pending NVM Set Entries log list'
|
||||
-e':alias to --log-entries'
|
||||
--rae': Retain an Asynchronous Event'
|
||||
-r':alias to --rae
|
||||
-r':alias to --rae'
|
||||
--raw-binary':dump infos in binary format'
|
||||
-b':alias of --raw-binary'
|
||||
)
|
||||
_arguments '*:: :->subcmds'
|
||||
_describe -t commands "nvme pred-lat-event-agg-log options" _predlateventagglog
|
||||
;;
|
||||
(predictablelatlog)
|
||||
(predictable-lat-log)
|
||||
local _predictablelatlog
|
||||
_predictablelatlog=(
|
||||
/dev/nvme':supply a device to use (required)'
|
||||
|
@ -306,7 +318,7 @@ _nvme () {
|
|||
--log-entries=': Number of Endurance Group Event Agg Entries log list'
|
||||
-e':alias to --log-entries'
|
||||
--rae': Retain an Asynchronous Event'
|
||||
-r':alias to --rae
|
||||
-r':alias to --rae'
|
||||
--raw-binary':dump infos in binary format'
|
||||
-b':alias of --raw-binary'
|
||||
)
|
||||
|
@ -318,7 +330,7 @@ _nvme () {
|
|||
_lbastatuslog=(
|
||||
/dev/nvme':supply a device to use (required)'
|
||||
--rae': Retain an Asynchronous Event'
|
||||
-r':alias to --rae
|
||||
-r':alias to --rae'
|
||||
)
|
||||
_arguments '*:: :->subcmds'
|
||||
_describe -t commands "nvme lba-status-log options" _lbastatuslog
|
||||
|
@ -343,6 +355,8 @@ _nvme () {
|
|||
-s':alias to --sel'
|
||||
--data-len=':buffer len for returned LBA Type Range or host identifier data'
|
||||
-l':alias for --data-len'
|
||||
--uuid-index=':uuid index'
|
||||
-U':alias for --uuid-index'
|
||||
--cdw11=':dword 11 value, used for interrupt vector configuration only'
|
||||
--raw-binary':dump infos in binary format'
|
||||
-b':alias to --raw-binary'
|
||||
|
@ -364,6 +378,8 @@ _nvme () {
|
|||
-d':alias to --data'
|
||||
--value=':new value of feature (required)'
|
||||
-v'alias to --value'
|
||||
--uuid-index=':uuid index'
|
||||
-U':alias for --uuid-index'
|
||||
)
|
||||
_arguments '*:: :->subcmds'
|
||||
_describe -t commands "nvme set-feature options" _setf
|
||||
|
@ -414,6 +430,22 @@ _nvme () {
|
|||
_arguments '*:: :->subcmds'
|
||||
_describe -t commands "nvme fw-download options" _fwd
|
||||
;;
|
||||
(capacity-mgmt)
|
||||
local _fwd
|
||||
_fwd=(
|
||||
/dev/nvme':supply a device to use (required)'
|
||||
--operation=':Operation to be performed by the controller'
|
||||
-o':alias of --operation'
|
||||
--element-id=':specific to the value of the Operation field'
|
||||
-i':alias of --element-id'
|
||||
--cap-lower=':Least significant 32 bits of the capacity in bytes'
|
||||
-l':alias of --cap-lower'
|
||||
--cap-upper=':Most significant 32 bits of the capacity in bytes'
|
||||
-u':alias of --cap-upper'
|
||||
)
|
||||
_arguments '*:: :->subcmds'
|
||||
_describe -t commands "nvme capacity-mgmt options" _fwd
|
||||
;;
|
||||
(admin-passthru)
|
||||
local _admin
|
||||
_admin=(
|
||||
|
@ -558,7 +590,7 @@ _nvme () {
|
|||
-p':alias for --prkey'
|
||||
--rtype=':hexadecimal reservation type'
|
||||
-t':alias for --rtype'
|
||||
--racqa=':reservation acquiry action'
|
||||
--racqa=':reservation acquire action'
|
||||
-a':alias for --racqa'
|
||||
--iekey=':ignore existing reservation key'
|
||||
-i':alias for --iekey'
|
||||
|
@ -611,7 +643,7 @@ _nvme () {
|
|||
--cptpl=':change persistence through power loss setting'
|
||||
-p':alias for --cptpl'
|
||||
--rrega=':reservation registration action to perform'
|
||||
-a':alias for --rrega'
|
||||
-r':alias for --rrega'
|
||||
--iekey':ignore existing reservation key'
|
||||
-i':alias for --iekey'
|
||||
)
|
||||
|
@ -788,7 +820,7 @@ _nvme () {
|
|||
security-send security-recv resv-acquire resv-register resv-release
|
||||
resv-report flush compare read write copy show-regs persistent-event-log
|
||||
pred-lat-event-agg-log nvm-id-ctrl endurance-event-agg-log lba-status-log
|
||||
resv-notif-log
|
||||
resv-notif-log capacity-mgmt id-domain
|
||||
)
|
||||
_arguments '*:: :->subcmds'
|
||||
_describe -t commands "help: infos on a specific nvme command, or provide no option to see a synopsis of all nvme commands" _h
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
|||
# Used for extracting default parameters for discovery
|
||||
#
|
||||
# Example:
|
||||
# --transport=<trtype> --traddr=<traddr> --trsvcid=<trsvcid> --host-traddr=<host-traddr>
|
||||
# --transport=<trtype> --traddr=<traddr> --trsvcid=<trsvcid> --host-traddr=<host-traddr> --host-iface=<host-iface>
|
||||
|
|
145
fabrics.c
145
fabrics.c
|
@ -66,9 +66,11 @@ const char *conarg_transport = "transport";
|
|||
const char *conarg_traddr = "traddr";
|
||||
const char *conarg_trsvcid = "trsvcid";
|
||||
const char *conarg_host_traddr = "host_traddr";
|
||||
const char *conarg_host_iface = "host_iface";
|
||||
|
||||
struct fabrics_config fabrics_cfg = {
|
||||
.ctrl_loss_tmo = -1,
|
||||
.fast_io_fail_tmo = -1,
|
||||
.output_format = "normal",
|
||||
};
|
||||
|
||||
|
@ -78,6 +80,7 @@ struct connect_args {
|
|||
char *traddr;
|
||||
char *trsvcid;
|
||||
char *host_traddr;
|
||||
char *host_iface;
|
||||
struct connect_args *next;
|
||||
struct connect_args *tail;
|
||||
};
|
||||
|
@ -300,6 +303,7 @@ static bool ctrl_matches_connectargs(const char *name, struct connect_args *args
|
|||
cargs.traddr = parse_conn_arg(addr, ' ', conarg_traddr);
|
||||
cargs.trsvcid = parse_conn_arg(addr, ' ', conarg_trsvcid);
|
||||
cargs.host_traddr = parse_conn_arg(addr, ' ', conarg_host_traddr);
|
||||
cargs.host_iface = parse_conn_arg(addr, ' ', conarg_host_iface);
|
||||
|
||||
if (!strcmp(cargs.subsysnqn, NVME_DISC_SUBSYS_NAME)) {
|
||||
char *kato_str = nvme_get_ctrl_attr(path, "kato"), *p;
|
||||
|
@ -331,7 +335,9 @@ static bool ctrl_matches_connectargs(const char *name, struct connect_args *args
|
|||
(!strcmp(cargs.trsvcid, args->trsvcid) ||
|
||||
!strcmp(args->trsvcid, "none")) &&
|
||||
(!strcmp(cargs.host_traddr, args->host_traddr) ||
|
||||
!strcmp(args->host_traddr, "none")))
|
||||
!strcmp(args->host_traddr, "none")) &&
|
||||
(!strcmp(cargs.host_iface, args->host_iface) ||
|
||||
!strcmp(args->host_iface, "none")))
|
||||
found = true;
|
||||
|
||||
free(cargs.subsysnqn);
|
||||
|
@ -339,6 +345,7 @@ static bool ctrl_matches_connectargs(const char *name, struct connect_args *args
|
|||
free(cargs.traddr);
|
||||
free(cargs.trsvcid);
|
||||
free(cargs.host_traddr);
|
||||
free(cargs.host_iface);
|
||||
free(addr);
|
||||
free(path);
|
||||
|
||||
|
@ -394,6 +401,7 @@ static struct connect_args *extract_connect_args(char *argstr)
|
|||
cargs->traddr = parse_conn_arg(argstr, ',', conarg_traddr);
|
||||
cargs->trsvcid = parse_conn_arg(argstr, ',', conarg_trsvcid);
|
||||
cargs->host_traddr = parse_conn_arg(argstr, ',', conarg_host_traddr);
|
||||
cargs->host_iface = parse_conn_arg(argstr, ',', conarg_host_iface);
|
||||
return cargs;
|
||||
}
|
||||
|
||||
|
@ -404,6 +412,7 @@ static void destruct_connect_args(struct connect_args *cargs)
|
|||
free(cargs->traddr);
|
||||
free(cargs->trsvcid);
|
||||
free(cargs->host_traddr);
|
||||
free(cargs->host_iface);
|
||||
}
|
||||
|
||||
static void free_connect_args(struct connect_args *cargs)
|
||||
|
@ -670,11 +679,17 @@ static int space_strip_len(int max, const char *str)
|
|||
return i + 1;
|
||||
}
|
||||
|
||||
static void print_discovery_log(struct nvmf_disc_rsp_page_hdr *log, int numrec)
|
||||
static void print_discovery_log(struct nvmf_disc_rsp_page_hdr *log, int numrec,
|
||||
int instance)
|
||||
{
|
||||
int i;
|
||||
|
||||
printf("\nDiscovery Log Number of Records %d, "
|
||||
printf("\n");
|
||||
|
||||
if (fabrics_cfg.persistent)
|
||||
printf("Persistent device: nvme%d\n", instance);
|
||||
|
||||
printf("Discovery Log Number of Records %d, "
|
||||
"Generation counter %"PRIu64"\n",
|
||||
numrec, le64_to_cpu(log->genctr));
|
||||
|
||||
|
@ -704,7 +719,7 @@ static void print_discovery_log(struct nvmf_disc_rsp_page_hdr *log, int numrec)
|
|||
printf("rdma_cms: %s\n",
|
||||
cms_str(e->tsas.rdma.cms));
|
||||
printf("rdma_pkey: 0x%04x\n",
|
||||
e->tsas.rdma.pkey);
|
||||
le16_to_cpu(e->tsas.rdma.pkey));
|
||||
break;
|
||||
case NVMF_TRTYPE_TCP:
|
||||
printf("sectype: %s\n",
|
||||
|
@ -714,14 +729,20 @@ static void print_discovery_log(struct nvmf_disc_rsp_page_hdr *log, int numrec)
|
|||
}
|
||||
}
|
||||
|
||||
static void json_discovery_log(struct nvmf_disc_rsp_page_hdr *log, int numrec)
|
||||
static void json_discovery_log(struct nvmf_disc_rsp_page_hdr *log, int numrec,
|
||||
int instance)
|
||||
{
|
||||
struct json_object *root;
|
||||
struct json_object *entries;
|
||||
char *dev_name = NULL;
|
||||
int i;
|
||||
|
||||
if (asprintf(&dev_name, "nvme%d", instance) < 0)
|
||||
return;
|
||||
|
||||
root = json_create_object();
|
||||
entries = json_create_array();
|
||||
json_object_add_value_string(root, "device", dev_name);
|
||||
json_object_add_value_uint(root, "genctr", le64_to_cpu(log->genctr));
|
||||
json_object_add_value_array(root, "records", entries);
|
||||
|
||||
|
@ -729,6 +750,10 @@ static void json_discovery_log(struct nvmf_disc_rsp_page_hdr *log, int numrec)
|
|||
struct nvmf_disc_rsp_page_entry *e = &log->entries[i];
|
||||
struct json_object *entry = json_create_object();
|
||||
|
||||
nvme_strip_spaces(e->trsvcid, NVMF_TRSVCID_SIZE);
|
||||
nvme_strip_spaces(e->subnqn, NVMF_NQN_SIZE);
|
||||
nvme_strip_spaces(e->traddr, NVMF_TRADDR_SIZE);
|
||||
|
||||
json_object_add_value_string(entry, "trtype",
|
||||
trtype_str(e->trtype));
|
||||
json_object_add_value_string(entry, "adrfam",
|
||||
|
@ -738,8 +763,7 @@ static void json_discovery_log(struct nvmf_disc_rsp_page_hdr *log, int numrec)
|
|||
json_object_add_value_string(entry,"treq",
|
||||
treq_str(e->treq));
|
||||
json_object_add_value_uint(entry, "portid", e->portid);
|
||||
json_object_add_value_string(entry, "trsvcid",
|
||||
e->trsvcid);
|
||||
json_object_add_value_string(entry, "trsvcid", e->trsvcid);
|
||||
json_object_add_value_string(entry, "subnqn", e->subnqn);
|
||||
json_object_add_value_string(entry, "traddr", e->traddr);
|
||||
|
||||
|
@ -752,7 +776,7 @@ static void json_discovery_log(struct nvmf_disc_rsp_page_hdr *log, int numrec)
|
|||
json_object_add_value_string(entry, "rdma_cms",
|
||||
cms_str(e->tsas.rdma.cms));
|
||||
json_object_add_value_uint(entry, "rdma_pkey",
|
||||
e->tsas.rdma.pkey);
|
||||
le16_to_cpu(e->tsas.rdma.pkey));
|
||||
break;
|
||||
case NVMF_TRTYPE_TCP:
|
||||
json_object_add_value_string(entry, "sectype",
|
||||
|
@ -764,6 +788,7 @@ static void json_discovery_log(struct nvmf_disc_rsp_page_hdr *log, int numrec)
|
|||
json_print_object(root, NULL);
|
||||
printf("\n");
|
||||
json_free_object(root);
|
||||
free(dev_name);
|
||||
}
|
||||
|
||||
static void save_discovery_log(struct nvmf_disc_rsp_page_hdr *log, int numrec)
|
||||
|
@ -790,6 +815,28 @@ static void save_discovery_log(struct nvmf_disc_rsp_page_hdr *log, int numrec)
|
|||
close(fd);
|
||||
}
|
||||
|
||||
static void print_connect_msg(int instance)
|
||||
{
|
||||
printf("device: nvme%d\n", instance);
|
||||
}
|
||||
|
||||
static void json_connect_msg(int instance)
|
||||
{
|
||||
struct json_object *root;
|
||||
char *dev_name = NULL;
|
||||
|
||||
if (asprintf(&dev_name, "nvme%d", instance) < 0)
|
||||
return;
|
||||
|
||||
root = json_create_object();
|
||||
json_object_add_value_string(root, "device", dev_name);
|
||||
|
||||
json_print_object(root, NULL);
|
||||
printf("\n");
|
||||
json_free_object(root);
|
||||
free(dev_name);
|
||||
}
|
||||
|
||||
static char *hostnqn_read_file(void)
|
||||
{
|
||||
FILE *f;
|
||||
|
@ -969,6 +1016,7 @@ int build_options(char *argstr, int max_len, bool discover)
|
|||
if (add_argument(&argstr, &max_len, "transport", fabrics_cfg.transport) ||
|
||||
add_argument(&argstr, &max_len, "traddr", fabrics_cfg.traddr) ||
|
||||
add_argument(&argstr, &max_len, "host_traddr", fabrics_cfg.host_traddr) ||
|
||||
add_argument(&argstr, &max_len, "host_iface", fabrics_cfg.host_iface) ||
|
||||
add_argument(&argstr, &max_len, "trsvcid", fabrics_cfg.trsvcid) ||
|
||||
((fabrics_cfg.hostnqn || nvmf_hostnqn_file()) &&
|
||||
add_argument(&argstr, &max_len, "hostnqn", fabrics_cfg.hostnqn)) ||
|
||||
|
@ -991,6 +1039,8 @@ int build_options(char *argstr, int max_len, bool discover)
|
|||
(strncmp(fabrics_cfg.transport, "loop", 4) &&
|
||||
add_int_argument(&argstr, &max_len, "ctrl_loss_tmo",
|
||||
fabrics_cfg.ctrl_loss_tmo, true)) ||
|
||||
add_int_argument(&argstr, &max_len, "fast_io_fail_tmo",
|
||||
fabrics_cfg.fast_io_fail_tmo, true) ||
|
||||
add_int_argument(&argstr, &max_len, "tos",
|
||||
fabrics_cfg.tos, true) ||
|
||||
add_bool_argument(&argstr, &max_len, "duplicate_connect",
|
||||
|
@ -1014,11 +1064,16 @@ static void set_discovery_kato(struct fabrics_config *cfg)
|
|||
cfg->keep_alive_tmo = 0;
|
||||
}
|
||||
|
||||
static void discovery_trsvcid(struct fabrics_config *fabrics_cfg)
|
||||
static void discovery_trsvcid(struct fabrics_config *fabrics_cfg, bool discover)
|
||||
{
|
||||
if (!strcmp(fabrics_cfg->transport, "tcp")) {
|
||||
/* Default port for NVMe/TCP discovery controllers */
|
||||
fabrics_cfg->trsvcid = __stringify(NVME_DISC_IP_PORT);
|
||||
if (discover) {
|
||||
/* Default port for NVMe/TCP discovery controllers */
|
||||
fabrics_cfg->trsvcid = __stringify(NVME_DISC_IP_PORT);
|
||||
} else {
|
||||
/* Default port for NVMe/TCP io controllers */
|
||||
fabrics_cfg->trsvcid = __stringify(NVME_RDMA_IP_PORT);
|
||||
}
|
||||
} else if (!strcmp(fabrics_cfg->transport, "rdma")) {
|
||||
/* Default port for NVMe/RDMA controllers */
|
||||
fabrics_cfg->trsvcid = __stringify(NVME_RDMA_IP_PORT);
|
||||
|
@ -1158,6 +1213,13 @@ retry:
|
|||
p+= len;
|
||||
}
|
||||
|
||||
if (fabrics_cfg.host_iface && strcmp(fabrics_cfg.host_iface, "none")) {
|
||||
len = sprintf(p, ",host_iface=%s", fabrics_cfg.host_iface);
|
||||
if (len < 0)
|
||||
return -EINVAL;
|
||||
p+= len;
|
||||
}
|
||||
|
||||
if (fabrics_cfg.reconnect_delay) {
|
||||
len = sprintf(p, ",reconnect_delay=%d", fabrics_cfg.reconnect_delay);
|
||||
if (len < 0)
|
||||
|
@ -1172,6 +1234,13 @@ retry:
|
|||
p += len;
|
||||
}
|
||||
|
||||
if (fabrics_cfg.fast_io_fail_tmo) {
|
||||
len = sprintf(p, ",fast_io_fail_tmo=%d", fabrics_cfg.fast_io_fail_tmo);
|
||||
if (len < 0)
|
||||
return -EINVAL;
|
||||
p += len;
|
||||
}
|
||||
|
||||
if (fabrics_cfg.tos != -1) {
|
||||
len = sprintf(p, ",tos=%d", fabrics_cfg.tos);
|
||||
if (len < 0)
|
||||
|
@ -1290,6 +1359,7 @@ static bool cargs_match_found(struct nvmf_disc_rsp_page_entry *entry)
|
|||
cargs.subsysnqn = strdup(entry->subnqn);
|
||||
cargs.trsvcid = strdup(entry->trsvcid);
|
||||
cargs.host_traddr = strdup(fabrics_cfg.host_traddr ?: "\0");
|
||||
cargs.host_iface = strdup(fabrics_cfg.host_iface ?: "\0");
|
||||
|
||||
/* check if we have a match in the discovery recursion */
|
||||
while (c) {
|
||||
|
@ -1297,7 +1367,8 @@ static bool cargs_match_found(struct nvmf_disc_rsp_page_entry *entry)
|
|||
!strcmp(cargs.transport, c->transport) &&
|
||||
!strcmp(cargs.traddr, c->traddr) &&
|
||||
!strcmp(cargs.trsvcid, c->trsvcid) &&
|
||||
!strcmp(cargs.host_traddr, c->host_traddr))
|
||||
!strcmp(cargs.host_traddr, c->host_traddr) &&
|
||||
!strcmp(cargs.host_iface, c->host_iface))
|
||||
return true;
|
||||
c = c->next;
|
||||
}
|
||||
|
@ -1313,6 +1384,10 @@ static bool should_connect(struct nvmf_disc_rsp_page_entry *entry)
|
|||
if (cargs_match_found(entry))
|
||||
return false;
|
||||
|
||||
/* skip connect if the transport type doesn't match */
|
||||
if (strcmp(fabrics_cfg.transport, trtype_str(entry->trtype)))
|
||||
return false;
|
||||
|
||||
if (!fabrics_cfg.matching_only || !fabrics_cfg.traddr)
|
||||
return true;
|
||||
|
||||
|
@ -1404,8 +1479,6 @@ int do_discover(char *argstr, bool connect, enum nvme_print_flags flags)
|
|||
return -errno;
|
||||
ret = nvmf_get_log_page_discovery(dev_name, &log, &numrec, &status);
|
||||
free(dev_name);
|
||||
if (fabrics_cfg.persistent)
|
||||
msg(LOG_NOTICE, "Persistent device: nvme%d\n", instance);
|
||||
if (!fabrics_cfg.device && !fabrics_cfg.persistent) {
|
||||
err = remove_ctrl(instance);
|
||||
if (err)
|
||||
|
@ -1419,9 +1492,9 @@ int do_discover(char *argstr, bool connect, enum nvme_print_flags flags)
|
|||
else if (fabrics_cfg.raw || flags == BINARY)
|
||||
save_discovery_log(log, numrec);
|
||||
else if (flags == JSON)
|
||||
json_discovery_log(log, numrec);
|
||||
json_discovery_log(log, numrec, instance);
|
||||
else
|
||||
print_discovery_log(log, numrec);
|
||||
print_discovery_log(log, numrec, instance);
|
||||
break;
|
||||
case DISC_GET_NUMRECS:
|
||||
msg(LOG_ERR,
|
||||
|
@ -1513,7 +1586,7 @@ static int discover_from_conf_file(const char *desc, char *argstr,
|
|||
}
|
||||
|
||||
if (!fabrics_cfg.trsvcid)
|
||||
discovery_trsvcid(&fabrics_cfg);
|
||||
discovery_trsvcid(&fabrics_cfg, true);
|
||||
|
||||
err = build_options(argstr, BUF_SIZE, true);
|
||||
if (err) {
|
||||
|
@ -1529,7 +1602,8 @@ free_and_continue:
|
|||
free(all_args);
|
||||
free(argv);
|
||||
fabrics_cfg.transport = fabrics_cfg.traddr =
|
||||
fabrics_cfg.trsvcid = fabrics_cfg.host_traddr = NULL;
|
||||
fabrics_cfg.trsvcid = fabrics_cfg.host_traddr =
|
||||
fabrics_cfg.host_iface = NULL;
|
||||
}
|
||||
|
||||
out:
|
||||
|
@ -1548,7 +1622,8 @@ int fabrics_discover(const char *desc, int argc, char **argv, bool connect)
|
|||
OPT_LIST("transport", 't', &fabrics_cfg.transport, "transport type"),
|
||||
OPT_LIST("traddr", 'a', &fabrics_cfg.traddr, "transport address"),
|
||||
OPT_LIST("trsvcid", 's', &fabrics_cfg.trsvcid, "transport service id (e.g. IP port)"),
|
||||
OPT_LIST("host-traddr", 'w', &fabrics_cfg.host_traddr, "host traddr (e.g. FC WWN's)"),
|
||||
OPT_LIST("host-traddr", 'w', &fabrics_cfg.host_traddr, "host traddr (e.g. FC WWN's or IP source address)"),
|
||||
OPT_LIST("host-iface", 'f', &fabrics_cfg.host_iface, "host transport interface (e.g. IP eth1, enp2s0)"),
|
||||
OPT_LIST("hostnqn", 'q', &fabrics_cfg.hostnqn, "user-defined hostnqn (if default not used)"),
|
||||
OPT_LIST("hostid", 'I', &fabrics_cfg.hostid, "user-defined hostid (if default not used)"),
|
||||
OPT_LIST("raw", 'r', &fabrics_cfg.raw, "raw output file"),
|
||||
|
@ -1556,6 +1631,7 @@ int fabrics_discover(const char *desc, int argc, char **argv, bool connect)
|
|||
OPT_INT("keep-alive-tmo", 'k', &fabrics_cfg.keep_alive_tmo, "keep alive timeout period in seconds"),
|
||||
OPT_INT("reconnect-delay", 'c', &fabrics_cfg.reconnect_delay, "reconnect timeout period in seconds"),
|
||||
OPT_INT("ctrl-loss-tmo", 'l', &fabrics_cfg.ctrl_loss_tmo, "controller loss timeout period in seconds"),
|
||||
OPT_INT("fast_io_fail_tmo",'f',&fabrics_cfg.fast_io_fail_tmo, "fast I/O fail timeout (default off)"),
|
||||
OPT_INT("tos", 'T', &fabrics_cfg.tos, "type of service"),
|
||||
OPT_FLAG("hdr_digest", 'g', &fabrics_cfg.hdr_digest, "enable transport protocol header digest (TCP transport)"),
|
||||
OPT_FLAG("data_digest", 'G', &fabrics_cfg.data_digest, "enable transport protocol data digest (TCP transport)"),
|
||||
|
@ -1564,7 +1640,7 @@ int fabrics_discover(const char *desc, int argc, char **argv, bool connect)
|
|||
OPT_INT("nr-poll-queues", 'P', &fabrics_cfg.nr_poll_queues, "number of poll queues to use (default 0)"),
|
||||
OPT_INT("queue-size", 'Q', &fabrics_cfg.queue_size, "number of io queue elements to use (default 128)"),
|
||||
OPT_FLAG("persistent", 'p', &fabrics_cfg.persistent, "persistent discovery connection"),
|
||||
OPT_FLAG("quiet", 'S', &quiet, "suppress already connected errors"),
|
||||
OPT_FLAG("quiet", 'S', &quiet, "suppress already connected errors"),
|
||||
OPT_FLAG("matching", 'm', &fabrics_cfg.matching_only, "connect only records matching the traddr"),
|
||||
OPT_FMT("output-format", 'o', &fabrics_cfg.output_format, output_format),
|
||||
OPT_END()
|
||||
|
@ -1606,7 +1682,7 @@ int fabrics_discover(const char *desc, int argc, char **argv, bool connect)
|
|||
}
|
||||
|
||||
if (!fabrics_cfg.trsvcid)
|
||||
discovery_trsvcid(&fabrics_cfg);
|
||||
discovery_trsvcid(&fabrics_cfg, true);
|
||||
|
||||
ret = build_options(argstr, BUF_SIZE, true);
|
||||
if (ret)
|
||||
|
@ -1623,13 +1699,15 @@ int fabrics_connect(const char *desc, int argc, char **argv)
|
|||
{
|
||||
char argstr[BUF_SIZE];
|
||||
int instance, ret;
|
||||
enum nvme_print_flags flags = -1;
|
||||
|
||||
OPT_ARGS(opts) = {
|
||||
OPT_LIST("transport", 't', &fabrics_cfg.transport, "transport type"),
|
||||
OPT_LIST("nqn", 'n', &fabrics_cfg.nqn, "nqn name"),
|
||||
OPT_LIST("traddr", 'a', &fabrics_cfg.traddr, "transport address"),
|
||||
OPT_LIST("trsvcid", 's', &fabrics_cfg.trsvcid, "transport service id (e.g. IP port)"),
|
||||
OPT_LIST("host-traddr", 'w', &fabrics_cfg.host_traddr, "host traddr (e.g. FC WWN's)"),
|
||||
OPT_LIST("host-traddr", 'w', &fabrics_cfg.host_traddr, "host traddr (e.g. FC WWN's or IP source address)"),
|
||||
OPT_LIST("host-iface", 'f', &fabrics_cfg.host_iface, "host transport interface (e.g. IP eth1, enp2s0)"),
|
||||
OPT_LIST("hostnqn", 'q', &fabrics_cfg.hostnqn, "user-defined hostnqn"),
|
||||
OPT_LIST("hostid", 'I', &fabrics_cfg.hostid, "user-defined hostid (if default not used)"),
|
||||
OPT_INT("nr-io-queues", 'i', &fabrics_cfg.nr_io_queues, "number of io queues to use (default is core count)"),
|
||||
|
@ -1639,25 +1717,42 @@ int fabrics_connect(const char *desc, int argc, char **argv)
|
|||
OPT_INT("keep-alive-tmo", 'k', &fabrics_cfg.keep_alive_tmo, "keep alive timeout period in seconds"),
|
||||
OPT_INT("reconnect-delay", 'c', &fabrics_cfg.reconnect_delay, "reconnect timeout period in seconds"),
|
||||
OPT_INT("ctrl-loss-tmo", 'l', &fabrics_cfg.ctrl_loss_tmo, "controller loss timeout period in seconds"),
|
||||
OPT_INT("fast_io_fail_tmo", 'f', &fabrics_cfg.fast_io_fail_tmo, "fast I/O fail timeout (default off)"),
|
||||
OPT_INT("tos", 'T', &fabrics_cfg.tos, "type of service"),
|
||||
OPT_FLAG("duplicate-connect", 'D', &fabrics_cfg.duplicate_connect, "allow duplicate connections between same transport host and subsystem port"),
|
||||
OPT_FLAG("disable-sqflow", 'd', &fabrics_cfg.disable_sqflow, "disable controller sq flow control (default false)"),
|
||||
OPT_FLAG("hdr-digest", 'g', &fabrics_cfg.hdr_digest, "enable transport protocol header digest (TCP transport)"),
|
||||
OPT_FLAG("data-digest", 'G', &fabrics_cfg.data_digest, "enable transport protocol data digest (TCP transport)"),
|
||||
OPT_FMT("output-format", 'o', &fabrics_cfg.output_format, "Output format: normal|json"),
|
||||
OPT_END()
|
||||
};
|
||||
|
||||
fabrics_cfg.output_format = "";
|
||||
fabrics_cfg.tos = -1;
|
||||
ret = argconfig_parse(argc, argv, desc, opts);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (!strcmp(fabrics_cfg.output_format, ""))
|
||||
flags = -1;
|
||||
else if (!strcmp(fabrics_cfg.output_format, "normal"))
|
||||
flags = NORMAL;
|
||||
else if (!strcmp(fabrics_cfg.output_format, "json"))
|
||||
flags = JSON;
|
||||
else {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (traddr_is_hostname(&fabrics_cfg)) {
|
||||
ret = hostname2traddr(&fabrics_cfg);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!fabrics_cfg.trsvcid)
|
||||
discovery_trsvcid(&fabrics_cfg, false);
|
||||
|
||||
ret = build_options(argstr, BUF_SIZE, false);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
@ -1671,6 +1766,12 @@ int fabrics_connect(const char *desc, int argc, char **argv)
|
|||
instance = add_ctrl(argstr);
|
||||
if (instance < 0)
|
||||
ret = instance;
|
||||
else {
|
||||
if (flags == NORMAL)
|
||||
print_connect_msg(instance);
|
||||
else if (flags == JSON)
|
||||
json_connect_msg(instance);
|
||||
}
|
||||
|
||||
out:
|
||||
return nvme_status_to_errno(ret, true);
|
||||
|
|
|
@ -20,6 +20,7 @@ struct fabrics_config {
|
|||
const char *traddr;
|
||||
const char *trsvcid;
|
||||
const char *host_traddr;
|
||||
const char *host_iface;
|
||||
const char *hostnqn;
|
||||
const char *hostid;
|
||||
int nr_io_queues;
|
||||
|
@ -29,6 +30,7 @@ struct fabrics_config {
|
|||
int keep_alive_tmo;
|
||||
int reconnect_delay;
|
||||
int ctrl_loss_tmo;
|
||||
int fast_io_fail_tmo;
|
||||
int tos;
|
||||
const char *raw;
|
||||
char *device;
|
||||
|
|
133
linux/nvme.h
133
linux/nvme.h
|
@ -147,6 +147,8 @@ enum {
|
|||
NVME_IOCS_ZONED = 0x02,
|
||||
};
|
||||
|
||||
#define NVME_NUM_IOCS_COMBINATIONS 512
|
||||
|
||||
#define NVME_AQ_DEPTH 32
|
||||
#define NVME_NR_AEN_COMMANDS 1
|
||||
#define NVME_AQ_BLK_MQ_DEPTH (NVME_AQ_DEPTH - NVME_NR_AEN_COMMANDS)
|
||||
|
@ -288,7 +290,10 @@ struct nvme_id_ctrl {
|
|||
__le16 crdt1;
|
||||
__le16 crdt2;
|
||||
__le16 crdt3;
|
||||
__u8 rsvd134[122];
|
||||
__u8 rsvd134[119];
|
||||
__u8 nvmsr;
|
||||
__u8 vwci;
|
||||
__u8 mec;
|
||||
__le16 oacs;
|
||||
__u8 acl;
|
||||
__u8 aerl;
|
||||
|
@ -323,7 +328,10 @@ struct nvme_id_ctrl {
|
|||
__le32 anagrpmax;
|
||||
__le32 nanagrpid;
|
||||
__le32 pels;
|
||||
__u8 rsvd356[156];
|
||||
__le16 domainid;
|
||||
__u8 rsvd358[10];
|
||||
__u8 megcap[16];
|
||||
__u8 rsvd384[128];
|
||||
__u8 sqes;
|
||||
__u8 cqes;
|
||||
__le16 maxcmd;
|
||||
|
@ -337,10 +345,12 @@ struct nvme_id_ctrl {
|
|||
__u8 icsvscc;
|
||||
__u8 nwpc;
|
||||
__le16 acwu;
|
||||
__u8 rsvd534[2];
|
||||
__le16 ocfs;
|
||||
__le32 sgls;
|
||||
__le32 mnan;
|
||||
__u8 rsvd544[224];
|
||||
__u8 maxdna[16];
|
||||
__le32 maxcna;
|
||||
__u8 rsvd564[204];
|
||||
char subnqn[256];
|
||||
__u8 rsvd1024[768];
|
||||
__le32 ioccsz;
|
||||
|
@ -425,7 +435,7 @@ struct nvme_id_ns {
|
|||
};
|
||||
|
||||
struct nvme_id_iocs {
|
||||
__le64 iocs[512];
|
||||
__le64 iocs[NVME_NUM_IOCS_COMBINATIONS];
|
||||
};
|
||||
|
||||
enum {
|
||||
|
@ -445,6 +455,7 @@ enum {
|
|||
NVME_ID_CNS_SCNDRY_CTRL_LIST = 0x15,
|
||||
NVME_ID_CNS_NS_GRANULARITY = 0x16,
|
||||
NVME_ID_CNS_UUID_LIST = 0x17,
|
||||
NVME_ID_CNS_DOMAIN_LIST = 0x18,
|
||||
NVME_ID_CNS_CSI_NS_PRESENT_LIST = 0x1a,
|
||||
NVME_ID_CNS_CSI_NS_PRESENT = 0x1b,
|
||||
NVME_ID_CNS_CSI = 0x1c,
|
||||
|
@ -672,17 +683,17 @@ struct nvme_fw_slot_info_log {
|
|||
};
|
||||
|
||||
struct nvme_lba_status_desc {
|
||||
__u64 dslba;
|
||||
__u32 nlb;
|
||||
__u8 rsvd_12;
|
||||
__u8 status;
|
||||
__u8 rsvd_15_14[2];
|
||||
__le64 dslba;
|
||||
__le32 nlb;
|
||||
__u8 rsvd_12;
|
||||
__u8 status;
|
||||
__u8 rsvd_15_14[2];
|
||||
};
|
||||
|
||||
struct nvme_lba_status {
|
||||
__u32 nlsd;
|
||||
__u8 cmpc;
|
||||
__u8 rsvd_7_5[3];
|
||||
__le32 nlsd;
|
||||
__u8 cmpc;
|
||||
__u8 rsvd_7_5[3];
|
||||
struct nvme_lba_status_desc descs[0];
|
||||
};
|
||||
|
||||
|
@ -964,8 +975,8 @@ struct nvme_lba_range_type {
|
|||
__u8 type;
|
||||
__u8 attributes;
|
||||
__u8 rsvd2[14];
|
||||
__u64 slba;
|
||||
__u64 nlb;
|
||||
__le64 slba;
|
||||
__le64 nlb;
|
||||
__u8 guid[16];
|
||||
__u8 rsvd48[16];
|
||||
};
|
||||
|
@ -1160,6 +1171,7 @@ enum {
|
|||
NVME_RW_PRINFO_PRCHK_GUARD = 1 << 12,
|
||||
NVME_RW_PRINFO_PRACT = 1 << 13,
|
||||
NVME_RW_DTYPE_STREAMS = 1 << 4,
|
||||
NVME_RW_STORAGE_TAG_CHECK = 1 << 8,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
@ -1191,6 +1203,31 @@ struct nvme_feat_auto_pst {
|
|||
__le64 entries[32];
|
||||
};
|
||||
|
||||
struct nvme_mi_host_metadata_element_desc {
|
||||
__u8 type; /* Element Type */
|
||||
__u8 rev; /* Element Revision */
|
||||
__u16 len; /* Element Length */
|
||||
__u8 val[0]; /* Element Value (UTF-8) */
|
||||
};
|
||||
|
||||
struct nvme_mi_host_metadata {
|
||||
__u8 ndesc;
|
||||
__u8 rsvd1;
|
||||
struct nvme_mi_host_metadata_element_desc descs[0];
|
||||
};
|
||||
|
||||
enum {
|
||||
NVME_MI_CTRL_METADATA_OS_CTRL_NAME = 0x01,
|
||||
NVME_MI_CTRL_METADATA_OS_DRIVER_NAME = 0x02,
|
||||
NVME_MI_CTRL_METADATA_OS_DRIVER_VER = 0x03,
|
||||
NVME_MI_CTRL_METADATA_PRE_BOOT_CTRL_NAME = 0x04,
|
||||
NVME_MI_CTRL_METADATA_PRE_BOOT_DRIVER_NAME = 0x05,
|
||||
NVME_MI_CTRL_METADATA_PRE_BOOT_DRIVER_VER = 0x06,
|
||||
|
||||
NVME_MI_NS_METADATA_OS_NS_NAME = 0x01,
|
||||
NVME_MI_NS_METADATA_PRE_BOOT_NS_NAME = 0x02,
|
||||
};
|
||||
|
||||
enum {
|
||||
NVME_HOST_MEM_ENABLE = (1 << 0),
|
||||
NVME_HOST_MEM_RETURN = (1 << 1),
|
||||
|
@ -1220,6 +1257,7 @@ enum nvme_admin_opcode {
|
|||
nvme_admin_virtual_mgmt = 0x1c,
|
||||
nvme_admin_nvme_mi_send = 0x1d,
|
||||
nvme_admin_nvme_mi_recv = 0x1e,
|
||||
nvme_admin_capacity_mgmt = 0x20,
|
||||
nvme_admin_dbbuf = 0x7C,
|
||||
nvme_admin_format_nvm = 0x80,
|
||||
nvme_admin_security_send = 0x81,
|
||||
|
@ -1284,13 +1322,17 @@ enum nvme_feat {
|
|||
NVME_LBA_STATUS_INFO = 0x15,
|
||||
NVME_FEAT_HOST_BEHAVIOR = 0x16,
|
||||
NVME_FEAT_SANITIZE = 0x17,
|
||||
NVME_FEAT_ENDURANCE = 0x18,
|
||||
NVME_FEAT_ENDURANCE = 0x18,
|
||||
NVME_FEAT_IOCS_PROFILE = 0x19,
|
||||
NVME_FEAT_SW_PROGRESS = 0x80,
|
||||
NVME_FEAT_HOST_ID = 0x81,
|
||||
NVME_FEAT_RESV_MASK = 0x82,
|
||||
NVME_FEAT_RESV_PERSIST = 0x83,
|
||||
NVME_FEAT_WRITE_PROTECT = 0x84,
|
||||
|
||||
NVME_MI_FEAT_CTRL_METADATA = 0x7E,
|
||||
NVME_MI_FEAT_NS_METADATA = 0x7F,
|
||||
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
enum {
|
||||
|
@ -1329,7 +1371,7 @@ enum {
|
|||
struct nvme_host_mem_buf_desc {
|
||||
__le64 addr;
|
||||
__le32 size;
|
||||
__u32 rsvd;
|
||||
__u8 rsvd[4];
|
||||
};
|
||||
|
||||
/* Sanitize Log Page */
|
||||
|
@ -1392,7 +1434,7 @@ struct nvmf_disc_rsp_page_entry {
|
|||
__u8 prtype;
|
||||
__u8 cms;
|
||||
__u8 resv3[5];
|
||||
__u16 pkey;
|
||||
__le16 pkey;
|
||||
__u8 resv10[246];
|
||||
} rdma;
|
||||
struct tcp {
|
||||
|
@ -1456,21 +1498,21 @@ struct nvme_error_log_page {
|
|||
struct nvme_firmware_log_page {
|
||||
__u8 afi;
|
||||
__u8 resv[7];
|
||||
__u64 frs[7];
|
||||
__u8 frs[7][8];
|
||||
__u8 resv2[448];
|
||||
};
|
||||
|
||||
struct nvme_host_mem_buffer {
|
||||
__u32 hsize;
|
||||
__u32 hmdlal;
|
||||
__u32 hmdlau;
|
||||
__u32 hmdlec;
|
||||
__le32 hsize;
|
||||
__le32 hmdlal;
|
||||
__le32 hmdlau;
|
||||
__le32 hmdlec;
|
||||
__u8 rsvd16[4080];
|
||||
};
|
||||
|
||||
struct nvme_auto_pst {
|
||||
__u32 data;
|
||||
__u32 rsvd32;
|
||||
__le32 data;
|
||||
__u8 rsvd[4];
|
||||
};
|
||||
|
||||
struct nvme_timestamp {
|
||||
|
@ -1498,10 +1540,10 @@ struct nvme_primary_ctrl_caps {
|
|||
__u8 rsvd48[16];
|
||||
__le32 vifrt; /* VI Resources Flexible Total */
|
||||
__le32 virfa; /* VI Resources Flexible Assigned */
|
||||
__u16 virfap; /* VI Resources Flexible Allocated to Primary */
|
||||
__u16 viprt; /* VI Resources Private Total */
|
||||
__u16 vifrsm; /* VI Resources Flexible Secondary Maximum */
|
||||
__u16 vigran; /* VI Flexible Resource Preferred Granularity */
|
||||
__le16 virfap; /* VI Resources Flexible Allocated to Primary */
|
||||
__le16 viprt; /* VI Resources Private Total */
|
||||
__le16 vifrsm; /* VI Resources Flexible Secondary Maximum */
|
||||
__le16 vigran; /* VI Flexible Resource Preferred Granularity */
|
||||
__u8 rsvd80[4016];
|
||||
};
|
||||
|
||||
|
@ -1523,10 +1565,10 @@ struct nvme_secondary_controllers_list {
|
|||
};
|
||||
|
||||
struct nvme_bar_cap {
|
||||
__u16 mqes;
|
||||
__le16 mqes;
|
||||
__u8 ams_cqr;
|
||||
__u8 to;
|
||||
__u16 bps_css_nssrs_dstrd;
|
||||
__le16 bps_css_nssrs_dstrd;
|
||||
__u8 mpsmax_mpsmin;
|
||||
__u8 rsvd_cmbs_pmrs;
|
||||
};
|
||||
|
@ -1595,10 +1637,14 @@ enum {
|
|||
NVME_SC_PREEMPT_ABORT = 0x1B,
|
||||
NVME_SC_SANITIZE_FAILED = 0x1C,
|
||||
NVME_SC_SANITIZE_IN_PROGRESS = 0x1D,
|
||||
NVME_SC_SGL_DATA_BLK_GRAN_INVALID= 0x1e,
|
||||
NVME_SC_CMD_NOT_SUP_QUEUE_IN_CMB = 0x1f,
|
||||
|
||||
NVME_SC_NS_WRITE_PROTECTED = 0x20,
|
||||
NVME_SC_CMD_INTERRUPTED = 0x21,
|
||||
NVME_SC_TRANSIENT_TRANSPORT = 0x22,
|
||||
NVME_SC_PROHIBITED_BY_CMD_AND_FEAT = 0x23,
|
||||
NVME_SC_ADMIN_CMD_MEDIA_NOT_READY = 0x24,
|
||||
|
||||
NVME_SC_LBA_RANGE = 0x80,
|
||||
NVME_SC_CAP_EXCEEDED = 0x81,
|
||||
|
@ -1646,6 +1692,9 @@ enum {
|
|||
NVME_SC_PMR_SAN_PROHIBITED = 0x123,
|
||||
NVME_SC_ANA_INVALID_GROUP_ID= 0x124,
|
||||
NVME_SC_ANA_ATTACH_FAIL = 0x125,
|
||||
NVME_SC_INSUFFICIENT_CAP = 0x126,
|
||||
NVME_SC_NS_ATTACHMENT_LIMIT_EXCEEDED = 0x127,
|
||||
NVME_SC_PROHIBIT_CMD_EXEC_NOT_SUPPORTED = 0x128,
|
||||
|
||||
/*
|
||||
* Command Set Specific - Namespace Types commands:
|
||||
|
@ -1654,6 +1703,7 @@ enum {
|
|||
NVME_SC_IOCS_NOT_ENABLED = 0x12A,
|
||||
NVME_SC_IOCS_COMBINATION_REJECTED = 0x12B,
|
||||
NVME_SC_INVALID_IOCS = 0x12C,
|
||||
NVME_SC_ID_UNAVAILABLE = 0x12D,
|
||||
|
||||
/*
|
||||
* I/O Command Set Specific - NVM commands:
|
||||
|
@ -1698,6 +1748,7 @@ enum {
|
|||
NVME_SC_COMPARE_FAILED = 0x285,
|
||||
NVME_SC_ACCESS_DENIED = 0x286,
|
||||
NVME_SC_UNWRITTEN_BLOCK = 0x287,
|
||||
NVME_SC_STORAGE_TAG_CHECK = 0x288,
|
||||
|
||||
/*
|
||||
* Path-related Errors:
|
||||
|
@ -1770,8 +1821,8 @@ struct nvme_id_ctrl_nvm {
|
|||
__u8 wzsl;
|
||||
__u8 wusl;
|
||||
__u8 dmrl;
|
||||
__u32 dmrsl;
|
||||
__u64 dmsl;
|
||||
__le32 dmrsl;
|
||||
__le64 dmsl;
|
||||
__u8 rsvd16[4080];
|
||||
};
|
||||
|
||||
|
@ -1874,4 +1925,20 @@ enum nvme_zns_report_options {
|
|||
NVME_ZNS_ZRAS_REPORT_READ_ONLY = 0x6,
|
||||
NVME_ZNS_ZRAS_REPORT_OFFLINE = 0x7,
|
||||
};
|
||||
|
||||
struct nvme_id_domain_attr_entry {
|
||||
__le16 dom_id;
|
||||
__u8 rsvd2[14];
|
||||
__u8 dom_cap[16];
|
||||
__u8 unalloc_dom_cap[16];
|
||||
__u8 max_egrp_dom_cap[16];
|
||||
__u8 rsvd64[64];
|
||||
};
|
||||
|
||||
struct nvme_id_domain_list {
|
||||
__u8 num_entries;
|
||||
__u8 rsvd1[127];
|
||||
struct nvme_id_domain_attr_entry domain_attr[];
|
||||
};
|
||||
|
||||
#endif /* _LINUX_NVME_H */
|
||||
|
|
|
@ -18,21 +18,6 @@
|
|||
#include <linux/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
struct nvme_user_io {
|
||||
__u8 opcode;
|
||||
__u8 flags;
|
||||
__u16 control;
|
||||
__u16 nblocks;
|
||||
__u16 rsvd;
|
||||
__u64 metadata;
|
||||
__u64 addr;
|
||||
__u64 slba;
|
||||
__u32 dsmgmt;
|
||||
__u32 reftag;
|
||||
__u16 apptag;
|
||||
__u16 appmask;
|
||||
};
|
||||
|
||||
struct nvme_passthru_cmd {
|
||||
__u8 opcode;
|
||||
__u8 flags;
|
||||
|
@ -80,7 +65,6 @@ struct nvme_passthru_cmd64 {
|
|||
|
||||
#define NVME_IOCTL_ID _IO('N', 0x40)
|
||||
#define NVME_IOCTL_ADMIN_CMD _IOWR('N', 0x41, struct nvme_admin_cmd)
|
||||
#define NVME_IOCTL_SUBMIT_IO _IOW('N', 0x42, struct nvme_user_io)
|
||||
#define NVME_IOCTL_IO_CMD _IOWR('N', 0x43, struct nvme_passthru_cmd)
|
||||
#define NVME_IOCTL_RESET _IO('N', 0x44)
|
||||
#define NVME_IOCTL_SUBSYS_RESET _IO('N', 0x45)
|
||||
|
|
|
@ -21,6 +21,7 @@ COMMAND_LIST(
|
|||
ENTRY("id-nvmset", "Send NVMe Identify NVM Set List, display structure", id_nvmset)
|
||||
ENTRY("id-uuid", "Send NVMe Identify UUID List, display structure", id_uuid)
|
||||
ENTRY("id-iocs", "Send NVMe Identify I/O Command Set, display structure", id_iocs)
|
||||
ENTRY("id-domain", "Send NVMe Identify Domain List, display structure", id_domain)
|
||||
ENTRY("create-ns", "Creates a namespace with the provided parameters", create_ns)
|
||||
ENTRY("delete-ns", "Deletes a namespace from the controller", delete_ns)
|
||||
ENTRY("attach-ns", "Attaches a namespace to requested controller(s)", attach_ns)
|
||||
|
@ -55,6 +56,7 @@ COMMAND_LIST(
|
|||
ENTRY("security-send", "Submit a Security Send command, return results", sec_send)
|
||||
ENTRY("security-recv", "Submit a Security Receive command, return results", sec_recv)
|
||||
ENTRY("get-lba-status", "Submit a Get LBA Status command, return results", get_lba_status)
|
||||
ENTRY("capacity-mgmt", "Submit Capacity Management Command, return results", capacity_mgmt)
|
||||
ENTRY("resv-acquire", "Submit a Reservation Acquire, return results", resv_acquire)
|
||||
ENTRY("resv-register", "Submit a Reservation Register, return results", resv_register)
|
||||
ENTRY("resv-release", "Submit a Reservation Release, return results", resv_release)
|
||||
|
|
169
nvme-ioctl.c
169
nvme-ioctl.c
|
@ -68,7 +68,7 @@ int nvme_get_nsid(int fd)
|
|||
int err = fstat(fd, &nvme_stat);
|
||||
|
||||
if (err < 0)
|
||||
return -errno;
|
||||
return err;
|
||||
|
||||
return ioctl(fd, NVME_IOCTL_ID);
|
||||
}
|
||||
|
@ -124,33 +124,37 @@ int nvme_passthru(int fd, unsigned long ioctl_cmd, __u8 opcode,
|
|||
return err;
|
||||
}
|
||||
|
||||
int nvme_io(int fd, __u8 opcode, __u64 slba, __u16 nblocks, __u16 control,
|
||||
__u32 dsmgmt, __u32 reftag, __u16 apptag, __u16 appmask, void *data,
|
||||
void *metadata)
|
||||
int nvme_io(int fd, __u8 opcode, __u32 nsid, __u64 slba, __u16 nblocks,
|
||||
__u16 control, __u32 dsmgmt, __u32 reftag, __u16 apptag,
|
||||
__u16 appmask, __u64 storage_tag, void *data, void *metadata)
|
||||
{
|
||||
struct nvme_user_io io = {
|
||||
struct nvme_passthru_cmd cmd = {
|
||||
.opcode = opcode,
|
||||
.flags = 0,
|
||||
.control = control,
|
||||
.nblocks = nblocks,
|
||||
.rsvd = 0,
|
||||
.nsid = nsid,
|
||||
.metadata = (__u64)(uintptr_t) metadata,
|
||||
.addr = (__u64)(uintptr_t) data,
|
||||
.slba = slba,
|
||||
.dsmgmt = dsmgmt,
|
||||
.reftag = reftag,
|
||||
.appmask = appmask,
|
||||
.apptag = apptag,
|
||||
.cdw2 = storage_tag & 0xffffffff,
|
||||
.cdw3 = (storage_tag >> 32) & 0xffff,
|
||||
.cdw10 = slba & 0xffffffff,
|
||||
.cdw11 = slba >> 32,
|
||||
.cdw12 = nblocks | (control << 16),
|
||||
.cdw13 = dsmgmt,
|
||||
.cdw14 = reftag,
|
||||
.cdw15 = apptag | (appmask << 16),
|
||||
};
|
||||
return ioctl(fd, NVME_IOCTL_SUBMIT_IO, &io);
|
||||
|
||||
return nvme_submit_io_passthru(fd, &cmd);
|
||||
}
|
||||
|
||||
int nvme_verify(int fd, __u32 nsid, __u64 slba, __u16 nblocks,
|
||||
__u16 control, __u32 reftag, __u16 apptag, __u16 appmask)
|
||||
__u16 control, __u32 reftag, __u16 apptag, __u16 appmask,
|
||||
__u64 storage_tag)
|
||||
{
|
||||
struct nvme_passthru_cmd cmd = {
|
||||
.opcode = nvme_cmd_verify,
|
||||
.nsid = nsid,
|
||||
.cdw2 = storage_tag & 0xffffffff,
|
||||
.cdw3 = (storage_tag >> 32) & 0xffff,
|
||||
.cdw10 = slba & 0xffffffff,
|
||||
.cdw11 = slba >> 32,
|
||||
.cdw12 = nblocks | (control << 16),
|
||||
|
@ -174,11 +178,14 @@ int nvme_passthru_io(int fd, __u8 opcode, __u8 flags, __u16 rsvd,
|
|||
}
|
||||
|
||||
int nvme_write_zeros(int fd, __u32 nsid, __u64 slba, __u16 nlb,
|
||||
__u16 control, __u32 reftag, __u16 apptag, __u16 appmask)
|
||||
__u16 control, __u32 reftag, __u16 apptag, __u16 appmask,
|
||||
__u64 storage_tag)
|
||||
{
|
||||
struct nvme_passthru_cmd cmd = {
|
||||
.opcode = nvme_cmd_write_zeroes,
|
||||
.nsid = nsid,
|
||||
.cdw2 = storage_tag & 0xffffffff,
|
||||
.cdw3 = (storage_tag >> 32) & 0xffff,
|
||||
.cdw10 = slba & 0xffffffff,
|
||||
.cdw11 = slba >> 32,
|
||||
.cdw12 = nlb | (control << 16),
|
||||
|
@ -401,11 +408,6 @@ int nvme_identify_ns_list_csi(int fd, __u32 nsid, __u8 csi, bool all, void *data
|
|||
return nvme_identify13(fd, nsid, cns, csi << 24, data);
|
||||
}
|
||||
|
||||
int nvme_identify_ns_list(int fd, __u32 nsid, bool all, void *data)
|
||||
{
|
||||
return nvme_identify_ns_list_csi(fd, nsid, 0x0, all, data);
|
||||
}
|
||||
|
||||
int nvme_identify_ctrl_list(int fd, __u32 nsid, __u16 cntid, void *data)
|
||||
{
|
||||
int cns = nsid ? NVME_ID_CNS_CTRL_NS_LIST : NVME_ID_CNS_CTRL_LIST;
|
||||
|
@ -464,12 +466,19 @@ int nvme_identify_iocs(int fd, __u16 cntid, void *data)
|
|||
return nvme_identify(fd, 0, (cntid << 16) | NVME_ID_CNS_CSI, data);
|
||||
}
|
||||
|
||||
int nvme_identify_domain_list(int fd, __u16 dom_id, void *data)
|
||||
{
|
||||
return nvme_identify13(fd, 0, NVME_ID_CNS_DOMAIN_LIST, dom_id, data);
|
||||
}
|
||||
|
||||
int nvme_get_log14(int fd, __u32 nsid, __u8 log_id, __u8 lsp, __u64 lpo,
|
||||
__u16 lsi, bool rae, __u8 uuid_ix, __u32 data_len, void *data)
|
||||
__u16 lsi, bool rae, __u8 uuid_ix, __u8 csi, bool ot,
|
||||
__u32 data_len, void *data)
|
||||
{
|
||||
__u32 numd = (data_len >> 2) - 1;
|
||||
__u16 numdu = numd >> 16, numdl = numd & 0xffff;
|
||||
__u32 cdw10 = log_id | (numdl << 16) | (rae ? 1 << 15 : 0) | lsp << 8;
|
||||
__u32 cdw14 = uuid_ix | (ot ? 1 << 23 : 0) | csi << 24;
|
||||
|
||||
struct nvme_admin_cmd cmd = {
|
||||
.opcode = nvme_admin_get_log_page,
|
||||
|
@ -480,7 +489,7 @@ int nvme_get_log14(int fd, __u32 nsid, __u8 log_id, __u8 lsp, __u64 lpo,
|
|||
.cdw11 = numdu | (lsi << 16),
|
||||
.cdw12 = lpo & 0xffffffff,
|
||||
.cdw13 = lpo >> 32,
|
||||
.cdw14 = uuid_ix,
|
||||
.cdw14 = cdw14,
|
||||
};
|
||||
|
||||
return nvme_submit_admin_passthru(fd, &cmd);
|
||||
|
@ -491,7 +500,7 @@ int nvme_get_log13(int fd, __u32 nsid, __u8 log_id, __u8 lsp,
|
|||
void *data)
|
||||
{
|
||||
return nvme_get_log14(fd, nsid, log_id, lsp, lpo, lsi, rae, 0,
|
||||
data_len, data);
|
||||
0, false, data_len, data);
|
||||
}
|
||||
|
||||
int nvme_get_log(int fd, __u32 nsid, __u8 log_id, bool rae,
|
||||
|
@ -646,7 +655,7 @@ int nvme_resv_notif_log(int fd, struct nvme_resv_notif_log *resv)
|
|||
}
|
||||
|
||||
int nvme_feature(int fd, __u8 opcode, __u32 nsid, __u32 cdw10, __u32 cdw11,
|
||||
__u32 cdw12, __u32 data_len, void *data, __u32 *result)
|
||||
__u32 cdw12, __u32 cdw14, __u32 data_len, void *data, __u32 *result)
|
||||
{
|
||||
struct nvme_admin_cmd cmd = {
|
||||
.opcode = opcode,
|
||||
|
@ -654,6 +663,7 @@ int nvme_feature(int fd, __u8 opcode, __u32 nsid, __u32 cdw10, __u32 cdw11,
|
|||
.cdw10 = cdw10,
|
||||
.cdw11 = cdw11,
|
||||
.cdw12 = cdw12,
|
||||
.cdw14 = cdw14,
|
||||
.addr = (__u64)(uintptr_t) data,
|
||||
.data_len = data_len,
|
||||
};
|
||||
|
@ -666,12 +676,13 @@ int nvme_feature(int fd, __u8 opcode, __u32 nsid, __u32 cdw10, __u32 cdw11,
|
|||
}
|
||||
|
||||
int nvme_set_feature(int fd, __u32 nsid, __u8 fid, __u32 value, __u32 cdw12,
|
||||
bool save, __u32 data_len, void *data, __u32 *result)
|
||||
bool save, __u8 uuid_index, __u32 data_len, void *data, __u32 *result)
|
||||
{
|
||||
__u32 cdw10 = fid | (save ? 1 << 31 : 0);
|
||||
__u32 cdw14 = uuid_index;
|
||||
|
||||
return nvme_feature(fd, nvme_admin_set_features, nsid, cdw10, value,
|
||||
cdw12, data_len, data, result);
|
||||
cdw12, cdw14, data_len, data, result);
|
||||
}
|
||||
|
||||
|
||||
|
@ -740,18 +751,23 @@ int nvme_set_property(int fd, int offset, uint64_t value)
|
|||
}
|
||||
|
||||
int nvme_get_feature(int fd, __u32 nsid, __u8 fid, __u8 sel, __u32 cdw11,
|
||||
__u32 data_len, void *data, __u32 *result)
|
||||
__u8 uuid_index, __u32 data_len, void *data, __u32 *result)
|
||||
{
|
||||
__u32 cdw10 = fid | sel << 8;
|
||||
__u32 cdw14 = uuid_index;
|
||||
|
||||
return nvme_feature(fd, nvme_admin_get_features, nsid, cdw10, cdw11,
|
||||
0, data_len, data, result);
|
||||
0, cdw14, data_len, data, result);
|
||||
}
|
||||
|
||||
int nvme_format(int fd, __u32 nsid, __u8 lbaf, __u8 ses, __u8 pi,
|
||||
__u8 pil, __u8 ms, __u32 timeout)
|
||||
{
|
||||
__u32 cdw10 = lbaf | ms << 4 | pi << 5 | pil << 8 | ses << 9;
|
||||
__u8 lbafl = lbaf & 0xf;
|
||||
__u8 lbafu = (lbaf >> 4) & 0x3;
|
||||
__u32 cdw10 = lbafl | ms << 4 | pi << 5 | pil << 8 | ses << 9 |
|
||||
lbafu << 12;
|
||||
|
||||
struct nvme_admin_cmd cmd = {
|
||||
.opcode = nvme_admin_format_nvm,
|
||||
.nsid = nsid,
|
||||
|
@ -839,18 +855,23 @@ int nvme_fw_download(int fd, __u32 offset, __u32 data_len, void *data)
|
|||
return nvme_submit_admin_passthru(fd, &cmd);
|
||||
}
|
||||
|
||||
int nvme_fw_commit(int fd, __u8 slot, __u8 action, __u8 bpid)
|
||||
int nvme_fw_commit(int fd, __u8 slot, __u8 action, __u8 bpid, __u32 *result)
|
||||
{
|
||||
int err;
|
||||
|
||||
struct nvme_admin_cmd cmd = {
|
||||
.opcode = nvme_admin_activate_fw,
|
||||
.cdw10 = (bpid << 31) | (action << 3) | slot,
|
||||
};
|
||||
|
||||
return nvme_submit_admin_passthru(fd, &cmd);
|
||||
err = nvme_submit_admin_passthru(fd, &cmd);
|
||||
if (!err && result)
|
||||
*result = cmd.result;
|
||||
return err;
|
||||
}
|
||||
|
||||
int nvme_sec_send(int fd, __u32 nsid, __u8 nssf, __u16 spsp,
|
||||
__u8 secp, __u32 tl, __u32 data_len, void *data)
|
||||
__u8 secp, __u32 data_len, void *data)
|
||||
{
|
||||
struct nvme_admin_cmd cmd = {
|
||||
.opcode = nvme_admin_security_send,
|
||||
|
@ -858,7 +879,7 @@ int nvme_sec_send(int fd, __u32 nsid, __u8 nssf, __u16 spsp,
|
|||
.data_len = data_len,
|
||||
.nsid = nsid,
|
||||
.cdw10 = secp << 24 | spsp << 8 | nssf,
|
||||
.cdw11 = tl,
|
||||
.cdw11 = data_len,
|
||||
};
|
||||
|
||||
return nvme_submit_admin_passthru(fd, &cmd);
|
||||
|
@ -900,41 +921,60 @@ int nvme_get_lba_status(int fd, __u32 namespace_id, __u64 slba, __u32 mndw,
|
|||
int nvme_dir_send(int fd, __u32 nsid, __u16 dspec, __u8 dtype, __u8 doper,
|
||||
__u32 data_len, __u32 dw12, void *data, __u32 *result)
|
||||
{
|
||||
struct nvme_admin_cmd cmd = {
|
||||
.opcode = nvme_admin_directive_send,
|
||||
.addr = (__u64)(uintptr_t) data,
|
||||
.data_len = data_len,
|
||||
.nsid = nsid,
|
||||
.cdw10 = data_len? (data_len >> 2) - 1 : 0,
|
||||
.cdw11 = dspec << 16 | dtype << 8 | doper,
|
||||
.cdw12 = dw12,
|
||||
};
|
||||
int err;
|
||||
struct nvme_admin_cmd cmd = {
|
||||
.opcode = nvme_admin_directive_send,
|
||||
.addr = (__u64)(uintptr_t) data,
|
||||
.data_len = data_len,
|
||||
.nsid = nsid,
|
||||
.cdw10 = data_len? (data_len >> 2) - 1 : 0,
|
||||
.cdw11 = dspec << 16 | dtype << 8 | doper,
|
||||
.cdw12 = dw12,
|
||||
};
|
||||
int err;
|
||||
|
||||
err = nvme_submit_admin_passthru(fd, &cmd);
|
||||
if (!err && result)
|
||||
*result = cmd.result;
|
||||
return err;
|
||||
err = nvme_submit_admin_passthru(fd, &cmd);
|
||||
if (!err && result)
|
||||
*result = cmd.result;
|
||||
return err;
|
||||
}
|
||||
|
||||
int nvme_dir_recv(int fd, __u32 nsid, __u16 dspec, __u8 dtype, __u8 doper,
|
||||
__u32 data_len, __u32 dw12, void *data, __u32 *result)
|
||||
{
|
||||
struct nvme_admin_cmd cmd = {
|
||||
.opcode = nvme_admin_directive_recv,
|
||||
.addr = (__u64)(uintptr_t) data,
|
||||
.data_len = data_len,
|
||||
.nsid = nsid,
|
||||
.cdw10 = data_len? (data_len >> 2) - 1 : 0,
|
||||
.cdw11 = dspec << 16 | dtype << 8 | doper,
|
||||
.cdw12 = dw12,
|
||||
};
|
||||
int err;
|
||||
struct nvme_admin_cmd cmd = {
|
||||
.opcode = nvme_admin_directive_recv,
|
||||
.addr = (__u64)(uintptr_t) data,
|
||||
.data_len = data_len,
|
||||
.nsid = nsid,
|
||||
.cdw10 = data_len? (data_len >> 2) - 1 : 0,
|
||||
.cdw11 = dspec << 16 | dtype << 8 | doper,
|
||||
.cdw12 = dw12,
|
||||
};
|
||||
int err;
|
||||
|
||||
err = nvme_submit_admin_passthru(fd, &cmd);
|
||||
if (!err && result)
|
||||
*result = cmd.result;
|
||||
return err;
|
||||
err = nvme_submit_admin_passthru(fd, &cmd);
|
||||
if (!err && result)
|
||||
*result = cmd.result;
|
||||
return err;
|
||||
}
|
||||
|
||||
int nvme_cap_mgmt(int fd, __u8 op, __u16 element_id, __u32 dw11,
|
||||
__u32 dw12, __u32 *result)
|
||||
{
|
||||
int err;
|
||||
__u32 dw10 = op | element_id << 16;
|
||||
|
||||
struct nvme_admin_cmd cmd = {
|
||||
.opcode = nvme_admin_capacity_mgmt,
|
||||
.cdw10 = dw10,
|
||||
.cdw11 = dw11,
|
||||
.cdw12 = dw12,
|
||||
};
|
||||
|
||||
err = nvme_submit_admin_passthru(fd, &cmd);
|
||||
if (!err && result)
|
||||
*result = cmd.result;
|
||||
return err;
|
||||
}
|
||||
|
||||
int nvme_sanitize(int fd, __u8 sanact, __u8 ause, __u8 owpass, __u8 oipbp,
|
||||
|
@ -979,7 +1019,7 @@ 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,
|
||||
enum nvme_zns_send_action zsa, __u32 data_len,
|
||||
__u32 timeout, enum nvme_zns_send_action zsa, __u32 data_len,
|
||||
void *data)
|
||||
{
|
||||
__u32 cdw10 = slba & 0xffffffff;
|
||||
|
@ -994,6 +1034,7 @@ int nvme_zns_mgmt_send(int fd, __u32 nsid, __u64 slba, bool select_all,
|
|||
.cdw13 = cdw13,
|
||||
.addr = (__u64)(uintptr_t)data,
|
||||
.data_len = data_len,
|
||||
.timeout_ms = timeout,
|
||||
};
|
||||
|
||||
return nvme_submit_io_passthru(fd, &cmd);
|
||||
|
|
30
nvme-ioctl.h
30
nvme-ioctl.h
|
@ -25,9 +25,9 @@ int nvme_passthru(int fd, unsigned long ioctl_cmd, __u8 opcode, __u8 flags,
|
|||
|
||||
|
||||
/* NVME_SUBMIT_IO */
|
||||
int nvme_io(int fd, __u8 opcode, __u64 slba, __u16 nblocks, __u16 control,
|
||||
__u32 dsmgmt, __u32 reftag, __u16 apptag,
|
||||
__u16 appmask, void *data, void *metadata);
|
||||
int nvme_io(int fd, __u8 opcode, __u32 nsid, __u64 slba, __u16 nblocks,
|
||||
__u16 control, __u32 dsmgmt, __u32 reftag, __u16 apptag,
|
||||
__u16 appmask, __u64 storage_tag, void *data, void *metadata);
|
||||
|
||||
/* NVME_IO_CMD */
|
||||
int nvme_passthru_io(int fd, __u8 opcode, __u8 flags, __u16 rsvd,
|
||||
|
@ -38,12 +38,14 @@ int nvme_passthru_io(int fd, __u8 opcode, __u8 flags, __u16 rsvd,
|
|||
void *metadata, __u32 timeout);
|
||||
|
||||
int nvme_write_zeros(int fd, __u32 nsid, __u64 slba, __u16 nlb,
|
||||
__u16 control, __u32 reftag, __u16 apptag, __u16 appmask);
|
||||
__u16 control, __u32 reftag, __u16 apptag, __u16 appmask,
|
||||
__u64 storage_tag);
|
||||
|
||||
int nvme_write_uncorrectable(int fd, __u32 nsid, __u64 slba, __u16 nlb);
|
||||
|
||||
int nvme_verify(int fd, __u32 nsid, __u64 slba, __u16 nblocks,
|
||||
__u16 control, __u32 reftag, __u16 apptag, __u16 appmask);
|
||||
__u16 control, __u32 reftag, __u16 apptag, __u16 appmask,
|
||||
__u64 storage_tag);
|
||||
|
||||
int nvme_flush(int fd, __u32 nsid);
|
||||
|
||||
|
@ -73,7 +75,6 @@ int nvme_identify13(int fd, __u32 nsid, __u32 cdw10, __u32 cdw11, void *data);
|
|||
int nvme_identify(int fd, __u32 nsid, __u32 cdw10, void *data);
|
||||
int nvme_identify_ctrl(int fd, void *data);
|
||||
int nvme_identify_ns(int fd, __u32 nsid, bool present, void *data);
|
||||
int nvme_identify_ns_list(int fd, __u32 nsid, bool all, void *data);
|
||||
int nvme_identify_ns_list_csi(int fd, __u32 nsid, __u8 csi, bool all, void *data);
|
||||
int nvme_identify_ctrl_list(int fd, __u32 nsid, __u16 cntid, void *data);
|
||||
int nvme_identify_ns_descs(int fd, __u32 nsid, void *data);
|
||||
|
@ -86,10 +87,11 @@ int nvme_identify_ctrl_nvm(int fd, void *data);
|
|||
int nvme_zns_identify_ctrl(int fd, void *data);
|
||||
int nvme_zns_identify_ns(int fd, __u32 nsid, void *data);
|
||||
int nvme_identify_iocs(int fd, __u16 cntid, void *data);
|
||||
int nvme_identify_domain_list(int fd, __u16 dom_id, void *data);
|
||||
int nvme_get_log(int fd, __u32 nsid, __u8 log_id, bool rae,
|
||||
__u8 lsp, __u32 data_len, void *data);
|
||||
int nvme_get_log14(int fd, __u32 nsid, __u8 log_id, __u8 lsp, __u64 lpo,
|
||||
__u16 group_id, bool rae, __u8 uuid_ix,
|
||||
__u16 group_id, bool rae, __u8 uuid_ix, __u8 csi, bool ot,
|
||||
__u32 data_len, void *data);
|
||||
int nvme_get_log13(int fd, __u32 nsid, __u8 log_id, __u8 lsp,
|
||||
__u64 lpo, __u16 lsi, bool rae, __u32 data_len,
|
||||
|
@ -119,12 +121,12 @@ int nvme_lba_status_log(int fd, void *lba_status, bool rae,
|
|||
__u32 size);
|
||||
int nvme_resv_notif_log(int fd, struct nvme_resv_notif_log *resv);
|
||||
int nvme_feature(int fd, __u8 opcode, __u32 nsid, __u32 cdw10,
|
||||
__u32 cdw11, __u32 cdw12, __u32 data_len, void *data,
|
||||
__u32 cdw11, __u32 cdw12, __u32 cdw14, __u32 data_len, void *data,
|
||||
__u32 *result);
|
||||
int nvme_set_feature(int fd, __u32 nsid, __u8 fid, __u32 value, __u32 cdw12,
|
||||
bool save, __u32 data_len, void *data, __u32 *result);
|
||||
bool save, __u8 uuid_index, __u32 data_len, void *data, __u32 *result);
|
||||
int nvme_get_feature(int fd, __u32 nsid, __u8 fid, __u8 sel,
|
||||
__u32 cdw11, __u32 data_len, void *data, __u32 *result);
|
||||
__u32 cdw11, __u8 uuid_index, __u32 data_len, void *data, __u32 *result);
|
||||
|
||||
int nvme_format(int fd, __u32 nsid, __u8 lbaf, __u8 ses, __u8 pi,
|
||||
__u8 pil, __u8 ms, __u32 timeout);
|
||||
|
@ -138,10 +140,10 @@ int nvme_ns_attachment(int fd, __u32 nsid, __u16 num_ctrls,
|
|||
__u16 *ctrlist, bool attach);
|
||||
|
||||
int nvme_fw_download(int fd, __u32 offset, __u32 data_len, void *data);
|
||||
int nvme_fw_commit(int fd, __u8 slot, __u8 action, __u8 bpid);
|
||||
int nvme_fw_commit(int fd, __u8 slot, __u8 action, __u8 bpid, __u32 *result);
|
||||
|
||||
int nvme_sec_send(int fd, __u32 nsid, __u8 nssf, __u16 spsp,
|
||||
__u8 secp, __u32 tl, __u32 data_len, void *data);
|
||||
__u8 secp, __u32 data_len, void *data);
|
||||
int nvme_sec_recv(int fd, __u32 nsid, __u8 nssf, __u16 spsp,
|
||||
__u8 secp, __u32 al, __u32 data_len, void *data);
|
||||
|
||||
|
@ -155,6 +157,8 @@ int nvme_dir_send(int fd, __u32 nsid, __u16 dspec, __u8 dtype, __u8 doper,
|
|||
__u32 data_len, __u32 dw12, void *data, __u32 *result);
|
||||
int nvme_dir_recv(int fd, __u32 nsid, __u16 dspec, __u8 dtype, __u8 doper,
|
||||
__u32 data_len, __u32 dw12, void *data, __u32 *result);
|
||||
int nvme_cap_mgmt(int fd, __u8 op, __u16 element_id, __u32 dw11,
|
||||
__u32 dw12, __u32 *result);
|
||||
int nvme_get_properties(int fd, void **pbar);
|
||||
int nvme_set_property(int fd, int offset, uint64_t value);
|
||||
int nvme_get_property(int fd, int offset, uint64_t *value);
|
||||
|
@ -165,7 +169,7 @@ int nvme_self_test_log(int fd, __u32 nsid, struct nvme_self_test_log *self_test_
|
|||
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,
|
||||
enum nvme_zns_send_action zsa, __u32 data_len,
|
||||
__u32 timeout, enum nvme_zns_send_action zsa, __u32 data_len,
|
||||
void *data);
|
||||
int nvme_zns_mgmt_recv(int fd, __u32 nsid, __u64 slba,
|
||||
enum nvme_zns_recv_action zra, __u8 zrasf,
|
||||
|
|
642
nvme-print.c
642
nvme-print.c
File diff suppressed because it is too large
Load diff
|
@ -83,7 +83,12 @@ void nvme_show_id_ns_granularity_list(const struct nvme_id_ns_granularity_list *
|
|||
enum nvme_print_flags flags);
|
||||
void nvme_show_id_uuid_list(const struct nvme_id_uuid_list *uuid_list,
|
||||
enum nvme_print_flags flags);
|
||||
void nvme_show_id_iocs(struct nvme_id_iocs *iocs);
|
||||
void nvme_show_id_iocs(struct nvme_id_iocs *iocs, enum nvme_print_flags flags);
|
||||
void nvme_show_list_ctrl(struct nvme_controller_list *ctrl_list,
|
||||
enum nvme_print_flags flags);
|
||||
void nvme_show_list_ns(__u32 *ns_list, enum nvme_print_flags flags);
|
||||
void nvme_show_id_domain_list(struct nvme_id_domain_list *id_dom,
|
||||
enum nvme_print_flags flags);
|
||||
|
||||
void nvme_feature_show_fields(enum nvme_feat fid, unsigned int result, unsigned char *buf);
|
||||
void nvme_directive_show(__u8 type, __u8 oper, __u16 spec, __u32 nsid, __u32 result,
|
||||
|
|
|
@ -266,7 +266,7 @@ struct rpmb_config_block_t {
|
|||
#define RPMB_NVME_SPSP 0x0001
|
||||
|
||||
#define SEND_RPMB_REQ(tgt, size, req) \
|
||||
nvme_sec_send(fd, 0, tgt, RPMB_NVME_SPSP, RPMB_NVME_SECP, size, size, \
|
||||
nvme_sec_send(fd, 0, tgt, RPMB_NVME_SPSP, RPMB_NVME_SECP, size, \
|
||||
(unsigned char *)(req))
|
||||
|
||||
#define RECV_RPMB_RSP(tgt, size, rsp) \
|
||||
|
|
|
@ -155,23 +155,23 @@ static int scan_namespace(struct nvme_namespace *n)
|
|||
return ret;
|
||||
|
||||
fd = open(path, O_RDONLY);
|
||||
if (fd < 0)
|
||||
if (fd < 0) {
|
||||
ret = fd;
|
||||
goto free;
|
||||
|
||||
}
|
||||
if (!n->nsid) {
|
||||
n->nsid = nvme_get_nsid(fd);
|
||||
if (n->nsid < 0)
|
||||
ret = nvme_get_nsid(fd);
|
||||
if (ret < 0)
|
||||
goto close_fd;
|
||||
n->nsid = ret;
|
||||
}
|
||||
|
||||
ret = nvme_identify_ns(fd, n->nsid, 0, &n->ns);
|
||||
if (ret < 0)
|
||||
goto close_fd;
|
||||
close_fd:
|
||||
close(fd);
|
||||
free:
|
||||
free(path);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static char *get_nvme_ctrl_path_ana_state(char *path, int nsid)
|
||||
|
@ -319,10 +319,8 @@ static int scan_ctrl(struct nvme_ctrl *c, char *p, __u32 ns_instance)
|
|||
return ret;
|
||||
|
||||
fd = open(path, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
fprintf(stderr, "Failed to open %s\n", path);
|
||||
if (fd < 0)
|
||||
goto free;
|
||||
}
|
||||
|
||||
ret = nvme_identify_ctrl(fd, &c->id);
|
||||
if (ret < 0)
|
||||
|
@ -384,8 +382,12 @@ static int scan_subsystem(struct nvme_subsystem *s, __u32 ns_instance, int nsid)
|
|||
for (i = 0; i < s->nr_namespaces; i++) {
|
||||
n = &s->namespaces[i];
|
||||
n->name = strdup(ns[i]->d_name);
|
||||
n->ctrl = &s->ctrls[0];
|
||||
scan_namespace(n);
|
||||
for (j = 0; j < s->nr_ctrls; j++) {
|
||||
n->ctrl = &s->ctrls[j];
|
||||
if (!strcmp(n->ctrl->state, "live") &&
|
||||
!scan_namespace(n))
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
i = s->nr_namespaces;
|
||||
|
@ -666,6 +668,30 @@ char *nvme_char_from_block(char *dev)
|
|||
return path;
|
||||
}
|
||||
|
||||
int nvme_logical_block_size_from_ns_char(const char *dev)
|
||||
{
|
||||
int ret;
|
||||
int id, nsid;
|
||||
char *path = NULL;
|
||||
char *s;
|
||||
|
||||
ret = sscanf(dev, "ng%dn%d", &id, &nsid);
|
||||
if (ret != 2)
|
||||
return -EINVAL;
|
||||
|
||||
if (asprintf(&path, "/sys/block/nvme%dn%d/queue", id, nsid) < 0)
|
||||
path = NULL;
|
||||
|
||||
if (!path)
|
||||
return -EINVAL;
|
||||
|
||||
s = nvme_get_ctrl_attr(path, "logical_block_size");
|
||||
if (!s)
|
||||
return -EINVAL;
|
||||
|
||||
return atoi(s);
|
||||
}
|
||||
|
||||
void *mmap_registers(const char *dev)
|
||||
{
|
||||
int fd;
|
||||
|
|
9
nvme.h
9
nvme.h
|
@ -82,6 +82,7 @@ struct nvme_ctrl {
|
|||
char *traddr;
|
||||
char *trsvcid;
|
||||
char *host_traddr;
|
||||
char *host_iface;
|
||||
char *hostnqn;
|
||||
char *hostid;
|
||||
|
||||
|
@ -120,6 +121,7 @@ enum nvme_print_flags validate_output_format(const char *format);
|
|||
int __id_ctrl(int argc, char **argv, struct command *cmd,
|
||||
struct plugin *plugin, void (*vs)(__u8 *vs, struct json_object *root));
|
||||
char *nvme_char_from_block(char *block);
|
||||
int nvme_logical_block_size_from_ns_char(const char *dev);
|
||||
void *mmap_registers(const char *dev);
|
||||
|
||||
extern int current_index;
|
||||
|
@ -144,4 +146,11 @@ int uuid_from_systemd(char *uuid);
|
|||
|
||||
unsigned long long elapsed_utime(struct timeval start_time,
|
||||
struct timeval end_time);
|
||||
|
||||
static inline void nvme_strip_spaces(char *s, int l)
|
||||
{
|
||||
while (l && (s[l] == '\0' || s[l] == ' '))
|
||||
s[l--] = '\0';
|
||||
}
|
||||
|
||||
#endif /* _NVME_H */
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
[Unit]
|
||||
Description=Connect NVMe-oF subsystems automatically during boot
|
||||
ConditionPathExists=/etc/nvme/discovery.conf
|
||||
After=network.target
|
||||
After=network-online.target
|
||||
Before=remote-fs-pre.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStartPre=/sbin/modprobe nvme-fabrics
|
||||
ExecStart=/usr/sbin/nvme connect-all
|
||||
|
||||
[Install]
|
||||
|
|
2
plugin.c
2
plugin.c
|
@ -11,7 +11,7 @@ static int version(struct plugin *plugin)
|
|||
struct program *prog = plugin->parent;
|
||||
|
||||
if (plugin->name)
|
||||
printf("%s %s version %s\n", prog->name, plugin->name, prog->version);
|
||||
printf("%s %s version %s\n", prog->name, plugin->name, plugin->version);
|
||||
else
|
||||
printf("%s version %s\n", prog->name, prog->version);
|
||||
return 0;
|
||||
|
|
1
plugin.h
1
plugin.h
|
@ -16,6 +16,7 @@ struct program {
|
|||
struct plugin {
|
||||
const char *name;
|
||||
const char *desc;
|
||||
const char *version;
|
||||
struct command **commands;
|
||||
struct program *parent;
|
||||
struct plugin *next;
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
#include "cmd.h"
|
||||
|
||||
PLUGIN(NAME("amzn", "Amazon vendor specific extensions"),
|
||||
PLUGIN(NAME("amzn", "Amazon vendor specific extensions", NVME_VERSION),
|
||||
COMMAND_LIST(
|
||||
ENTRY("id-ctrl", "Send NVMe Identify Controller", id_ctrl)
|
||||
)
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
#include "cmd.h"
|
||||
|
||||
PLUGIN(NAME("dera", "Dera vendor specific extensions"),
|
||||
PLUGIN(NAME("dera", "Dera vendor specific extensions", NVME_VERSION),
|
||||
COMMAND_LIST(
|
||||
ENTRY("smart-log-add", "Retrieve Dera SMART Log, show it", get_status, "stat")
|
||||
)
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
#include "cmd.h"
|
||||
|
||||
PLUGIN(NAME("huawei", "Huawei vendor specific extensions"),
|
||||
PLUGIN(NAME("huawei", "Huawei vendor specific extensions", NVME_VERSION),
|
||||
COMMAND_LIST(
|
||||
ENTRY("list", "List all Huawei NVMe devices and namespaces on machine", huawei_list)
|
||||
ENTRY("id-ctrl", "Huawei identify controller", huawei_id_ctrl)
|
||||
|
|
|
@ -454,7 +454,7 @@ static int get_temp_stats_log(int argc, char **argv, struct command *cmd, struct
|
|||
struct intel_temp_stats stats;
|
||||
int err, fd;
|
||||
|
||||
const char *desc = "Get Intel Marketing Name log and show it.";
|
||||
const char *desc = "Get Temperature Statistics log and show it.";
|
||||
const char *raw = "dump output in binary format";
|
||||
struct config {
|
||||
int raw_binary;
|
||||
|
@ -1065,7 +1065,7 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct
|
|||
__u32 thresholds[OPTANE_V1000_BUCKET_LEN] = {0};
|
||||
__u32 result;
|
||||
|
||||
err = nvme_get_feature(fd, 0, 0xf7, 0, cfg.write ? 0x1 : 0x0,
|
||||
err = nvme_get_feature(fd, 0, 0xf7, 0, cfg.write ? 0x1 : 0x0, 0,
|
||||
sizeof(thresholds), thresholds, &result);
|
||||
if (err) {
|
||||
fprintf(stderr, "Quering thresholds failed. NVMe Status:%s(%x)\n",
|
||||
|
@ -1542,7 +1542,7 @@ static int enable_lat_stats_tracking(int argc, char **argv,
|
|||
return fd;
|
||||
switch (option) {
|
||||
case None:
|
||||
err = nvme_get_feature(fd, nsid, fid, sel, cdw11, data_len, buf,
|
||||
err = nvme_get_feature(fd, nsid, fid, sel, cdw11, 0, data_len, buf,
|
||||
&result);
|
||||
if (!err) {
|
||||
printf(
|
||||
|
@ -1555,7 +1555,7 @@ static int enable_lat_stats_tracking(int argc, char **argv,
|
|||
break;
|
||||
case True:
|
||||
case False:
|
||||
err = nvme_set_feature(fd, nsid, fid, option, cdw12, save,
|
||||
err = nvme_set_feature(fd, nsid, fid, option, cdw12, save, 0,
|
||||
data_len, buf, &result);
|
||||
if (err > 0) {
|
||||
fprintf(stderr, "NVMe Status:%s(%x)\n",
|
||||
|
@ -1636,7 +1636,7 @@ static int set_lat_stats_thresholds(int argc, char **argv,
|
|||
}
|
||||
|
||||
err = nvme_set_feature(fd, nsid, fid, cfg.write ? 0x1 : 0x0,
|
||||
cdw12, save, OPTANE_V1000_BUCKET_LEN,
|
||||
cdw12, save, 0, OPTANE_V1000_BUCKET_LEN,
|
||||
thresholds, &result);
|
||||
|
||||
if (err > 0) {
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
#include "cmd.h"
|
||||
|
||||
PLUGIN(NAME("intel", "Intel vendor specific extensions"),
|
||||
PLUGIN(NAME("intel", "Intel vendor specific extensions", NVME_VERSION),
|
||||
COMMAND_LIST(
|
||||
ENTRY("id-ctrl", "Send NVMe Identify Controller", id_ctrl)
|
||||
ENTRY("internal-log", "Retrieve Intel internal firmware log, save it", get_internal_log)
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
#include "cmd.h"
|
||||
|
||||
PLUGIN(NAME("lnvm", "LightNVM specific extensions"),
|
||||
PLUGIN(NAME("lnvm", "LightNVM specific extensions", NVME_VERSION),
|
||||
COMMAND_LIST(
|
||||
ENTRY("list", "List available LightNVM devices", lnvm_list)
|
||||
ENTRY("info", "List general information and available target engines", lnvm_info)
|
||||
|
|
|
@ -503,7 +503,7 @@ static int mb_get_powermanager_status(int argc, char **argv, struct command *cmd
|
|||
fd = parse_and_open(argc, argv, desc, opts);
|
||||
if (fd < 0) return fd;
|
||||
|
||||
err = nvme_get_feature(fd, 0, feature_id, 0, 0, 0, NULL, &result);
|
||||
err = nvme_get_feature(fd, 0, feature_id, 0, 0, 0, 0, NULL, &result);
|
||||
if (err < 0) {
|
||||
perror("get-feature");
|
||||
}
|
||||
|
@ -545,7 +545,7 @@ static int mb_set_powermanager_status(int argc, char **argv, struct command *cmd
|
|||
fd = parse_and_open(argc, argv, desc, opts);
|
||||
if (fd < 0) return fd;
|
||||
|
||||
err = nvme_set_feature(fd, 0, cfg.feature_id, cfg.value, 0, cfg.save, 0, NULL, &result);
|
||||
err = nvme_set_feature(fd, 0, cfg.feature_id, cfg.value, 0, cfg.save, 0, 0, NULL, &result);
|
||||
if (err < 0) {
|
||||
perror("set-feature");
|
||||
}
|
||||
|
@ -602,7 +602,7 @@ static int mb_set_high_latency_log(int argc, char **argv, struct command *cmd, s
|
|||
}
|
||||
cfg.value = (param1 << MB_FEAT_HIGH_LATENCY_VALUE_SHIFT) | param2;
|
||||
|
||||
err = nvme_set_feature(fd, 0, cfg.feature_id, cfg.value, 0, 0, 0, NULL, &result);
|
||||
err = nvme_set_feature(fd, 0, cfg.feature_id, cfg.value, 0, 0, 0, 0, NULL, &result);
|
||||
if (err < 0) {
|
||||
perror("set-feature");
|
||||
}
|
||||
|
@ -1038,7 +1038,7 @@ static int memblaze_clear_error_log(int argc, char **argv, struct command *cmd,
|
|||
|
||||
|
||||
|
||||
err = nvme_set_feature(fd, 0, cfg.feature_id, cfg.value, 0, cfg.save, 0, NULL, &result);
|
||||
err = nvme_set_feature(fd, 0, cfg.feature_id, cfg.value, 0, cfg.save, 0, 0, NULL, &result);
|
||||
if (err < 0) {
|
||||
perror("set-feature");
|
||||
}
|
||||
|
@ -1115,7 +1115,7 @@ static int mb_set_lat_stats(int argc, char **argv,
|
|||
return fd;
|
||||
switch (option) {
|
||||
case None:
|
||||
err = nvme_get_feature(fd, nsid, fid, sel, cdw11, data_len, buf,
|
||||
err = nvme_get_feature(fd, nsid, fid, sel, cdw11, 0, data_len, buf,
|
||||
&result);
|
||||
if (!err) {
|
||||
printf(
|
||||
|
@ -1128,7 +1128,7 @@ static int mb_set_lat_stats(int argc, char **argv,
|
|||
break;
|
||||
case True:
|
||||
case False:
|
||||
err = nvme_set_feature(fd, nsid, fid, option, cdw12, save,
|
||||
err = nvme_set_feature(fd, nsid, fid, option, cdw12, save, 0,
|
||||
data_len, buf, &result);
|
||||
if (err > 0) {
|
||||
fprintf(stderr, "NVMe Status:%s(%x)\n",
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
PLUGIN(NAME("memblaze", "Memblaze vendor specific extensions"),
|
||||
PLUGIN(NAME("memblaze", "Memblaze vendor specific extensions", NVME_VERSION),
|
||||
COMMAND_LIST(
|
||||
ENTRY("smart-log-add", "Retrieve Memblaze SMART Log, show it", mb_get_additional_smart_log)
|
||||
ENTRY("get-pm-status", "Get Memblaze Power Manager Status", mb_get_powermanager_status)
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <sys/stat.h>
|
||||
#include "nvme.h"
|
||||
#include "nvme-print.h"
|
||||
#include "nvme-status.h"
|
||||
#include "nvme-ioctl.h"
|
||||
#include <sys/ioctl.h>
|
||||
#include <limits.h>
|
||||
|
@ -38,7 +39,7 @@
|
|||
/* Plugin version major_number.minor_number.patch */
|
||||
static const char *__version_major = "1";
|
||||
static const char *__version_minor = "0";
|
||||
static const char *__version_patch = "5";
|
||||
static const char *__version_patch = "6";
|
||||
|
||||
/* supported models of micron plugin; new models should be added at the end
|
||||
* before UNKNOWN_MODEL. Make sure M5410 is first in the list !
|
||||
|
@ -626,7 +627,7 @@ static int micron_smbus_option(int argc, char **argv,
|
|||
|
||||
if (!strcmp(opt.option, "enable")) {
|
||||
cdw11 = opt.value << 1 | 1;
|
||||
err = nvme_set_feature(fd, 1, fid, cdw11, 0, opt.save, 0, 0, &result);
|
||||
err = nvme_set_feature(fd, 1, fid, cdw11, 0, opt.save, 0, 0, 0, &result);
|
||||
if (err == 0) {
|
||||
printf("successfully enabled SMBus on drive\n");
|
||||
} else {
|
||||
|
@ -635,7 +636,7 @@ static int micron_smbus_option(int argc, char **argv,
|
|||
}
|
||||
else if (!strcmp(opt.option, "status")) {
|
||||
cdw10 = opt.value;
|
||||
err = nvme_get_feature(fd, 1, fid, cdw10, 0, 0, 0, &result);
|
||||
err = nvme_get_feature(fd, 1, fid, cdw10, 0, 0, 0, 0, &result);
|
||||
if (err == 0) {
|
||||
printf("SMBus status on the drive: %s (returns %s temperature) \n",
|
||||
(result & 1) ? "enabled" : "disabled",
|
||||
|
@ -646,7 +647,7 @@ static int micron_smbus_option(int argc, char **argv,
|
|||
}
|
||||
else if (!strcmp(opt.option, "disable")) {
|
||||
cdw11 = opt.value << 1 | 0;
|
||||
err = nvme_set_feature(fd, 1, fid, cdw11, 0, opt.save, 0, 0, &result);
|
||||
err = nvme_set_feature(fd, 1, fid, cdw11, 0, opt.save, 0, 0, 0, &result);
|
||||
if (err == 0) {
|
||||
printf("Successfully disabled SMBus on drive\n");
|
||||
} else {
|
||||
|
@ -932,9 +933,11 @@ static int micron_clear_pcie_correctable_errors(int argc, char **argv,
|
|||
|
||||
/* For M51CX models, PCIe errors are cleared using 0xC3 feature */
|
||||
if (model == M51CX) {
|
||||
err = nvme_set_feature(fd, 0, fid, (1 << 31), 0, 0, 0, 0, &result);
|
||||
err = nvme_set_feature(fd, 0, fid, (1 << 31), 0, 0, 0, 0, 0, &result);
|
||||
if (err == 0 && (err = (int)result) == 0)
|
||||
printf("Device correctable errors cleared!\n");
|
||||
else if (err > 0)
|
||||
nvme_show_status(err);
|
||||
else
|
||||
printf("Error clearing Device correctable errors = 0x%x\n", err);
|
||||
goto out;
|
||||
|
@ -1056,11 +1059,12 @@ static void init_d0_log_page(__u8 *buf, __u8 nsze)
|
|||
/* OCP and Vendor specific log data format */
|
||||
struct micron_vs_logpage {
|
||||
char *field;
|
||||
int size;
|
||||
int size; /* FB client spec version 1.0 sizes - M5410 models */
|
||||
int size2; /* FB client spec version 0.7 sizes - M5407 models */
|
||||
}
|
||||
/* Smart Health Log information as per OCP spec */
|
||||
/* Smart Health Log information as per OCP spec M51CX models */
|
||||
ocp_c0_log_page[] = {
|
||||
{ "Physical Media Units Written", 16 },
|
||||
{ "Physical Media Units Written", 16},
|
||||
{ "Physical Media Units Read", 16 },
|
||||
{ "Raw Bad User NAND Block Count", 6},
|
||||
{ "Normalized Bad User NAND Block Count", 2},
|
||||
|
@ -1096,43 +1100,56 @@ ocp_c0_log_page[] = {
|
|||
},
|
||||
/* Vendor Specific Health Log information */
|
||||
fb_log_page[] = {
|
||||
{ "Physical Media Units Written - TLC", 16 },
|
||||
{ "Physical Media Units Written - SLC", 16 },
|
||||
{ "Normalized Bad User NAND Block Count", 2},
|
||||
{ "Raw Bad User NAND Block Count", 6},
|
||||
{ "XOR Recovery Count", 8},
|
||||
{ "Uncorrectable Read Error Count", 8},
|
||||
{ "SSD End to End Corrected Errors", 8},
|
||||
{ "SSD End to End Detected Counts", 4},
|
||||
{ "SSD End to End Uncorrected Counts", 4},
|
||||
{ "System data % life-used", 1},
|
||||
{ "Minimum User Data Erase Count - TLC", 8},
|
||||
{ "Maximum User Data Erase Count - TLC", 8},
|
||||
{ "Minimum User Data Erase Count - SLC", 8},
|
||||
{ "Maximum User Data Erase Count - SLC", 8},
|
||||
{ "Normalized Program Fail Count", 2},
|
||||
{ "Raw Program Fail Count", 6},
|
||||
{ "Normalized Erase Fail Count", 2},
|
||||
{ "Raw Erase Fail Count", 6},
|
||||
{ "Pcie Correctable Error Count", 8},
|
||||
{ "% Free Blocks (User)", 1},
|
||||
{ "Security Version Number", 8},
|
||||
{ "% Free Blocks (System)", 1},
|
||||
{ "Dataset Management (Deallocate) Commands", 16},
|
||||
{ "Incomplete TRIM Data", 8},
|
||||
{ "% Age of Completed TRIM", 1},
|
||||
{ "Background Back-Pressure Gauge", 1},
|
||||
{ "Soft ECC Error Count", 8},
|
||||
{ "Refresh Count", 8},
|
||||
{ "Normalized Bad System NAND Block Count", 2},
|
||||
{ "Raw Bad System NAND Block Count", 6},
|
||||
{ "Endurance Estimate", 16},
|
||||
{ "Thermal Throttling Count", 1},
|
||||
{ "Thermal Throttling Status", 1},
|
||||
{ "Unaligned I/O", 8},
|
||||
{ "Physical Media Units Read", 16},
|
||||
{ "Reserved", 279},
|
||||
{ "Log Page Version", 2}
|
||||
{ "Physical Media Units Written - TLC", 16, 16 },
|
||||
{ "Physical Media Units Written - SLC", 16, 16 },
|
||||
{ "Normalized Bad User NAND Block Count", 2, 2},
|
||||
{ "Raw Bad User NAND Block Count", 6, 6},
|
||||
{ "XOR Recovery Count", 8, 8},
|
||||
{ "Uncorrectable Read Error Count", 8, 8},
|
||||
{ "SSD End to End Corrected Errors", 8, 8},
|
||||
{ "SSD End to End Detected Counts", 4, 8},
|
||||
{ "SSD End to End Uncorrected Counts", 4, 8},
|
||||
{ "System data % life-used", 1, 1},
|
||||
{ "Reserved", 0, 3},
|
||||
{ "Minimum User Data Erase Count - TLC", 8, 8},
|
||||
{ "Maximum User Data Erase Count - TLC", 8, 8},
|
||||
{ "Average User Data Erase Count - TLC", 0, 8},
|
||||
{ "Minimum User Data Erase Count - SLC", 8, 8},
|
||||
{ "Maximum User Data Erase Count - SLC", 8, 8},
|
||||
{ "Average User Data Erase Count - SLC", 0, 8},
|
||||
{ "Normalized Program Fail Count", 2, 2},
|
||||
{ "Raw Program Fail Count", 6, 6},
|
||||
{ "Normalized Erase Fail Count", 2, 2},
|
||||
{ "Raw Erase Fail Count", 6, 6},
|
||||
{ "Pcie Correctable Error Count", 8, 8},
|
||||
{ "% Free Blocks (User)", 1, 1},
|
||||
{ "Reserved", 0, 3},
|
||||
{ "Security Version Number", 8, 8},
|
||||
{ "% Free Blocks (System)", 1, 1},
|
||||
{ "Reserved", 0, 3},
|
||||
{ "Dataset Management (Deallocate) Commands", 16, 16},
|
||||
{ "Incomplete TRIM Data", 8, 8},
|
||||
{ "% Age of Completed TRIM", 1, 2},
|
||||
{ "Background Back-Pressure Gauge", 1, 1},
|
||||
{ "Reserved", 0, 3},
|
||||
{ "Soft ECC Error Count", 8, 8},
|
||||
{ "Refresh Count", 8, 8},
|
||||
{ "Normalized Bad System NAND Block Count", 2, 2},
|
||||
{ "Raw Bad System NAND Block Count", 6, 6},
|
||||
{ "Endurance Estimate", 16, 16},
|
||||
{ "Thermal Throttling Count", 1, 1},
|
||||
{ "Thermal Throttling Status", 1, 1},
|
||||
{ "Unaligned I/O", 8, 8},
|
||||
{ "Physical Media Units Read", 16, 16},
|
||||
{ "Reserved", 279, 0},
|
||||
{ "Log Page Version", 2, 0},
|
||||
{ "READ CMDs exceeding threshold", 0, 4},
|
||||
{ "WRITE CMDs exceeding threshold", 0, 4},
|
||||
{ "TRIMs CMDs exceeding threshold", 0, 4},
|
||||
{ "Reserved", 0, 4},
|
||||
{ "Reserved", 0, 210},
|
||||
{ "Log Page Version", 0, 2},
|
||||
{ "Log Page GUID", 0, 16},
|
||||
};
|
||||
|
||||
/* Common function to print Micron VS log pages */
|
||||
|
@ -1140,66 +1157,70 @@ static void print_micron_vs_logs(
|
|||
__u8 *buf, /* raw log data */
|
||||
struct micron_vs_logpage *log_page, /* format of the data */
|
||||
int field_count, /* log field count */
|
||||
struct json_object *stats /* json object to add fields */
|
||||
struct json_object *stats, /* json object to add fields */
|
||||
__u8 spec /* ocp spec index */
|
||||
)
|
||||
{
|
||||
__u64 lval_lo, lval_hi;
|
||||
__u32 ival;
|
||||
__u16 sval;
|
||||
__u8 cval, lval[8] = { 0 };
|
||||
int field, guid_index;
|
||||
int field;
|
||||
int offset = 0;
|
||||
|
||||
for (field = 0; field < field_count; field++) {
|
||||
char datastr[1024] = { 0 };
|
||||
if (log_page[field].size == 16) {
|
||||
if (strstr(log_page[field].field, "GUID")) {
|
||||
char *tmpstr = datastr;
|
||||
tmpstr += sprintf(datastr, "0x");
|
||||
for(guid_index = 0; guid_index < 16; guid_index++)
|
||||
tmpstr += sprintf(tmpstr, "%01X", buf[offset + guid_index]);
|
||||
char *sfield = NULL;
|
||||
int size = (spec == 0) ? log_page[field].size : log_page[field].size2;
|
||||
if (size == 0) continue;
|
||||
sfield = log_page[field].field;
|
||||
if (size == 16) {
|
||||
if (strstr(sfield, "GUID")) {
|
||||
sprintf(datastr, "0x%"PRIx64"%"PRIx64"",
|
||||
(uint64_t)le64_to_cpu(*(uint64_t *)(&buf[offset + 8])),
|
||||
(uint64_t)le64_to_cpu(*(uint64_t *)(&buf[offset])));
|
||||
} else {
|
||||
lval_lo = *((__u64 *)(&buf[offset]));
|
||||
lval_hi = *((__u64 *)(&buf[offset + 8]));
|
||||
if (lval_hi)
|
||||
sprintf(datastr, "0x%"PRIx64"_%"PRIx64"",
|
||||
sprintf(datastr, "0x%"PRIx64"%016"PRIx64"",
|
||||
le64_to_cpu(lval_hi), le64_to_cpu(lval_lo));
|
||||
else
|
||||
sprintf(datastr, "0x%"PRIx64"", le64_to_cpu(lval_lo));
|
||||
}
|
||||
} else if (log_page[field].size == 8) {
|
||||
} else if (size == 8) {
|
||||
lval_lo = *((__u64 *)(&buf[offset]));
|
||||
sprintf(datastr, "0x%"PRIx64"", le64_to_cpu(lval_lo));
|
||||
} else if (log_page[field].size == 7) {
|
||||
} else if (size == 7) {
|
||||
/* 7 bytes will be in little-endian format, with last byte as MSB */
|
||||
memcpy(&lval[0], &buf[offset], 7);
|
||||
memcpy((void *)&lval_lo, lval, 8);
|
||||
sprintf(datastr, "0x%"PRIx64"", le64_to_cpu(lval_lo));
|
||||
} else if (log_page[field].size == 6) {
|
||||
} else if (size == 6) {
|
||||
ival = *((__u32 *)(&buf[offset]));
|
||||
sval = *((__u16 *)(&buf[offset + 4]));
|
||||
lval_lo = (((__u64)sval << 32) | ival);
|
||||
sprintf(datastr, "0x%"PRIx64"", le64_to_cpu(lval_lo));
|
||||
} else if (log_page[field].size == 4) {
|
||||
} else if (size == 4) {
|
||||
ival = *((__u32 *)(&buf[offset]));
|
||||
sprintf(datastr, "0x%x", le32_to_cpu(ival));
|
||||
} else if (log_page[field].size == 2) {
|
||||
} else if (size == 2) {
|
||||
sval = *((__u16 *)(&buf[offset]));
|
||||
sprintf(datastr, "0x%04x", le16_to_cpu(sval));
|
||||
} else if (log_page[field].size == 1) {
|
||||
} else if (size == 1) {
|
||||
cval = buf[offset];
|
||||
sprintf(datastr, "0x%02x", cval);
|
||||
} else {
|
||||
sprintf(datastr, "0");
|
||||
}
|
||||
offset += log_page[field].size;
|
||||
offset += size;
|
||||
/* do not print reserved values */
|
||||
if (strstr(log_page[field].field, "Reserved"))
|
||||
if (strstr(sfield, "Reserved"))
|
||||
continue;
|
||||
if (stats != NULL) {
|
||||
json_object_add_value_string(stats, log_page[field].field, datastr);
|
||||
json_object_add_value_string(stats, sfield, datastr);
|
||||
} else {
|
||||
printf("%-40s : %-4s\n", log_page[field].field, datastr);
|
||||
printf("%-40s : %-4s\n", sfield, datastr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1219,7 +1240,7 @@ static void print_smart_cloud_health_log(__u8 *buf, bool is_json)
|
|||
logPages);
|
||||
}
|
||||
|
||||
print_micron_vs_logs(buf, ocp_c0_log_page, field_count, stats);
|
||||
print_micron_vs_logs(buf, ocp_c0_log_page, field_count, stats, 0);
|
||||
|
||||
if (is_json) {
|
||||
json_array_add_value_object(logPages, stats);
|
||||
|
@ -1229,7 +1250,7 @@ static void print_smart_cloud_health_log(__u8 *buf, bool is_json)
|
|||
}
|
||||
}
|
||||
|
||||
static void print_nand_stats_fb(__u8 *buf, __u8 *buf2, __u8 nsze, bool is_json)
|
||||
static void print_nand_stats_fb(__u8 *buf, __u8 *buf2, __u8 nsze, bool is_json, __u8 spec)
|
||||
{
|
||||
struct json_object *root;
|
||||
struct json_object *logPages;
|
||||
|
@ -1244,20 +1265,22 @@ static void print_nand_stats_fb(__u8 *buf, __u8 *buf2, __u8 nsze, bool is_json)
|
|||
logPages);
|
||||
}
|
||||
|
||||
print_micron_vs_logs(buf, fb_log_page, field_count, stats);
|
||||
print_micron_vs_logs(buf, fb_log_page, field_count, stats, spec);
|
||||
|
||||
/* print last three entries from D0 log page */
|
||||
init_d0_log_page(buf2, nsze);
|
||||
if (buf2 != NULL) {
|
||||
init_d0_log_page(buf2, nsze);
|
||||
|
||||
if (is_json) {
|
||||
for (int i = 4; i < 7; i++) {
|
||||
json_object_add_value_string(stats,
|
||||
d0_log_page[i].field,
|
||||
d0_log_page[i].datastr);
|
||||
}
|
||||
} else {
|
||||
for (int i = 4; i < 7; i++) {
|
||||
printf("%-40s : %s\n", d0_log_page[i].field, d0_log_page[i].datastr);
|
||||
if (is_json) {
|
||||
for (int i = 0; i < 7; i++) {
|
||||
json_object_add_value_string(stats,
|
||||
d0_log_page[i].field,
|
||||
d0_log_page[i].datastr);
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < 7; i++) {
|
||||
printf("%-40s : %s\n", d0_log_page[i].field, d0_log_page[i].datastr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1337,14 +1360,16 @@ static int micron_nand_stats(int argc, char **argv,
|
|||
is_json = false;
|
||||
|
||||
err = nvme_identify_ctrl(fd, &ctrl);
|
||||
if (err)
|
||||
if (err) {
|
||||
printf("Error %d retrieving controller identification data\n", err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* pull log details based on the model name */
|
||||
sscanf(argv[optind], "/dev/nvme%d", &ctrlIdx);
|
||||
if ((eModel = GetDriveModel(ctrlIdx)) == UNKNOWN_MODEL) {
|
||||
printf ("Unsupported drive model for vs-nand-stats command\n");
|
||||
close(fd);
|
||||
err = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -1353,27 +1378,29 @@ static int micron_nand_stats(int argc, char **argv,
|
|||
has_d0_log = (0 == err);
|
||||
|
||||
/* should check for firmware version if this log is supported or not */
|
||||
if (eModel == M5407 || eModel == M5410) {
|
||||
if (eModel != M5407 && eModel != M5410) {
|
||||
err = nvme_get_log(fd, NVME_NSID_ALL, 0xFB, false, NVME_NO_LOG_LSP,
|
||||
FB_log_size, logFB);
|
||||
has_fb_log = (0 == err);
|
||||
}
|
||||
|
||||
nsze = (ctrl.vs[987] == 0x12);
|
||||
|
||||
if (nsze == 0 && nsze_from_oacs)
|
||||
nsze = ((ctrl.oacs >> 3) & 0x1);
|
||||
err = 0;
|
||||
if (has_fb_log)
|
||||
print_nand_stats_fb((__u8 *)logFB, (__u8 *)extSmartLog, nsze, is_json);
|
||||
else if (has_d0_log)
|
||||
|
||||
if (has_fb_log) {
|
||||
__u8 spec = (eModel == M5410) ? 0 : 1; /* FB spec version */
|
||||
print_nand_stats_fb((__u8 *)logFB, (__u8 *)extSmartLog, nsze, is_json, spec);
|
||||
} else if (has_d0_log) {
|
||||
print_nand_stats_d0((__u8 *)extSmartLog, nsze, is_json);
|
||||
else {
|
||||
printf("Unable to retrieve extended smart log for the drive\n");
|
||||
err = -ENOTTY;
|
||||
err = 0;
|
||||
}
|
||||
out:
|
||||
close(fd);
|
||||
return err;
|
||||
if (err > 0)
|
||||
nvme_show_status(err);
|
||||
return nvme_status_to_errno(err, false);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1483,6 +1510,62 @@ static void GetErrorlogData(int fd, int entries, const char *dir)
|
|||
free(error_log);
|
||||
}
|
||||
|
||||
static void GetGenericLogs(int fd, const char *dir)
|
||||
{
|
||||
struct nvme_self_test_log self_test_log;
|
||||
struct nvme_firmware_log_page fw_log;
|
||||
struct nvme_effects_log_page effects;
|
||||
struct nvme_persistent_event_log_head pevent_log_head;
|
||||
void *pevent_log_info = NULL;
|
||||
__u32 log_len = 0;
|
||||
int err = 0 ;
|
||||
bool huge = false;
|
||||
|
||||
/* get self test log */
|
||||
if (nvme_self_test_log(fd, sizeof(self_test_log), &self_test_log) == 0) {
|
||||
WriteData((__u8*)&self_test_log, sizeof(self_test_log), dir,
|
||||
"drive_self_test.bin", "self test log");
|
||||
}
|
||||
|
||||
/* get fw slot info log */
|
||||
if (nvme_fw_log(fd, &fw_log) == 0) {
|
||||
WriteData((__u8*)&fw_log, sizeof(fw_log), dir,
|
||||
"firmware_slot_info_log.bin", "firmware log");
|
||||
}
|
||||
|
||||
/* get effects log */
|
||||
if (nvme_effects_log(fd, &effects) == 0) {
|
||||
WriteData((__u8*)&effects, sizeof(effects), dir,
|
||||
"command_effects_log.bin", "effects log");
|
||||
}
|
||||
|
||||
/* get persistent event log */
|
||||
(void)nvme_persistent_event_log(fd, NVME_PEVENT_LOG_RELEASE_CTX,
|
||||
sizeof(pevent_log_head), &pevent_log_head);
|
||||
memset(&pevent_log_head, 0, sizeof(pevent_log_head));
|
||||
err = nvme_persistent_event_log(fd, NVME_PEVENT_LOG_EST_CTX_AND_READ,
|
||||
sizeof(pevent_log_head), &pevent_log_head);
|
||||
if (err) {
|
||||
fprintf(stderr, "Setting persistent event log read ctx failed (ignored)!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
log_len = le64_to_cpu(pevent_log_head.tll);
|
||||
pevent_log_info = nvme_alloc(log_len, &huge);
|
||||
if (!pevent_log_info) {
|
||||
perror("could not alloc buffer for persistent event log page (ignored)!\n");
|
||||
return;
|
||||
}
|
||||
err = nvme_persistent_event_log(fd, NVME_PEVENT_LOG_READ,
|
||||
log_len, pevent_log_info);
|
||||
if (err == 0) {
|
||||
WriteData((__u8*)pevent_log_info, log_len, dir,
|
||||
"persistent_event_log.bin", "persistent event log");
|
||||
}
|
||||
nvme_free(pevent_log_info, huge);
|
||||
return;
|
||||
}
|
||||
|
||||
static void GetNSIDDInfo(int fd, const char *dir, int nsid)
|
||||
{
|
||||
char file[PATH_MAX] = { 0 };
|
||||
|
@ -1537,14 +1620,14 @@ static void GetOSConfig(const char *strOSDirName)
|
|||
static int micron_telemetry_log(int fd, __u8 gen, __u8 type, __u8 **data,
|
||||
int *logSize, int da)
|
||||
{
|
||||
int err;
|
||||
int err, bs = 512, offset = bs;
|
||||
unsigned short data_area[4];
|
||||
unsigned char ctrl_init = (type == 0x8);
|
||||
|
||||
__u8 *buffer = (unsigned char *)calloc(512, 1);
|
||||
__u8 *buffer = (unsigned char *)calloc(bs, 1);
|
||||
if (buffer == NULL)
|
||||
return -1;
|
||||
err = nvme_get_telemetry_log(fd, buffer, gen, ctrl_init, 512, 0);
|
||||
err = nvme_get_telemetry_log(fd, buffer, gen, ctrl_init, bs, 0);
|
||||
if (err != 0) {
|
||||
fprintf(stderr, "Failed to get telemetry log header for 0x%X\n", type);
|
||||
if (buffer != NULL) {
|
||||
|
@ -1553,10 +1636,10 @@ static int micron_telemetry_log(int fd, __u8 gen, __u8 type, __u8 **data,
|
|||
return err;
|
||||
}
|
||||
|
||||
// compute size of the log
|
||||
data_area[1] = buffer[9] << 16 | buffer[8];
|
||||
data_area[2] = buffer[11] << 16 | buffer[10];
|
||||
data_area[3] = buffer[13] << 16 | buffer[12];
|
||||
/* compute size of the log */
|
||||
data_area[1] = buffer[9] << 8 | buffer[8];
|
||||
data_area[2] = buffer[11] << 8 | buffer[10];
|
||||
data_area[3] = buffer[13] << 8 | buffer[12];
|
||||
data_area[0] = data_area[1] > data_area[2] ? data_area[1] : data_area[2];
|
||||
data_area[0] = data_area[3] > data_area[0] ? data_area[3] : data_area[0];
|
||||
|
||||
|
@ -1569,9 +1652,14 @@ static int micron_telemetry_log(int fd, __u8 gen, __u8 type, __u8 **data,
|
|||
return -1;
|
||||
}
|
||||
|
||||
*logSize = data_area[da] * 512;
|
||||
*logSize = data_area[da] * bs;
|
||||
offset = bs;
|
||||
err = 0;
|
||||
if ((buffer = (unsigned char *)realloc(buffer, (size_t)(*logSize))) != NULL) {
|
||||
err = nvme_get_telemetry_log(fd, buffer, gen, ctrl_init, *logSize, 0);
|
||||
while (err == 0 && offset != *logSize) {
|
||||
err = nvme_get_telemetry_log(fd, buffer + offset, gen, ctrl_init, bs, offset);
|
||||
offset += bs;
|
||||
}
|
||||
}
|
||||
|
||||
if (err == 0 && buffer != NULL) {
|
||||
|
@ -1594,12 +1682,13 @@ static int GetTelemetryData(int fd, const char *dir)
|
|||
__u8 log;
|
||||
char *file;
|
||||
} tmap[] = {
|
||||
{0x07, "nvme_host_telemetry.bin"},
|
||||
{0x08, "nvme_cntrl_telemetry.bin"},
|
||||
{0x07, "nvmetelemetrylog.bin"},
|
||||
{0x08, "nvmetelemetrylog.bin"},
|
||||
};
|
||||
|
||||
for(i = 0; i < (int)(sizeof(tmap)/sizeof(tmap[0])); i++) {
|
||||
err = micron_telemetry_log(fd, 0, tmap[i].log, &buffer, &logSize, 0);
|
||||
err = micron_telemetry_log(fd, (tmap[i].log == 0x07),
|
||||
tmap[i].log, &buffer, &logSize, 0);
|
||||
if (err == 0 && logSize > 0 && buffer != NULL) {
|
||||
sprintf(msg, "telemetry log: 0x%X", tmap[i].log);
|
||||
WriteData(buffer, logSize, dir, tmap[i].file, msg);
|
||||
|
@ -1646,7 +1735,7 @@ static int GetFeatureSettings(int fd, const char *dir)
|
|||
bufp = NULL;
|
||||
}
|
||||
|
||||
err = nvme_get_feature(fd, 1, fmap[i].id, 0, 0x0, len, bufp, &attrVal);
|
||||
err = nvme_get_feature(fd, 1, fmap[i].id, 0, 0x0, 0, len, bufp, &attrVal);
|
||||
if (err == 0) {
|
||||
sprintf(msg, "feature: 0x%X", fmap[i].id);
|
||||
WriteData((__u8*)&attrVal, sizeof(attrVal), dir, fmap[i].file, msg);
|
||||
|
@ -1654,7 +1743,8 @@ static int GetFeatureSettings(int fd, const char *dir)
|
|||
WriteData(bufp, len, dir, fmap[i].file, msg);
|
||||
}
|
||||
} else {
|
||||
printf("Failed to retrieve feature 0x%x data !\n", fmap[i].id);
|
||||
fprintf(stderr, "Feature 0x%x data not retrieved, error %d (ignored)!\n",
|
||||
fmap[i].id, err);
|
||||
errcnt++;
|
||||
}
|
||||
}
|
||||
|
@ -1667,20 +1757,98 @@ static int micron_drive_info(int argc, char **argv, struct command *cmd,
|
|||
const char *desc = "Get drive HW information";
|
||||
int fd, err = 0;
|
||||
struct nvme_id_ctrl ctrl = { 0 };
|
||||
struct nvme_admin_cmd admin_cmd = { 0 };
|
||||
struct fb_drive_info {
|
||||
unsigned char hw_ver_major;
|
||||
unsigned char hw_ver_minor;
|
||||
unsigned char ftl_unit_size;
|
||||
unsigned char bs_ver_major;
|
||||
unsigned char bs_ver_minor;
|
||||
} dinfo = { 0 };
|
||||
eDriveModel model = UNKNOWN_MODEL;
|
||||
bool is_json = false;
|
||||
struct json_object *root, *driveInfo;
|
||||
struct format {
|
||||
char *fmt;
|
||||
};
|
||||
|
||||
const char *fmt = "output format normal";
|
||||
struct format cfg = {
|
||||
.fmt = "normal",
|
||||
};
|
||||
|
||||
OPT_ARGS(opts) = {
|
||||
OPT_FMT("format", 'f', &cfg.fmt, fmt),
|
||||
OPT_END()
|
||||
};
|
||||
|
||||
if ((fd = micron_parse_options(argc, argv, desc, opts, NULL)) < 0)
|
||||
if ((fd = micron_parse_options(argc, argv, desc, opts, &model)) < 0)
|
||||
return err;
|
||||
|
||||
err = nvme_identify_ctrl(fd, &ctrl);
|
||||
if (err) {
|
||||
fprintf(stderr, "ERROR : nvme_identify_ctrl() failed with 0x%x\n", err);
|
||||
if (model == UNKNOWN_MODEL) {
|
||||
fprintf(stderr, "ERROR : Unsupported drive for vs-drive-info cmd");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("%u.%u\n", ctrl.vs[820], ctrl.vs[821]);
|
||||
if (strcmp(cfg.fmt, "json") == 0)
|
||||
is_json = true;
|
||||
|
||||
if (model == M5407) {
|
||||
admin_cmd.opcode = 0xDA,
|
||||
admin_cmd.addr = (__u64) (uintptr_t) &dinfo;
|
||||
admin_cmd.data_len = (__u32)sizeof(dinfo);
|
||||
admin_cmd.cdw12 = 3;
|
||||
err = ioctl(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
|
||||
if (err) {
|
||||
fprintf(stderr, "ERROR : drive-info opcode failed with 0x%x\n", err);
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
err = nvme_identify_ctrl(fd, &ctrl);
|
||||
if (err) {
|
||||
fprintf(stderr, "ERROR : identify_ctrl() failed with 0x%x\n", err);
|
||||
return -1;
|
||||
}
|
||||
dinfo.hw_ver_major = ctrl.vs[820];
|
||||
dinfo.hw_ver_minor = ctrl.vs[821];
|
||||
}
|
||||
|
||||
if (is_json) {
|
||||
struct json_object *pinfo = json_create_object();
|
||||
char tempstr[64] = { 0 };
|
||||
root = json_create_object();
|
||||
driveInfo = json_create_array();
|
||||
json_object_add_value_array(root, "Micron Drive HW Information", driveInfo);
|
||||
sprintf(tempstr, "%hhu.%hhu", dinfo.hw_ver_major, dinfo.hw_ver_minor);
|
||||
json_object_add_value_string(pinfo, "Drive Hardware Version", tempstr);
|
||||
|
||||
if (dinfo.ftl_unit_size) {
|
||||
sprintf(tempstr, "%hhu KB", dinfo.ftl_unit_size);
|
||||
json_object_add_value_string(pinfo, "FTL_unit_size", tempstr);
|
||||
}
|
||||
|
||||
if (dinfo.bs_ver_major != 0 || dinfo.bs_ver_minor != 0) {
|
||||
sprintf(tempstr, "%hhu.%hhu", dinfo.bs_ver_major, dinfo.bs_ver_minor);
|
||||
json_object_add_value_string(pinfo, "Boot Spec.Version", tempstr);
|
||||
}
|
||||
|
||||
json_array_add_value_object(driveInfo, pinfo);
|
||||
json_print_object(root, NULL);
|
||||
printf("\n");
|
||||
json_free_object(root);
|
||||
} else {
|
||||
printf("Drive Hardware Version: %hhu.%hhu\n",
|
||||
dinfo.hw_ver_major, dinfo.hw_ver_minor);
|
||||
|
||||
if (dinfo.ftl_unit_size)
|
||||
printf("FTL_unit_size: %hhu KB\n", dinfo.ftl_unit_size);
|
||||
|
||||
if (dinfo.bs_ver_major != 0 || dinfo.bs_ver_minor != 0) {
|
||||
printf("Boot Spec.Version: %hhu.%hhu\n",
|
||||
dinfo.bs_ver_major, dinfo.bs_ver_minor);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1825,8 +1993,7 @@ static int micron_fw_activation_history(int argc, char **argv, struct command *c
|
|||
int count = 0;
|
||||
unsigned int logC2[C2_log_size/sizeof(int)] = { 0 };
|
||||
eDriveModel eModel = UNKNOWN_MODEL;
|
||||
struct nvme_id_ctrl ctrl;
|
||||
int fd, err, ctrlIdx;
|
||||
int fd, err;
|
||||
struct format {
|
||||
char *fmt;
|
||||
};
|
||||
|
@ -1841,9 +2008,7 @@ static int micron_fw_activation_history(int argc, char **argv, struct command *c
|
|||
OPT_END()
|
||||
};
|
||||
|
||||
fd = parse_and_open(argc, argv, desc, opts);
|
||||
if (fd < 0) {
|
||||
printf("\nDevice not found \n");;
|
||||
if ((fd = micron_parse_options(argc, argv, desc, opts, &eModel)) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -1853,16 +2018,8 @@ static int micron_fw_activation_history(int argc, char **argv, struct command *c
|
|||
return -1;
|
||||
}
|
||||
|
||||
err = nvme_identify_ctrl(fd, &ctrl);
|
||||
if (err) {
|
||||
fprintf(stderr, "failed get device identification data, error: %x\n", err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* check if product supports fw_history log */
|
||||
err = -EINVAL;
|
||||
sscanf(argv[optind], "/dev/nvme%d", &ctrlIdx);
|
||||
eModel = GetDriveModel(ctrlIdx);
|
||||
if (eModel != M51CX) {
|
||||
fprintf(stderr, "Unsupported drive model for vs-fw-activate-history command\n");
|
||||
goto out;
|
||||
|
@ -1916,18 +2073,19 @@ static int micron_error_reason(int argc, char **argv, struct command *cmd,
|
|||
static int micron_ocp_smart_health_logs(int argc, char **argv, struct command *cmd,
|
||||
struct plugin *plugin)
|
||||
{
|
||||
const char *desc = "Retrieve Micron OCP Smart Health log for the given device ";
|
||||
const char *desc = "Retrieve Smart or Extended Smart Health log for the given device ";
|
||||
unsigned int logC0[C0_log_size/sizeof(int)] = { 0 };
|
||||
eDriveModel eModel = UNKNOWN_MODEL;
|
||||
unsigned int logFB[FB_log_size/sizeof(int)] = { 0 };
|
||||
struct nvme_id_ctrl ctrl;
|
||||
int fd, err, ctrlIdx;
|
||||
bool is_json = false;
|
||||
eDriveModel eModel = UNKNOWN_MODEL;
|
||||
int fd, err = 0;
|
||||
bool is_json = true;
|
||||
struct format {
|
||||
char *fmt;
|
||||
};
|
||||
const char *fmt = "output format normal|json";
|
||||
struct format cfg = {
|
||||
.fmt = "normal",
|
||||
.fmt = "json",
|
||||
};
|
||||
|
||||
OPT_ARGS(opts) = {
|
||||
|
@ -1935,41 +2093,53 @@ static int micron_ocp_smart_health_logs(int argc, char **argv, struct command *c
|
|||
OPT_END()
|
||||
};
|
||||
|
||||
fd = parse_and_open(argc, argv, desc, opts);
|
||||
if (fd < 0) {
|
||||
printf("\nDevice not found \n");;
|
||||
if ((fd = micron_parse_options(argc, argv, desc, opts, &eModel)) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (strcmp(cfg.fmt, "json") == 0)
|
||||
is_json = true;
|
||||
if (strcmp(cfg.fmt, "normal") == 0)
|
||||
is_json = false;
|
||||
|
||||
err = nvme_identify_ctrl(fd, &ctrl);
|
||||
if (err)
|
||||
/* For M5410 and M5407, this option prints 0xFB log page */
|
||||
if (eModel == M5410 || eModel == M5407) {
|
||||
__u8 spec = (eModel == M5410) ? 0 : 1;
|
||||
__u8 nsze;
|
||||
|
||||
if ((err = nvme_identify_ctrl(fd, &ctrl)) == 0)
|
||||
err = nvme_get_log(fd, NVME_NSID_ALL, 0xFB, false, NVME_NO_LOG_LSP,
|
||||
FB_log_size, logFB);
|
||||
if (err) {
|
||||
if (err < 0)
|
||||
printf("Unable to retrieve smart log 0xFB for the drive\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
nsze = (ctrl.vs[987] == 0x12);
|
||||
if (nsze == 0 && nsze_from_oacs)
|
||||
nsze = ((ctrl.oacs >> 3) & 0x1);
|
||||
print_nand_stats_fb((__u8 *)logFB, NULL, nsze, is_json, spec);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* pull log details based on the model name */
|
||||
sscanf(argv[optind], "/dev/nvme%d", &ctrlIdx);
|
||||
if ((eModel = GetDriveModel(ctrlIdx)) == UNKNOWN_MODEL) {
|
||||
/* check for models that support 0xC0 log */
|
||||
if (eModel != M51CX) {
|
||||
printf ("Unsupported drive model for vs-smart-add-log commmand\n");
|
||||
close(fd);
|
||||
err = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* should check for firmware version if this log is supported or not */
|
||||
if (eModel == M5407 || eModel == M5410) {
|
||||
err = nvme_get_log(fd, NVME_NSID_ALL, 0xC0, false, NVME_NO_LOG_LSP,
|
||||
C0_log_size, logC0);
|
||||
}
|
||||
if (err < 0) {
|
||||
printf("Unable to retrieve extended smart log for the drive\n");
|
||||
err = -ENOTTY;
|
||||
} else {
|
||||
err = nvme_get_log(fd, NVME_NSID_ALL, 0xC0, false, NVME_NO_LOG_LSP,
|
||||
C0_log_size, logC0);
|
||||
if (err == 0) {
|
||||
print_smart_cloud_health_log((__u8 *)logC0, is_json);
|
||||
} else if (err < 0) {
|
||||
printf("Unable to retrieve extended smart log 0xC0 for the drive\n");
|
||||
}
|
||||
out:
|
||||
close(fd);
|
||||
return err;
|
||||
if (err > 0)
|
||||
nvme_show_status(err);
|
||||
return nvme_status_to_errno(err, false);
|
||||
}
|
||||
|
||||
static int micron_clr_fw_activation_history(int argc, char **argv,
|
||||
|
@ -1994,7 +2164,7 @@ static int micron_clr_fw_activation_history(int argc, char **argv,
|
|||
}
|
||||
|
||||
//err = nvme_set_feature(fd, 1, fid, cdw11, 0, opt.save, 0, 0, &result);
|
||||
err = nvme_set_feature(fd, 1, fid, 0, 0, 0, 0, 0, &result);
|
||||
err = nvme_set_feature(fd, 1, fid, 0, 0, 0, 0, 0, 0, &result);
|
||||
if (err == 0) err = (int)result;
|
||||
return err;
|
||||
}
|
||||
|
@ -2040,14 +2210,14 @@ static int micron_telemetry_cntrl_option(int argc, char **argv,
|
|||
}
|
||||
|
||||
if (!strcmp(opt.option, "enable")) {
|
||||
err = nvme_set_feature(fd, 1, fid, 1, 0, (opt.select & 0x1), 0, 0, &result);
|
||||
err = nvme_set_feature(fd, 1, fid, 1, 0, (opt.select & 0x1), 0, 0, 0, &result);
|
||||
if (err == 0) {
|
||||
printf("successfully set controller telemetry option\n");
|
||||
} else {
|
||||
printf("Failed to set controller telemetry option\n");
|
||||
}
|
||||
} else if (!strcmp(opt.option, "disable")) {
|
||||
err = nvme_set_feature(fd, 1, fid, 0, 0, (opt.select & 0x1), 0, 0, &result);
|
||||
err = nvme_set_feature(fd, 1, fid, 0, 0, (opt.select & 0x1), 0, 0, 0, &result);
|
||||
if (err == 0) {
|
||||
printf("successfully disabled controller telemetry option\n");
|
||||
} else {
|
||||
|
@ -2055,7 +2225,7 @@ static int micron_telemetry_cntrl_option(int argc, char **argv,
|
|||
}
|
||||
} else if (!strcmp(opt.option, "status")) {
|
||||
opt.select &= 0x3;
|
||||
err = nvme_get_feature(fd, 1, fid, opt.select, 0, 0, 0, &result);
|
||||
err = nvme_get_feature(fd, 1, fid, opt.select, 0, 0, 0, 0, &result);
|
||||
if (err == 0) {
|
||||
printf("Controller telemetry option : %s\n",
|
||||
(result) ? "enabled" : "disabled");
|
||||
|
@ -2249,6 +2419,7 @@ static int micron_internal_logs(int argc, char **argv, struct command *cmd,
|
|||
|
||||
GetSmartlogData(fd, strCtrlDirName);
|
||||
GetErrorlogData(fd, ctrl.elpe, strCtrlDirName);
|
||||
GetGenericLogs(fd, strCtrlDirName);
|
||||
|
||||
// pull if telemetry log data is supported
|
||||
if ((ctrl.lpa & 0x8) == 0x8)
|
||||
|
@ -2256,7 +2427,7 @@ static int micron_internal_logs(int argc, char **argv, struct command *cmd,
|
|||
|
||||
GetFeatureSettings(fd, strCtrlDirName);
|
||||
|
||||
if (eModel != M5410) {
|
||||
if (eModel != M5410 && eModel != M5407) {
|
||||
memcpy(aVendorLogs, aM51XXLogs, sizeof(aM51XXLogs));
|
||||
if (eModel == M51AX)
|
||||
memcpy((char *)aVendorLogs + sizeof(aM51XXLogs), aM51AXLogs, sizeof(aM51AXLogs));
|
||||
|
|
|
@ -6,8 +6,9 @@
|
|||
|
||||
#include "cmd.h"
|
||||
|
||||
PLUGIN(NAME("micron", "Micron vendor specific extensions"),
|
||||
COMMAND_LIST(ENTRY("select-download", "Selective Firmware Download", micron_selective_download)
|
||||
PLUGIN(NAME("micron", "Micron vendor specific extensions", NVME_VERSION),
|
||||
COMMAND_LIST(
|
||||
ENTRY("select-download", "Selective Firmware Download", micron_selective_download)
|
||||
ENTRY("vs-temperature-stats", "Retrieve Micron temperature statistics ", micron_temp_stats)
|
||||
ENTRY("vs-pcie-stats", "Retrieve Micron PCIe error stats", micron_pcie_stats)
|
||||
ENTRY("clear-pcie-correctable-errors", "Clear correctable PCIe errors", micron_clear_pcie_correctable_errors)
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
#include "cmd.h"
|
||||
|
||||
PLUGIN(NAME("netapp", "NetApp vendor specific extensions"),
|
||||
PLUGIN(NAME("netapp", "NetApp vendor specific extensions", NVME_VERSION),
|
||||
COMMAND_LIST(
|
||||
ENTRY("smdevices", "NetApp SMdevices", netapp_smdevices)
|
||||
ENTRY("ontapdevices", "NetApp ONTAPdevices", netapp_ontapdevices)
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
#include "cmd.h"
|
||||
|
||||
PLUGIN(NAME("nvidia", "NVIDIA vendor specific extensions"),
|
||||
PLUGIN(NAME("nvidia", "NVIDIA vendor specific extensions", NVME_VERSION),
|
||||
COMMAND_LIST(
|
||||
ENTRY("id-ctrl", "Send NVMe Identify Controller", id_ctrl)
|
||||
)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue