1
0
Fork 0

Merging upstream version 1.15.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-16 12:11:43 +01:00
parent 14665a711e
commit d975eb29d0
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
116 changed files with 6031 additions and 2284 deletions

View file

@ -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

View file

@ -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=&lt;prefill&gt; | -p &lt;prefill&gt;]</pre>
[--prefill=&lt;prefill&gt; | -p &lt;prefill&gt;]
[--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>

View file

@ -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

View 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

View 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">
/*<![CDATA[*/
var asciidoc = { // Namespace.
/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////
/* Author: Mihai Bazon, September 2002
* http://students.infoiasi.ro/~mishoo
*
* Table Of Content generator
* Version: 0.4
*
* Feel free to use this script under the terms of the GNU General Public
* License, as long as you do not remove or alter this notice.
*/
/* modified by Troy D. Hanson, September 2006. License: GPL */
/* modified by Stuart Rackham, 2006, 2009. License: GPL */
// toclevels = 1..4.
toc: function (toclevels) {
function getText(el) {
var text = "";
for (var i = el.firstChild; i != null; i = i.nextSibling) {
if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
text += i.data;
else if (i.firstChild != null)
text += getText(i);
}
return text;
}
function TocEntry(el, text, toclevel) {
this.element = el;
this.text = text;
this.toclevel = toclevel;
}
function tocEntries(el, toclevels) {
var result = new Array;
var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
// 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> &lt;device&gt; [--operation=&lt;operation&gt; | -o &lt;operation&gt;]
[--element-id=&lt;element-id&gt; | -i &lt;element-id&gt;]
[--cap-lower=&lt;cap-lower&gt; | -l &lt;cap-lower&gt;]
[--cap-upper=&lt;cap-upper&gt; | -u &lt;cap-upper&gt;]</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 &lt;device&gt; 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 &lt;operation&gt;
</dt>
<dt class="hdlist1">
--operation=&lt;operation&gt;
</dt>
<dd>
<p>
Operation to be performed by the controller
</p>
</dd>
<dt class="hdlist1">
-i &lt;element-id&gt;
</dt>
<dt class="hdlist1">
--element-id=&lt;element-id&gt;
</dt>
<dd>
<p>
Value specific to the value of the Operation field.
</p>
</dd>
<dt class="hdlist1">
-l &lt;cap-lower&gt;
</dt>
<dt class="hdlist1">
--cap-lower=&lt;cap-lower&gt;
</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 &lt;cap-upper&gt;
</dt>
<dt class="hdlist1">
--cap-upper=&lt;cap-upper&gt;
</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>

View 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

View file

@ -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\&.

View file

@ -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=&lt;dsm&gt; | -D &lt;dsm&gt;]
[--show-command | -v]
[--dry-run | -w]
[--latency | -t]</pre>
[--latency | -t]
[--storage-tag-check&lt;storage-tag-check&gt; | -C &lt;storage-tag-check&gt;]</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=&lt;storage-tag-check&gt;
</dt>
<dt class="hdlist1">
-C &lt;storage-tag-check&gt;
</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>

View file

@ -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.

View file

@ -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>::

View file

@ -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

View file

@ -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.

View file

@ -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

View file

@ -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> &lt;device&gt; [--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;]
[--feature-id=&lt;fid&gt; | -f &lt;fid&gt;] [--cdw11=&lt;cdw11&gt;]
[--uuid-index=&lt;uuid-index&gt; | -U &lt;uuid_index&gt;]
[--data-len=&lt;data-len&gt; | -l &lt;data-len&gt;]
[--sel=&lt;select&gt; | -s &lt;select&gt;]
[--raw-binary | -b]
@ -847,6 +851,17 @@ cellspacing="0" cellpadding="4">
</div>
</dd>
<dt class="hdlist1">
-U &lt;uuid-index&gt;
</dt>
<dt class="hdlist1">
--uuid-index=&lt;uuid-index&gt;
</dt>
<dd>
<p>
UUID Index of the feature
</p>
</dd>
<dt class="hdlist1">
-l &lt;data-len&gt;
</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>

View file

@ -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
|47|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

View 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

View 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">
/*<![CDATA[*/
var asciidoc = { // Namespace.
/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////
/* Author: Mihai Bazon, September 2002
* http://students.infoiasi.ro/~mishoo
*
* Table Of Content generator
* Version: 0.4
*
* Feel free to use this script under the terms of the GNU General Public
* License, as long as you do not remove or alter this notice.
*/
/* modified by Troy D. Hanson, September 2006. License: GPL */
/* modified by Stuart Rackham, 2006, 2009. License: GPL */
// toclevels = 1..4.
toc: function (toclevels) {
function getText(el) {
var text = "";
for (var i = el.firstChild; i != null; i = i.nextSibling) {
if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
text += i.data;
else if (i.firstChild != null)
text += getText(i);
}
return text;
}
function TocEntry(el, text, toclevel) {
this.element = el;
this.text = text;
this.toclevel = toclevel;
}
function tocEntries(el, toclevels) {
var result = new Array;
var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
// 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> &lt;device&gt; [--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;]
[--start-lba=&lt;slba&gt; | -s &lt;slba&gt;]
[--max-dw=&lt;max-dw&gt; | -m &lt;max-dw&gt;]
[--action=&lt;action-type&gt; | -a &lt;action-type&gt;]
[--range-len=&lt;range-len&gt; | -l &lt;range-len&gt;]
[--timeout=&lt;timeout&gt; | -t &lt;timeout&gt; ]
[--output-format=&lt;format&gt; | -o &lt;format&gt;]</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 &lt;device&gt; 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 &lt;nsid&gt;
</dt>
<dt class="hdlist1">
--namespace-id=&lt;nsid&gt;
</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 &lt;slba&gt;
</dt>
<dt class="hdlist1">
--start-lba=&lt;slba&gt;
</dt>
<dd>
<p>
Starting LBA(SLBA) in 64-bit address of the first logical block addressed
</p>
</dd>
<dt class="hdlist1">
-m &lt;max-dw&gt;
</dt>
<dt class="hdlist1">
--max-dw=&lt;max-dw&gt;
</dt>
<dd>
<p>
Maximum Number of Dwords(MNDW) specifies maximum number of dwords to return
</p>
</dd>
<dt class="hdlist1">
-a &lt;action-type&gt;
</dt>
<dt class="hdlist1">
--action=&lt;action-type&gt;
</dt>
<dd>
<p>
Action Type(ATYPE) specifies the mechanism it uses in determining the LBA Status Descriptors.
</p>
</dd>
<dt class="hdlist1">
-l &lt;range-len&gt;
</dt>
<dt class="hdlist1">
--range-len=&lt;range-len&gt;
</dt>
<dd>
<p>
Range Length(RL) specifies the length of the range of contiguous LBAs beginning at SLBA
</p>
</dd>
<dt class="hdlist1">
-t &lt;timeout&gt;
</dt>
<dt class="hdlist1">
--timeout=&lt;timeout&gt;
</dt>
<dd>
<p>
Override default timeout value. In milliseconds.
</p>
</dd>
<dt class="hdlist1">
-o &lt;format&gt;
</dt>
<dt class="hdlist1">
--output-format=&lt;format&gt;
</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>

View 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

View file

@ -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

View file

@ -750,13 +750,16 @@ nvme-get-log(1) Manual Page
<div class="sectionbody">
<div class="verseblock">
<pre class="content"><em>nvme get-log</em> &lt;device&gt; [--log-id=&lt;log-id&gt; | -i &lt;log-id&gt;]
[--log-len=&lt;log-len&gt; | -l &lt;log-len&gt;]
[--aen=&lt;aen&gt; | -a &lt;aen&gt;]
[--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;]
[--raw-binary | -b]
[--lpo=&lt;offset&gt; | -o &lt;offset&gt;]
[--lsp=&lt;field&gt; | -s &lt;field&gt;]
[--rae | -r]</pre>
[--log-len=&lt;log-len&gt; | -l &lt;log-len&gt;]
[--aen=&lt;aen&gt; | -a &lt;aen&gt;]
[--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;]
[--raw-binary | -b]
[--lpo=&lt;offset&gt; | -o &lt;offset&gt;]
[--lsp=&lt;field&gt; | -s &lt;field&gt;]
[--lsi=&lt;field&gt; | -S &lt;field&gt;]
[--rae | -r]
[--csi=&lt;command_set_identifier&gt; | -y &lt;command_set_identifier&gt;]
[--ot | -O]</pre>
<div class="attribution">
</div></div>
</div>
@ -864,6 +867,17 @@ program to parse.</p></div>
</p>
</dd>
<dt class="hdlist1">
-S &lt;field&gt;
</dt>
<dt class="hdlist1">
--lsi=&lt;field&gt;
</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 &lt;command_set_identifier&gt;
</dt>
<dt class="hdlist1">
--csi=&lt;command_set_identifier&gt;
</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>

View file

@ -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

View 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

View 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">
/*<![CDATA[*/
var asciidoc = { // Namespace.
/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////
/* Author: Mihai Bazon, September 2002
* http://students.infoiasi.ro/~mishoo
*
* Table Of Content generator
* Version: 0.4
*
* Feel free to use this script under the terms of the GNU General Public
* License, as long as you do not remove or alter this notice.
*/
/* modified by Troy D. Hanson, September 2006. License: GPL */
/* modified by Stuart Rackham, 2006, 2009. License: GPL */
// toclevels = 1..4.
toc: function (toclevels) {
function getText(el) {
var text = "";
for (var i = el.firstChild; i != null; i = i.nextSibling) {
if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
text += i.data;
else if (i.firstChild != null)
text += getText(i);
}
return text;
}
function TocEntry(el, text, toclevel) {
this.element = el;
this.text = text;
this.toclevel = toclevel;
}
function tocEntries(el, toclevels) {
var result = new Array;
var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
// 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> &lt;device&gt; [--dom-id=&lt;domian_id&gt; | -d &lt;domian_id&gt;]
[-o &lt;fmt&gt; | --output-format=&lt;fmt&gt;]</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 &lt;device&gt; 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 &lt;domian_id&gt;
</dt>
<dt class="hdlist1">
--dom-id=&lt;domian_id&gt;
</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 &lt;format&gt;
</dt>
<dt class="hdlist1">
--output-format=&lt;format&gt;
</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>

View 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

View file

@ -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

View file

@ -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> &lt;device&gt; [--controller-id=&lt;cntid&gt; | -c &lt;cntid&gt;]</pre>
<pre class="content"><em>nvme id-iocs</em> &lt;device&gt; [--controller-id=&lt;cntid&gt; | -c &lt;cntid&gt;]
[-o &lt;fmt&gt; | --output-format=&lt;fmt&gt;]</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 &lt;format&gt;
</dt>
<dt class="hdlist1">
--output-format=&lt;format&gt;
</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>

View file

@ -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

View file

@ -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

View file

@ -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=&lt;prefill&gt; | -p &lt;prefill&gt;]</pre>
[--prefill=&lt;prefill&gt; | -p &lt;prefill&gt;]
[--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>

View file

@ -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
--------

View file

@ -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\&.

View file

@ -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> &lt;device&gt; [--cntid=&lt;cntid&gt; | -c &lt;cntid&gt;]
[--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;]
[--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;] [-o &lt;fmt&gt; | --output-format=&lt;fmt&gt;]
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 &lt;format&gt;
</dt>
<dt class="hdlist1">
--output-format=&lt;format&gt;
</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>

View file

@ -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.

View file

@ -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

View file

@ -751,7 +751,7 @@ nvme-id-ns(1) Manual Page
<div class="verseblock">
<pre class="content"><em>nvme list-ns</em> &lt;device&gt; [--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;]
[--csi=&lt;command_set_identifier&gt; | -y &lt;command_set_identifier&gt;]
[--all | -a]</pre>
[--all | -a] [--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;]</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 &lt;format&gt;
</dt>
<dt class="hdlist1">
--output-format=&lt;format&gt;
</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>

View file

@ -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
----

View 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

View 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">
/*<![CDATA[*/
var asciidoc = { // Namespace.
/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////
/* Author: Mihai Bazon, September 2002
* http://students.infoiasi.ro/~mishoo
*
* Table Of Content generator
* Version: 0.4
*
* Feel free to use this script under the terms of the GNU General Public
* License, as long as you do not remove or alter this notice.
*/
/* modified by Troy D. Hanson, September 2006. License: GPL */
/* modified by Stuart Rackham, 2006, 2009. License: GPL */
// toclevels = 1..4.
toc: function (toclevels) {
function getText(el) {
var text = "";
for (var i = el.firstChild; i != null; i = i.nextSibling) {
if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
text += i.data;
else if (i.firstChild != null)
text += getText(i);
}
return text;
}
function TocEntry(el, text, toclevel) {
this.element = el;
this.text = text;
this.toclevel = toclevel;
}
function tocEntries(el, toclevels) {
var result = new Array;
var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
// 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> &lt;device&gt; -f &lt;json|normal&gt;</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 &lt;device&gt; 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 &lt;json|normal&gt; 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>

View 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

View 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

View 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">
/*<![CDATA[*/
var asciidoc = { // Namespace.
/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////
/* Author: Mihai Bazon, September 2002
* http://students.infoiasi.ro/~mishoo
*
* Table Of Content generator
* Version: 0.4
*
* Feel free to use this script under the terms of the GNU General Public
* License, as long as you do not remove or alter this notice.
*/
/* modified by Troy D. Hanson, September 2006. License: GPL */
/* modified by Stuart Rackham, 2006, 2009. License: GPL */
// toclevels = 1..4.
toc: function (toclevels) {
function getText(el) {
var text = "";
for (var i = el.firstChild; i != null; i = i.nextSibling) {
if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
text += i.data;
else if (i.firstChild != null)
text += getText(i);
}
return text;
}
function TocEntry(el, text, toclevel) {
this.element = el;
this.text = text;
this.toclevel = toclevel;
}
function tocEntries(el, toclevels) {
var result = new Array;
var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
// 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> &lt;device&gt; [-o &lt;format&gt; | --output-format=&lt;format&gt;]</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 &lt;device&gt; 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 &lt;format&gt;
</dt>
<dt class="hdlist1">
--output-format=&lt;format&gt;
</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>

View 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

View file

@ -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\&.

View file

@ -766,7 +766,8 @@ nvme-read(1) Manual Page
[--dsm=&lt;dsm&gt; | -D &lt;dsm&gt;]
[--show-command | -v]
[--dry-run | -w]
[--latency | -t]</pre>
[--latency | -t]
[--storage-tag-check&lt;storage-tag-check&gt; | -C &lt;storage-tag-check&gt;]</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=&lt;storage-tag-check&gt;
</dt>
<dt class="hdlist1">
-C &lt;storage-tag-check&gt;
</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>

View file

@ -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.

View file

@ -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

View file

@ -861,7 +861,7 @@ a power loss.</p></td>
</div>
</dd>
<dt class="hdlist1">
-a &lt;rrega&gt;
-r &lt;rrega&gt;
</dt>
<dt class="hdlist1">
--rrega=&lt;rrega&gt;

View file

@ -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.

View file

@ -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

View file

@ -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> &lt;device&gt; [--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;]
[--feature-id=&lt;fid&gt; | -f &lt;fid&gt;] [--value=&lt;value&gt; | -v &lt;value&gt;]
[--uuid-index=&lt;uuid-index&gt; | -U &lt;uuid_index&gt;]
[--data-len=&lt;data-len&gt; | -l &lt;data-len&gt;]
[--data=&lt;data-file&gt; | -d &lt;data-file&gt;]
[--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 &lt;uuid-index&gt;
</dt>
<dt class="hdlist1">
--uuid-index=&lt;uuid-index&gt;
</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>

View file

@ -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
View 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

View 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">
/*<![CDATA[*/
var asciidoc = { // Namespace.
/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////
/* Author: Mihai Bazon, September 2002
* http://students.infoiasi.ro/~mishoo
*
* Table Of Content generator
* Version: 0.4
*
* Feel free to use this script under the terms of the GNU General Public
* License, as long as you do not remove or alter this notice.
*/
/* modified by Troy D. Hanson, September 2006. License: GPL */
/* modified by Stuart Rackham, 2006, 2009. License: GPL */
// toclevels = 1..4.
toc: function (toclevels) {
function getText(el) {
var text = "";
for (var i = el.firstChild; i != null; i = i.nextSibling) {
if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
text += i.data;
else if (i.firstChild != null)
text += getText(i);
}
return text;
}
function TocEntry(el, text, toclevel) {
this.element = el;
this.text = text;
this.toclevel = toclevel;
}
function tocEntries(el, toclevels) {
var result = new Array;
var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
// 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> &lt;device&gt; [--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;]
[--start-block=&lt;slba&gt; | -s &lt;slba&gt;]
[--block-count=&lt;nlb&gt; | -c &lt;nlb&gt;]
[--limited-retry | -l]
[--force-unit-access | -f]
[--prinfo=&lt;prinfo&gt; | -p &lt;prinfo&gt;]
[--ref-tag=&lt;reftag&gt; | -r &lt;reftag&gt;]
[--app-tag-mask=&lt;appmask&gt; | -m &lt;appmask&gt;]
[--app-tag=&lt;apptag&gt; | -a &lt;apptag&gt;]
[--storage-tag&lt;storage-tag&gt; | -S &lt;storage-tag&gt;]
[--storage-tag-check&lt;storage-tag-check&gt; | -C &lt;storage-tag-check&gt;]</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=&lt;nsid&gt;
</dt>
<dt class="hdlist1">
-n &lt;nsid&gt;
</dt>
<dd>
<p>
Namespace ID use in the command.
</p>
</dd>
<dt class="hdlist1">
--start-block=&lt;slba&gt;
</dt>
<dt class="hdlist1">
-s &lt;slba&gt;
</dt>
<dd>
<p>
Start block address.
</p>
</dd>
<dt class="hdlist1">
--block-count=&lt;nlb&gt;
</dt>
<dt class="hdlist1">
-c &lt;nlb&gt;
</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=&lt;prinfo&gt;
</dt>
<dt class="hdlist1">
-p &lt;prinfo&gt;
</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&#8217;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=&lt;reftag&gt;
</dt>
<dt class="hdlist1">
-r &lt;reftag&gt;
</dt>
<dd>
<p>
Optional reftag when used with protection information.
</p>
</dd>
<dt class="hdlist1">
--app-tag-mask=&lt;appmask&gt;
</dt>
<dt class="hdlist1">
-m &lt;appmask&gt;
</dt>
<dd>
<p>
Optional application tag mask when used with protection information.
</p>
</dd>
<dt class="hdlist1">
--app-tag=&lt;apptag&gt;
</dt>
<dt class="hdlist1">
-a &lt;apptag&gt;
</dt>
<dd>
<p>
Optional application tag when used with protection information.
</p>
</dd>
<dt class="hdlist1">
--storage-tag=&lt;storage-tag&gt;
</dt>
<dt class="hdlist1">
-S &lt;storage-tag&gt;
</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=&lt;storage-tag-check&gt;
</dt>
<dt class="hdlist1">
-C &lt;storage-tag-check&gt;
</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>

View 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

View file

@ -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

View file

@ -758,7 +758,9 @@ nvme-zeroes(1) Manual Page
[--deac | -d]
[--limited-retry | -l]
[--force-unit-access | -f]
[--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;]</pre>
[--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;]
[--storage-tag&lt;storage-tag&gt; | -S &lt;storage-tag&gt;]
[--storage-tag-check&lt;storage-tag-check&gt; | -C &lt;storage-tag-check&gt;]</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=&lt;storage-tag&gt;
</dt>
<dt class="hdlist1">
-n &lt;storage-tag&gt;
</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=&lt;storage-tag-check&gt;
</dt>
<dt class="hdlist1">
-C &lt;storage-tag-check&gt;
</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>

View file

@ -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.

View file

@ -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\&.

View file

@ -766,7 +766,8 @@ nvme-write(1) Manual Page
[--dsm=&lt;dsm&gt; | -D &lt;dsm&gt;]
[--show-command | -v]
[--dry-run | -w]
[--latency | -t]</pre>
[--latency | -t]
[--storage-tag-check&lt;storage-tag-check&gt; | -C &lt;storage-tag-check&gt;]</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=&lt;storage-tag-check&gt;
</dt>
<dt class="hdlist1">
-C &lt;storage-tag-check&gt;
</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>

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -1,7 +1,7 @@
#!/bin/sh
GVF=NVME-VERSION-FILE
DEF_VER=v1.14
DEF_VER=v1.15
LF='
'

View file

@ -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...)

View file

@ -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

View file

@ -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
View file

@ -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);

View file

@ -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;

View file

@ -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 */

View file

@ -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)

View file

@ -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)

View file

@ -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);

View file

@ -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,

File diff suppressed because it is too large Load diff

View file

@ -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,

View file

@ -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) \

View file

@ -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;

1069
nvme.c

File diff suppressed because it is too large Load diff

9
nvme.h
View file

@ -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 */

View file

@ -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]

View file

@ -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;

View file

@ -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;

View file

@ -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)
)

View file

@ -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")
)

View file

@ -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)

View file

@ -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) {

View file

@ -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)

View file

@ -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)

View file

@ -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",

View file

@ -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)

View file

@ -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));

View file

@ -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)

View file

@ -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)

View file

@ -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