From d2082ee94267e4ca59b187c5e37dac03c1d65187 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Tue, 31 Jan 2023 05:13:03 +0100 Subject: Merging upstream version 2.3. Signed-off-by: Daniel Baumann --- .github/AppImageBuilder.yml | 60 + .github/azure-pipelines.yml | 35 + .github/workflows/appimage.yml | 33 + .github/workflows/build.yml | 118 ++ .github/workflows/meson.yml | 121 -- .github/workflows/release.yml | 4 +- .gitignore | 4 +- Documentation/cmd-plugins.txt | 3 + Documentation/meson.build | 11 + Documentation/nvme-admin-passthru.1 | 4 +- Documentation/nvme-admin-passthru.html | 2 +- Documentation/nvme-ana-log.1 | 4 +- Documentation/nvme-ana-log.html | 2 +- Documentation/nvme-attach-ns.1 | 4 +- Documentation/nvme-attach-ns.html | 2 +- Documentation/nvme-boot-part-log.1 | 4 +- Documentation/nvme-boot-part-log.html | 2 +- Documentation/nvme-capacity-mgmt.1 | 4 +- Documentation/nvme-capacity-mgmt.html | 2 +- Documentation/nvme-changed-ns-list-log.1 | 4 +- Documentation/nvme-changed-ns-list-log.html | 2 +- Documentation/nvme-cmdset-ind-id-ns.1 | 4 +- Documentation/nvme-cmdset-ind-id-ns.html | 2 +- Documentation/nvme-compare.1 | 10 +- Documentation/nvme-compare.html | 14 +- Documentation/nvme-compare.txt | 5 + Documentation/nvme-connect-all.1 | 12 +- Documentation/nvme-connect-all.html | 12 +- Documentation/nvme-connect.1 | 10 +- Documentation/nvme-connect.html | 8 +- Documentation/nvme-copy.1 | 4 +- Documentation/nvme-copy.html | 2 +- Documentation/nvme-create-ns.1 | 54 +- Documentation/nvme-create-ns.html | 68 +- Documentation/nvme-create-ns.txt | 21 +- Documentation/nvme-delete-ns.1 | 4 +- Documentation/nvme-delete-ns.html | 2 +- Documentation/nvme-dera-stat.1 | 4 +- Documentation/nvme-dera-stat.html | 2 +- Documentation/nvme-detach-ns.1 | 4 +- Documentation/nvme-detach-ns.html | 2 +- Documentation/nvme-device-self-test.1 | 13 +- Documentation/nvme-device-self-test.html | 21 +- Documentation/nvme-device-self-test.txt | 15 +- Documentation/nvme-dim.1 | 4 +- Documentation/nvme-dim.html | 2 +- Documentation/nvme-dir-receive.1 | 4 +- Documentation/nvme-dir-receive.html | 2 +- Documentation/nvme-dir-send.1 | 4 +- Documentation/nvme-dir-send.html | 2 +- Documentation/nvme-disconnect-all.1 | 4 +- Documentation/nvme-disconnect-all.html | 2 +- Documentation/nvme-disconnect.1 | 4 +- Documentation/nvme-disconnect.html | 2 +- Documentation/nvme-discover.1 | 12 +- Documentation/nvme-discover.html | 12 +- Documentation/nvme-dsm.1 | 4 +- Documentation/nvme-dsm.html | 2 +- Documentation/nvme-effects-log.1 | 4 +- Documentation/nvme-effects-log.html | 2 +- Documentation/nvme-endurance-event-agg-log.1 | 4 +- Documentation/nvme-endurance-event-agg-log.html | 2 +- Documentation/nvme-endurance-log.1 | 4 +- Documentation/nvme-endurance-log.html | 2 +- Documentation/nvme-error-log.1 | 4 +- Documentation/nvme-error-log.html | 2 +- Documentation/nvme-fdp-configs.1 | 69 ++ Documentation/nvme-fdp-configs.html | 834 ++++++++++++++ Documentation/nvme-fdp-configs.txt | 42 + Documentation/nvme-fdp-events.1 | 69 ++ Documentation/nvme-fdp-events.html | 834 ++++++++++++++ Documentation/nvme-fdp-events.txt | 42 + Documentation/nvme-fdp-set-events.1 | 64 ++ Documentation/nvme-fdp-set-events.html | 824 ++++++++++++++ Documentation/nvme-fdp-set-events.txt | 39 + Documentation/nvme-fdp-stats.1 | 63 ++ Documentation/nvme-fdp-stats.html | 822 ++++++++++++++ Documentation/nvme-fdp-stats.txt | 37 + Documentation/nvme-fdp-status.1 | 63 ++ Documentation/nvme-fdp-status.html | 822 ++++++++++++++ Documentation/nvme-fdp-status.txt | 37 + Documentation/nvme-fdp-update.1 | 54 + Documentation/nvme-fdp-update.html | 809 ++++++++++++++ Documentation/nvme-fdp-update.txt | 31 + Documentation/nvme-fdp-usage.1 | 63 ++ Documentation/nvme-fdp-usage.html | 823 ++++++++++++++ Documentation/nvme-fdp-usage.txt | 38 + Documentation/nvme-fid-support-effects-log.1 | 4 +- Documentation/nvme-fid-support-effects-log.html | 2 +- Documentation/nvme-flush.1 | 4 +- Documentation/nvme-flush.html | 2 +- Documentation/nvme-format.1 | 4 +- Documentation/nvme-format.html | 2 +- Documentation/nvme-fw-commit.1 | 4 +- Documentation/nvme-fw-commit.html | 2 +- Documentation/nvme-fw-download.1 | 4 +- Documentation/nvme-fw-download.html | 2 +- Documentation/nvme-fw-log.1 | 4 +- Documentation/nvme-fw-log.html | 2 +- Documentation/nvme-gen-hostnqn.1 | 4 +- Documentation/nvme-gen-hostnqn.html | 2 +- Documentation/nvme-get-feature.1 | 4 +- Documentation/nvme-get-feature.html | 2 +- Documentation/nvme-get-lba-status.1 | 4 +- Documentation/nvme-get-lba-status.html | 2 +- Documentation/nvme-get-log.1 | 4 +- Documentation/nvme-get-log.html | 2 +- Documentation/nvme-get-ns-id.1 | 4 +- Documentation/nvme-get-ns-id.html | 2 +- Documentation/nvme-get-property.1 | 4 +- Documentation/nvme-get-property.html | 2 +- Documentation/nvme-help.1 | 4 +- Documentation/nvme-help.html | 2 +- Documentation/nvme-huawei-id-ctrl.1 | 4 +- Documentation/nvme-huawei-id-ctrl.html | 2 +- Documentation/nvme-huawei-list.1 | 4 +- Documentation/nvme-huawei-list.html | 2 +- Documentation/nvme-id-ctrl.1 | 4 +- Documentation/nvme-id-ctrl.html | 2 +- Documentation/nvme-id-domain.1 | 4 +- Documentation/nvme-id-domain.html | 2 +- Documentation/nvme-id-iocs.1 | 4 +- Documentation/nvme-id-iocs.html | 2 +- Documentation/nvme-id-ns.1 | 4 +- Documentation/nvme-id-ns.html | 2 +- Documentation/nvme-id-nvmset.1 | 4 +- Documentation/nvme-id-nvmset.html | 2 +- Documentation/nvme-inspur-nvme-vendor-log.1 | 71 ++ Documentation/nvme-inspur-nvme-vendor-log.html | 803 ++++++++++++++ Documentation/nvme-inspur-nvme-vendor-log.txt | 37 + Documentation/nvme-intel-id-ctrl.1 | 4 +- Documentation/nvme-intel-id-ctrl.html | 2 +- Documentation/nvme-intel-internal-log.1 | 4 +- Documentation/nvme-intel-internal-log.html | 2 +- Documentation/nvme-intel-lat-stats.1 | 4 +- Documentation/nvme-intel-lat-stats.html | 2 +- Documentation/nvme-intel-market-name.1 | 4 +- Documentation/nvme-intel-market-name.html | 2 +- Documentation/nvme-intel-smart-log-add.1 | 4 +- Documentation/nvme-intel-smart-log-add.html | 2 +- Documentation/nvme-intel-temp-stats.1 | 4 +- Documentation/nvme-intel-temp-stats.html | 2 +- Documentation/nvme-io-mgmt-recv.1 | 72 ++ Documentation/nvme-io-mgmt-recv.html | 853 ++++++++++++++ Documentation/nvme-io-mgmt-recv.txt | 55 + Documentation/nvme-io-mgmt-send.1 | 72 ++ Documentation/nvme-io-mgmt-send.html | 852 ++++++++++++++ Documentation/nvme-io-mgmt-send.txt | 54 + Documentation/nvme-io-passthru.1 | 4 +- Documentation/nvme-io-passthru.html | 2 +- Documentation/nvme-lba-status-log.1 | 4 +- Documentation/nvme-lba-status-log.html | 2 +- Documentation/nvme-list-ctrl.1 | 4 +- Documentation/nvme-list-ctrl.html | 2 +- Documentation/nvme-list-endgrp.1 | 4 +- Documentation/nvme-list-endgrp.html | 2 +- Documentation/nvme-list-ns.1 | 4 +- Documentation/nvme-list-ns.html | 2 +- Documentation/nvme-list-subsys.1 | 4 +- Documentation/nvme-list-subsys.html | 2 +- Documentation/nvme-list.1 | 4 +- Documentation/nvme-list.html | 2 +- Documentation/nvme-lockdown.1 | 4 +- Documentation/nvme-lockdown.html | 2 +- Documentation/nvme-mi-cmd-support-effects-log.1 | 4 +- Documentation/nvme-mi-cmd-support-effects-log.html | 2 +- Documentation/nvme-micron-clear-pcie-errors.1 | 4 +- Documentation/nvme-micron-clear-pcie-errors.html | 2 +- Documentation/nvme-micron-internal-log.1 | 4 +- Documentation/nvme-micron-internal-log.html | 2 +- Documentation/nvme-micron-nand-stats.1 | 4 +- Documentation/nvme-micron-nand-stats.html | 2 +- Documentation/nvme-micron-pcie-stats.1 | 4 +- Documentation/nvme-micron-pcie-stats.html | 2 +- Documentation/nvme-micron-selective-download.1 | 4 +- Documentation/nvme-micron-selective-download.html | 2 +- Documentation/nvme-micron-smart-add-log.1 | 4 +- Documentation/nvme-micron-smart-add-log.html | 2 +- Documentation/nvme-micron-temperature-stats.1 | 4 +- Documentation/nvme-micron-temperature-stats.html | 2 +- Documentation/nvme-netapp-ontapdevices.1 | 4 +- Documentation/nvme-netapp-ontapdevices.html | 2 +- Documentation/nvme-netapp-smdevices.1 | 4 +- Documentation/nvme-netapp-smdevices.html | 2 +- Documentation/nvme-ns-descs.1 | 4 +- Documentation/nvme-ns-descs.html | 2 +- Documentation/nvme-ns-rescan.1 | 4 +- Documentation/nvme-ns-rescan.html | 2 +- Documentation/nvme-nvm-id-ctrl.1 | 4 +- Documentation/nvme-nvm-id-ctrl.html | 2 +- Documentation/nvme-ocp-clear-fw-activate-history.1 | 78 ++ .../nvme-ocp-clear-fw-activate-history.html | 824 ++++++++++++++ .../nvme-ocp-clear-fw-activate-history.txt | 49 + Documentation/nvme-ocp-latency-monitor-log.1 | 4 +- Documentation/nvme-ocp-latency-monitor-log.html | 2 +- Documentation/nvme-ocp-smart-add-log.1 | 4 +- Documentation/nvme-ocp-smart-add-log.html | 2 +- Documentation/nvme-persistent-event-log.1 | 4 +- Documentation/nvme-persistent-event-log.html | 2 +- Documentation/nvme-pred-lat-event-agg-log.1 | 4 +- Documentation/nvme-pred-lat-event-agg-log.html | 2 +- Documentation/nvme-predictable-lat-log.1 | 4 +- Documentation/nvme-predictable-lat-log.html | 2 +- Documentation/nvme-primary-ctrl-caps.1 | 4 +- Documentation/nvme-primary-ctrl-caps.html | 2 +- Documentation/nvme-read.1 | 10 +- Documentation/nvme-read.html | 14 +- Documentation/nvme-read.txt | 5 + Documentation/nvme-reset.1 | 4 +- Documentation/nvme-reset.html | 2 +- Documentation/nvme-resv-acquire.1 | 4 +- Documentation/nvme-resv-acquire.html | 2 +- Documentation/nvme-resv-notif-log.1 | 4 +- Documentation/nvme-resv-notif-log.html | 2 +- Documentation/nvme-resv-register.1 | 4 +- Documentation/nvme-resv-register.html | 2 +- Documentation/nvme-resv-release.1 | 4 +- Documentation/nvme-resv-release.html | 2 +- Documentation/nvme-resv-report.1 | 4 +- Documentation/nvme-resv-report.html | 2 +- Documentation/nvme-rpmb.1 | 4 +- Documentation/nvme-rpmb.html | 2 +- Documentation/nvme-sanitize-log.1 | 4 +- Documentation/nvme-sanitize-log.html | 2 +- Documentation/nvme-sanitize.1 | 21 +- Documentation/nvme-sanitize.html | 15 +- Documentation/nvme-sanitize.txt | 13 +- .../nvme-seagate-clear-fw-activate-history.1 | 4 +- .../nvme-seagate-clear-fw-activate-history.html | 2 +- .../nvme-seagate-clear-pcie-correctable-errors.1 | 4 +- ...nvme-seagate-clear-pcie-correctable-errors.html | 2 +- .../nvme-seagate-cloud-SSD-plugin-version.1 | 4 +- .../nvme-seagate-cloud-SSD-plugin-version.html | 2 +- Documentation/nvme-seagate-get-ctrl-tele.1 | 4 +- Documentation/nvme-seagate-get-ctrl-tele.html | 2 +- Documentation/nvme-seagate-get-host-tele.1 | 4 +- Documentation/nvme-seagate-get-host-tele.html | 2 +- Documentation/nvme-seagate-help.1 | 4 +- Documentation/nvme-seagate-help.html | 2 +- Documentation/nvme-seagate-plugin-version.1 | 4 +- Documentation/nvme-seagate-plugin-version.html | 2 +- Documentation/nvme-seagate-version.1 | 4 +- Documentation/nvme-seagate-version.html | 2 +- .../nvme-seagate-vs-fw-activate-history.1 | 4 +- .../nvme-seagate-vs-fw-activate-history.html | 2 +- Documentation/nvme-seagate-vs-internal-log.1 | 4 +- Documentation/nvme-seagate-vs-internal-log.html | 2 +- Documentation/nvme-seagate-vs-log-page-sup.1 | 4 +- Documentation/nvme-seagate-vs-log-page-sup.html | 2 +- Documentation/nvme-seagate-vs-pcie-stats.1 | 4 +- Documentation/nvme-seagate-vs-pcie-stats.html | 2 +- Documentation/nvme-seagate-vs-smart-add-log.1 | 4 +- Documentation/nvme-seagate-vs-smart-add-log.html | 2 +- Documentation/nvme-seagate-vs-temperature-stats.1 | 4 +- .../nvme-seagate-vs-temperature-stats.html | 2 +- Documentation/nvme-security-recv.1 | 4 +- Documentation/nvme-security-recv.html | 2 +- Documentation/nvme-security-send.1 | 4 +- Documentation/nvme-security-send.html | 2 +- Documentation/nvme-self-test-log.1 | 4 +- Documentation/nvme-self-test-log.html | 2 +- Documentation/nvme-set-feature.1 | 4 +- Documentation/nvme-set-feature.html | 2 +- Documentation/nvme-set-property.1 | 4 +- Documentation/nvme-set-property.html | 2 +- Documentation/nvme-show-hostnqn.1 | 6 +- Documentation/nvme-show-hostnqn.html | 4 +- Documentation/nvme-show-regs.1 | 4 +- Documentation/nvme-show-regs.html | 2 +- Documentation/nvme-show-topology.1 | 4 +- Documentation/nvme-show-topology.html | 2 +- Documentation/nvme-smart-log.1 | 4 +- Documentation/nvme-smart-log.html | 2 +- Documentation/nvme-subsystem-reset.1 | 4 +- Documentation/nvme-subsystem-reset.html | 2 +- Documentation/nvme-supported-log-pages.1 | 4 +- Documentation/nvme-supported-log-pages.html | 2 +- Documentation/nvme-telemetry-log.1 | 4 +- Documentation/nvme-telemetry-log.html | 2 +- .../nvme-toshiba-clear-pcie-correctable-errors.1 | 4 +- ...nvme-toshiba-clear-pcie-correctable-errors.html | 2 +- Documentation/nvme-toshiba-vs-internal-log.1 | 4 +- Documentation/nvme-toshiba-vs-internal-log.html | 2 +- Documentation/nvme-toshiba-vs-smart-add-log.1 | 4 +- Documentation/nvme-toshiba-vs-smart-add-log.html | 2 +- Documentation/nvme-transcend-badblock.1 | 4 +- Documentation/nvme-transcend-badblock.html | 2 +- Documentation/nvme-transcend-healthvalue.1 | 4 +- Documentation/nvme-transcend-healthvalue.html | 2 +- Documentation/nvme-verify.1 | 4 +- Documentation/nvme-verify.html | 2 +- .../nvme-virtium-save-smart-to-vtview-log.1 | 4 +- .../nvme-virtium-save-smart-to-vtview-log.html | 2 +- Documentation/nvme-virtium-show-identify.1 | 4 +- Documentation/nvme-virtium-show-identify.html | 2 +- Documentation/nvme-wdc-cap-diag.1 | 4 +- Documentation/nvme-wdc-cap-diag.html | 2 +- Documentation/nvme-wdc-capabilities.1 | 4 +- Documentation/nvme-wdc-capabilities.html | 2 +- Documentation/nvme-wdc-clear-assert-dump.1 | 4 +- Documentation/nvme-wdc-clear-assert-dump.html | 2 +- Documentation/nvme-wdc-clear-fw-activate-history.1 | 4 +- .../nvme-wdc-clear-fw-activate-history.html | 2 +- .../nvme-wdc-clear-pcie-correctable-errors.1 | 4 +- .../nvme-wdc-clear-pcie-correctable-errors.html | 2 +- Documentation/nvme-wdc-cloud-SSD-plugin-version.1 | 4 +- .../nvme-wdc-cloud-SSD-plugin-version.html | 2 +- Documentation/nvme-wdc-cloud-boot-SSD-version.1 | 4 +- Documentation/nvme-wdc-cloud-boot-SSD-version.html | 2 +- Documentation/nvme-wdc-drive-essentials.1 | 4 +- Documentation/nvme-wdc-drive-essentials.html | 2 +- Documentation/nvme-wdc-drive-log.1 | 4 +- Documentation/nvme-wdc-drive-log.html | 2 +- Documentation/nvme-wdc-drive-resize.1 | 4 +- Documentation/nvme-wdc-drive-resize.html | 2 +- Documentation/nvme-wdc-enc-get-log.1 | 4 +- Documentation/nvme-wdc-enc-get-log.html | 2 +- Documentation/nvme-wdc-get-crash-dump.1 | 4 +- Documentation/nvme-wdc-get-crash-dump.html | 2 +- Documentation/nvme-wdc-get-dev-capabilities-log.1 | 4 +- .../nvme-wdc-get-dev-capabilities-log.html | 2 +- Documentation/nvme-wdc-get-drive-status.1 | 4 +- Documentation/nvme-wdc-get-drive-status.html | 2 +- Documentation/nvme-wdc-get-error-recovery-log.1 | 4 +- Documentation/nvme-wdc-get-error-recovery-log.html | 2 +- Documentation/nvme-wdc-get-latency-monitor-log.1 | 4 +- .../nvme-wdc-get-latency-monitor-log.html | 2 +- Documentation/nvme-wdc-get-pfail-dump.1 | 4 +- Documentation/nvme-wdc-get-pfail-dump.html | 2 +- Documentation/nvme-wdc-get-unsupported-reqs-log.1 | 4 +- .../nvme-wdc-get-unsupported-reqs-log.html | 2 +- Documentation/nvme-wdc-id-ctrl.1 | 4 +- Documentation/nvme-wdc-id-ctrl.html | 2 +- Documentation/nvme-wdc-log-page-directory.1 | 4 +- Documentation/nvme-wdc-log-page-directory.html | 2 +- Documentation/nvme-wdc-namespace-resize.1 | 4 +- Documentation/nvme-wdc-namespace-resize.html | 2 +- Documentation/nvme-wdc-purge-monitor.1 | 4 +- Documentation/nvme-wdc-purge-monitor.html | 2 +- Documentation/nvme-wdc-purge.1 | 4 +- Documentation/nvme-wdc-purge.html | 2 +- Documentation/nvme-wdc-vs-cloud-log.1 | 4 +- Documentation/nvme-wdc-vs-cloud-log.html | 2 +- Documentation/nvme-wdc-vs-device-waf.1 | 4 +- Documentation/nvme-wdc-vs-device-waf.html | 2 +- Documentation/nvme-wdc-vs-drive-info.1 | 4 +- Documentation/nvme-wdc-vs-drive-info.html | 2 +- .../nvme-wdc-vs-error-reason-identifier.1 | 4 +- .../nvme-wdc-vs-error-reason-identifier.html | 2 +- Documentation/nvme-wdc-vs-fw-activate-history.1 | 4 +- Documentation/nvme-wdc-vs-fw-activate-history.html | 2 +- Documentation/nvme-wdc-vs-hw-rev-log.1 | 4 +- Documentation/nvme-wdc-vs-hw-rev-log.html | 2 +- Documentation/nvme-wdc-vs-internal-log.1 | 4 +- Documentation/nvme-wdc-vs-internal-log.html | 2 +- Documentation/nvme-wdc-vs-nand-stats.1 | 4 +- Documentation/nvme-wdc-vs-nand-stats.html | 2 +- Documentation/nvme-wdc-vs-smart-add-log.1 | 4 +- Documentation/nvme-wdc-vs-smart-add-log.html | 2 +- .../nvme-wdc-vs-telemetry-controller-option.1 | 4 +- .../nvme-wdc-vs-telemetry-controller-option.html | 2 +- Documentation/nvme-wdc-vs-temperature-stats.1 | 4 +- Documentation/nvme-wdc-vs-temperature-stats.html | 2 +- Documentation/nvme-write-uncor.1 | 4 +- Documentation/nvme-write-uncor.html | 2 +- Documentation/nvme-write-zeroes.1 | 4 +- Documentation/nvme-write-zeroes.html | 2 +- Documentation/nvme-write.1 | 10 +- Documentation/nvme-write.html | 14 +- Documentation/nvme-write.txt | 5 + Documentation/nvme-zns-changed-zone-list.1 | 4 +- Documentation/nvme-zns-changed-zone-list.html | 2 +- Documentation/nvme-zns-close-zone.1 | 4 +- Documentation/nvme-zns-close-zone.html | 2 +- Documentation/nvme-zns-finish-zone.1 | 4 +- Documentation/nvme-zns-finish-zone.html | 2 +- Documentation/nvme-zns-id-ctrl.1 | 4 +- Documentation/nvme-zns-id-ctrl.html | 2 +- Documentation/nvme-zns-id-ns.1 | 4 +- Documentation/nvme-zns-id-ns.html | 2 +- Documentation/nvme-zns-offline-zone.1 | 4 +- Documentation/nvme-zns-offline-zone.html | 2 +- Documentation/nvme-zns-open-zone.1 | 4 +- Documentation/nvme-zns-open-zone.html | 2 +- Documentation/nvme-zns-report-zones.1 | 4 +- Documentation/nvme-zns-report-zones.html | 2 +- Documentation/nvme-zns-reset-zone.1 | 4 +- Documentation/nvme-zns-reset-zone.html | 2 +- Documentation/nvme-zns-set-zone-desc.1 | 4 +- Documentation/nvme-zns-set-zone-desc.html | 2 +- Documentation/nvme-zns-zone-append.1 | 4 +- Documentation/nvme-zns-zone-append.html | 2 +- Documentation/nvme-zns-zone-mgmt-recv.1 | 4 +- Documentation/nvme-zns-zone-mgmt-recv.html | 2 +- Documentation/nvme-zns-zone-mgmt-send.1 | 4 +- Documentation/nvme-zns-zone-mgmt-send.html | 2 +- Documentation/nvme.1 | 9 +- Documentation/nvme.html | 10 +- completions/_nvme | 3 +- completions/bash-nvme-completion.sh | 248 +++-- fabrics.c | 294 +++-- meson.build | 17 +- meson_options.txt | 5 +- nvme-builtin.h | 2 + nvme-print.c | 529 +++++++-- nvme-print.h | 11 + nvme-wrap.c | 56 + nvme-wrap.h | 21 +- nvme.c | 1168 +++++++++++++++----- nvme.h | 6 - plugin.c | 4 +- plugins/fdp/fdp.c | 537 +++++++++ plugins/fdp/fdp.h | 24 + plugins/inspur/inspur-nvme.c | 235 ++++ plugins/inspur/inspur-nvme.h | 18 + plugins/inspur/inspur-utils.h | 175 +++ plugins/memblaze/memblaze-nvme.c | 203 ++-- plugins/memblaze/memblaze-nvme.h | 7 - plugins/memblaze/memblaze-utils.h | 13 +- plugins/meson.build | 4 +- plugins/micron/micron-nvme.c | 1 - plugins/ocp/meson.build | 6 + plugins/ocp/ocp-clear-fw-update-history.c | 73 ++ plugins/ocp/ocp-clear-fw-update-history.h | 9 + plugins/ocp/ocp-nvme.c | 7 + plugins/ocp/ocp-nvme.h | 11 +- plugins/ocp/ocp-utils.c | 30 + plugins/ocp/ocp-utils.h | 18 + plugins/scaleflux/sfx-nvme.c | 2 +- plugins/solidigm/solidigm-nvme.c | 9 +- plugins/solidigm/solidigm-nvme.h | 5 +- release.sh | 58 +- subprojects/libnvme.wrap | 2 +- tests/README | 11 +- tests/meson.build | 9 - tests/test-uint128.c | 62 -- unit/meson.build | 28 + unit/test-suffix-si-parse.c | 64 ++ unit/test-uint128-si.c | 66 ++ unit/test-uint128.c | 62 ++ util/argconfig.c | 50 +- util/argconfig.h | 7 +- util/suffix.c | 49 +- util/suffix.h | 3 + util/types.c | 43 +- util/types.h | 1 + 446 files changed, 14760 insertions(+), 1601 deletions(-) create mode 100644 .github/AppImageBuilder.yml create mode 100644 .github/azure-pipelines.yml create mode 100644 .github/workflows/appimage.yml create mode 100644 .github/workflows/build.yml delete mode 100644 .github/workflows/meson.yml create mode 100644 Documentation/nvme-fdp-configs.1 create mode 100644 Documentation/nvme-fdp-configs.html create mode 100644 Documentation/nvme-fdp-configs.txt create mode 100644 Documentation/nvme-fdp-events.1 create mode 100644 Documentation/nvme-fdp-events.html create mode 100644 Documentation/nvme-fdp-events.txt create mode 100644 Documentation/nvme-fdp-set-events.1 create mode 100644 Documentation/nvme-fdp-set-events.html create mode 100644 Documentation/nvme-fdp-set-events.txt create mode 100644 Documentation/nvme-fdp-stats.1 create mode 100644 Documentation/nvme-fdp-stats.html create mode 100644 Documentation/nvme-fdp-stats.txt create mode 100644 Documentation/nvme-fdp-status.1 create mode 100644 Documentation/nvme-fdp-status.html create mode 100644 Documentation/nvme-fdp-status.txt create mode 100644 Documentation/nvme-fdp-update.1 create mode 100644 Documentation/nvme-fdp-update.html create mode 100644 Documentation/nvme-fdp-update.txt create mode 100644 Documentation/nvme-fdp-usage.1 create mode 100644 Documentation/nvme-fdp-usage.html create mode 100644 Documentation/nvme-fdp-usage.txt create mode 100644 Documentation/nvme-inspur-nvme-vendor-log.1 create mode 100644 Documentation/nvme-inspur-nvme-vendor-log.html create mode 100644 Documentation/nvme-inspur-nvme-vendor-log.txt create mode 100644 Documentation/nvme-io-mgmt-recv.1 create mode 100644 Documentation/nvme-io-mgmt-recv.html create mode 100644 Documentation/nvme-io-mgmt-recv.txt create mode 100644 Documentation/nvme-io-mgmt-send.1 create mode 100644 Documentation/nvme-io-mgmt-send.html create mode 100644 Documentation/nvme-io-mgmt-send.txt create mode 100644 Documentation/nvme-ocp-clear-fw-activate-history.1 create mode 100644 Documentation/nvme-ocp-clear-fw-activate-history.html create mode 100644 Documentation/nvme-ocp-clear-fw-activate-history.txt create mode 100644 plugins/fdp/fdp.c create mode 100644 plugins/fdp/fdp.h create mode 100644 plugins/inspur/inspur-nvme.c create mode 100644 plugins/inspur/inspur-nvme.h create mode 100644 plugins/inspur/inspur-utils.h create mode 100644 plugins/ocp/meson.build create mode 100644 plugins/ocp/ocp-clear-fw-update-history.c create mode 100644 plugins/ocp/ocp-clear-fw-update-history.h create mode 100644 plugins/ocp/ocp-utils.c create mode 100644 plugins/ocp/ocp-utils.h delete mode 100644 tests/test-uint128.c create mode 100644 unit/meson.build create mode 100644 unit/test-suffix-si-parse.c create mode 100644 unit/test-uint128-si.c create mode 100644 unit/test-uint128.c diff --git a/.github/AppImageBuilder.yml b/.github/AppImageBuilder.yml new file mode 100644 index 0000000..3675edf --- /dev/null +++ b/.github/AppImageBuilder.yml @@ -0,0 +1,60 @@ +# appimage-builder recipe see https://appimage-builder.readthedocs.io for details +version: 1 +script: + # Ensure that the mksquashfs tool is installed (workaround for the AppImageCrafters/build-appimage GHA) + - which mksquashfs || apt install squashfs-tools + # fake icons + - mkdir -p AppDir/usr/share/icons/hicolor/64x64/apps + - touch AppDir/usr/share/icons/hicolor/64x64/apps/nvme-cli.png + +AppDir: + path: AppDir + app_info: + id: linux-nvme.nvme-cli + name: nvme-cli + version: latest + icon: nvme-cli + exec: usr/sbin/nvme + exec_args: $@ + apt: + arch: amd64 + allow_unauthenticated: true + sources: + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse + key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x871920D1991BC93C' + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse + include: + - libjson-c5 + - libhugetlbfs0 + files: + include: + - /lib64/libcrypto.so.3 + - /lib64/libdbus-1.so.3 + - /lib64/libjson-c.so.5 + exclude: + - usr/share/man + - usr/share/doc/*/README.* + - usr/share/doc/*/changelog.* + - usr/share/doc/*/NEWS.* + - usr/share/doc/*/TODO.* + test: + fedora-30: + image: appimagecrafters/tests-env:fedora-30 + command: ./AppRun + debian-stable: + image: appimagecrafters/tests-env:debian-stable + command: ./AppRun + archlinux-latest: + image: appimagecrafters/tests-env:archlinux-latest + command: ./AppRun + centos-7: + image: appimagecrafters/tests-env:centos-7 + command: ./AppRun + ubuntu-xenial: + image: appimagecrafters/tests-env:ubuntu-xenial + command: ./AppRun +AppImage: + update-information: 'gh-releases-zsync|linux-nvme|nvme-cli|latest|*x86_64.AppImage.zsync' + arch: x86_64 diff --git a/.github/azure-pipelines.yml b/.github/azure-pipelines.yml new file mode 100644 index 0000000..4b52903 --- /dev/null +++ b/.github/azure-pipelines.yml @@ -0,0 +1,35 @@ +--- +# Do not run following tests +# - exclude data varification tests, too slow +# - nvme/010 +# - nvme/011 +# - nvme/012 +# - nvme/013 + +trigger: none # Disable CI triggers. + +jobs: + - job: blktests + timeoutInMinutes: 5 + pool: + name: linux-nvme + steps: + - script: | + meson $(Agent.TempDirectory)/build + ninja -C $(Agent.TempDirectory)/build + displayName: Build nvme-cli + - script: | + git clone --depth 1 https://github.com/osandov/blktests.git $(Agent.TempDirectory)/blktests + displayName: Clone blktests + - script: | + cd $(Agent.TempDirectory)/blktests + sudo sh -c 'PATH=$(Agent.TempDirectory)/build:$PATH nvme_trtype=tcp ./check -x nvme/010 -x nvme/011 -x nvme/012 -x nvme/013 nvme' + displayName: Run blktests for NVMe transport TCP + - script: | + cd $(Agent.TempDirectory)/blktests + sudo sh -c 'PATH=$(Agent.TempDirectory)/build:$PATH nvme_trtype=rdma ./check -x nvme/010 -x nvme/011 -x nvme/012 -x nvme/013 nvme' + displayName: Run blktests for NVMe transport RDMA + - script: | + cd $(Agent.TempDirectory)/blktests + sudo sh -c 'PATH=$(Agent.TempDirectory)/build:$PATH nvme_trtype=fc ./check -x nvme/010 -x nvme/011 -x nvme/012 -x nvme/013 nvme' + displayName: Run blktests for NVMe transport FC diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml new file mode 100644 index 0000000..c64dfb3 --- /dev/null +++ b/.github/workflows/appimage.yml @@ -0,0 +1,33 @@ +--- +name: AppImage + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] +env: + DESTDIR: ../AppDir + +jobs: + build-appimage: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: install dependencies + run: sudo apt-get install libjson-c-dev libdbus-1-dev libhugetlbfs-dev + - uses: actions/setup-python@v4 + with: + python-version: '3.x' + - uses: BSFishy/meson-build@v1.0.3 + with: + setup-options: --werror --buildtype=release --prefix=/usr + action: install + - name: build AppImage + uses: AppImageCrafters/build-appimage@v1.3 + with: + recipe: .github/AppImageBuilder.yml + - uses: actions/upload-artifact@v3 + with: + name: AppImage + path: '*.AppImage*' diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..805a962 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,118 @@ +--- +name: build + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + + workflow_dispatch: + +jobs: + build-distro: + runs-on: ubuntu-latest + + steps: + - name: install dependencies + run: sudo apt-get install libjson-c-dev libhugetlbfs-dev libdbus-1-dev + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: '3.x' + - uses: BSFishy/meson-build@v1.0.3 + with: + setup-options: --werror + action: test + + build-cross-armhf: + runs-on: ubuntu-latest + steps: + - name: set up arm architecture + run: | + export release=$(lsb_release -c -s) + sudo dpkg --add-architecture armhf + sudo sed -i -e 's/deb http/deb [arch=amd64] http/g' /etc/apt/sources.list + sudo dd of=/etc/apt/sources.list.d/armhf.list < -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ADMIN\-PASSTHR" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ADMIN\-PASSTHR" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-admin-passthru.html b/Documentation/nvme-admin-passthru.html index 41da63e..df793f1 100644 --- a/Documentation/nvme-admin-passthru.html +++ b/Documentation/nvme-admin-passthru.html @@ -998,7 +998,7 @@ Or if you want to save that structure to a file: diff --git a/Documentation/nvme-ana-log.1 b/Documentation/nvme-ana-log.1 index 2c0e905..1612c3b 100644 --- a/Documentation/nvme-ana-log.1 +++ b/Documentation/nvme-ana-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ana-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ANA\-LOG" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ANA\-LOG" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ana-log.html b/Documentation/nvme-ana-log.html index e93ae20..6fd8b75 100644 --- a/Documentation/nvme-ana-log.html +++ b/Documentation/nvme-ana-log.html @@ -823,7 +823,7 @@ Print the ANA log page in a human readable format: diff --git a/Documentation/nvme-attach-ns.1 b/Documentation/nvme-attach-ns.1 index 53746ea..c2339dc 100644 --- a/Documentation/nvme-attach-ns.1 +++ b/Documentation/nvme-attach-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-attach-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ATTACH\-NS" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ATTACH\-NS" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-attach-ns.html b/Documentation/nvme-attach-ns.html index b213377..874b250 100644 --- a/Documentation/nvme-attach-ns.html +++ b/Documentation/nvme-attach-ns.html @@ -817,7 +817,7 @@ controller identifiers.

diff --git a/Documentation/nvme-boot-part-log.1 b/Documentation/nvme-boot-part-log.1 index c1e2438..0ece2a2 100644 --- a/Documentation/nvme-boot-part-log.1 +++ b/Documentation/nvme-boot-part-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-boot-part-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-BOOT\-PART\-LO" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-BOOT\-PART\-LO" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-boot-part-log.html b/Documentation/nvme-boot-part-log.html index 4dce5ef..b311966 100644 --- a/Documentation/nvme-boot-part-log.html +++ b/Documentation/nvme-boot-part-log.html @@ -835,7 +835,7 @@ Retrieve Boot Partition data to boot_part_log.bin diff --git a/Documentation/nvme-capacity-mgmt.1 b/Documentation/nvme-capacity-mgmt.1 index ea0418c..119d52b 100644 --- a/Documentation/nvme-capacity-mgmt.1 +++ b/Documentation/nvme-capacity-mgmt.1 @@ -2,12 +2,12 @@ .\" Title: nvme-capacity-mgmt .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CAPACITY\-MGMT" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-CAPACITY\-MGMT" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-capacity-mgmt.html b/Documentation/nvme-capacity-mgmt.html index 1ca3d42..fc01efc 100644 --- a/Documentation/nvme-capacity-mgmt.html +++ b/Documentation/nvme-capacity-mgmt.html @@ -839,7 +839,7 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).

diff --git a/Documentation/nvme-changed-ns-list-log.1 b/Documentation/nvme-changed-ns-list-log.1 index 0f8f52d..dc88509 100644 --- a/Documentation/nvme-changed-ns-list-log.1 +++ b/Documentation/nvme-changed-ns-list-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-changed-ns-list-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CHANGED\-NS\-L" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-CHANGED\-NS\-L" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-changed-ns-list-log.html b/Documentation/nvme-changed-ns-list-log.html index 2358d44..fa107d3 100644 --- a/Documentation/nvme-changed-ns-list-log.html +++ b/Documentation/nvme-changed-ns-list-log.html @@ -835,7 +835,7 @@ Print the raw Changed Namespace List log to a file: diff --git a/Documentation/nvme-cmdset-ind-id-ns.1 b/Documentation/nvme-cmdset-ind-id-ns.1 index f034482..d8082f3 100644 --- a/Documentation/nvme-cmdset-ind-id-ns.1 +++ b/Documentation/nvme-cmdset-ind-id-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-cmdset-ind-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CMDSET\-IND\-I" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-CMDSET\-IND\-I" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-cmdset-ind-id-ns.html b/Documentation/nvme-cmdset-ind-id-ns.html index 73b5a3c..1d2192d 100644 --- a/Documentation/nvme-cmdset-ind-id-ns.html +++ b/Documentation/nvme-cmdset-ind-id-ns.html @@ -879,7 +879,7 @@ Have the program return the raw structure in binary: diff --git a/Documentation/nvme-compare.1 b/Documentation/nvme-compare.1 index 8d53902..f90e068 100644 --- a/Documentation/nvme-compare.1 +++ b/Documentation/nvme-compare.1 @@ -2,12 +2,12 @@ .\" Title: nvme-compare .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-COMPARE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-COMPARE" "1" "01/30/2023" "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 | \-g ] [\-\-storage\-tag\-check | \-C ] [\-\-force] .fi @@ -205,6 +206,11 @@ be set\&. Otherwise \-\-dry\-run option will be Print out the latency the IOCTL took (in us)\&. .RE .PP +\-\-storage\-tag=, \-g +.RS 4 +Variable Sized Expected Logical Block Storage Tag(ELBST)\&. +.RE +.PP \-\-storage\-tag\-check=, \-C .RS 4 This bit specifies the Storage Tag field shall be checked as part of end\-to\-end data protection processing\&. diff --git a/Documentation/nvme-compare.html b/Documentation/nvme-compare.html index e058fb0..0c4d611 100644 --- a/Documentation/nvme-compare.html +++ b/Documentation/nvme-compare.html @@ -767,6 +767,7 @@ nvme-compare(1) Manual Page [--show-command | -v] [--dry-run | -w] [--latency | -t] + [--storage-tag<storage-tag> | -g <storage-tag>] [--storage-tag-check<storage-tag-check> | -C <storage-tag-check>] [--force]
@@ -1043,6 +1044,17 @@ metadata is passes.

+--storage-tag=<storage-tag> +
+
+-g <storage-tag> +
+
+

+ Variable Sized Expected Logical Block Storage Tag(ELBST). +

+
+
--storage-tag-check=<storage-tag-check>
@@ -1083,7 +1095,7 @@ metadata is passes.

diff --git a/Documentation/nvme-compare.txt b/Documentation/nvme-compare.txt index 11299bd..0137d8d 100644 --- a/Documentation/nvme-compare.txt +++ b/Documentation/nvme-compare.txt @@ -26,6 +26,7 @@ SYNOPSIS [--show-command | -v] [--dry-run | -w] [--latency | -t] + [--storage-tag | -g ] [--storage-tag-check | -C ] [--force] @@ -140,6 +141,10 @@ metadata is passes. --latency:: Print out the latency the IOCTL took (in us). +--storage-tag=:: +-g :: + Variable Sized Expected Logical Block Storage Tag(ELBST). + --storage-tag-check=:: -C :: This bit specifies the Storage Tag field shall be checked as part of end-to-end diff --git a/Documentation/nvme-connect-all.1 b/Documentation/nvme-connect-all.1 index 8f4b81b..f2dbcb5 100644 --- a/Documentation/nvme-connect-all.1 +++ b/Documentation/nvme-connect-all.1 @@ -2,12 +2,12 @@ .\" Title: nvme-connect-all .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CONNECT\-ALL" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-CONNECT\-ALL" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -60,7 +60,7 @@ nvme-connect-all \- Discover and Connect to Fabrics controllers\&. .sp Send one or more Discovery requests to a NVMe over Fabrics Discovery Controller, and create controllers for the returned discovery records\&. .sp -If no parameters are given, then \fInvme connect\-all\fR will attempt to find a /etc/nvme/discovery\&.conf file to use to supply a list of connect\-all commands to run\&. If no /etc/nvme/discovery\&.conf file exists, the command will quit with an error\&. +If no parameters are given, then \fInvme connect\-all\fR will attempt to find a /usr/local/etc/nvme/discovery\&.conf file to use to supply a list of connect\-all commands to run\&. If no /usr/local/etc/nvme/discovery\&.conf file exists, the command will quit with an error\&. .sp Otherwise a specific Discovery Controller should be specified using the \-\-transport, \-\-traddr and if necessary the \-\-trsvcid and a Discovery request will be sent to the specified Discovery Controller\&. .sp @@ -134,7 +134,7 @@ This field specifies the network interface used on the host to connect to the Co .PP \-q , \-\-hostnqn= .RS 4 -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\&. The Host NQN uniquely identifies the NVMe Host, and may be used by the the Discovery Controller to control what NVMe Target resources are allocated to the NVMe Host for a connection\&. +Overrides the default Host NQN that identifies the NVMe Host\&. If this option is not specified, the default is read from /usr/local/etc/nvme/hostnqn first\&. If that does not exist, the autogenerated NQN value from the NVMe Host kernel module is used next\&. The Host NQN uniquely identifies the NVMe Host, and may be used by the the Discovery Controller to control what NVMe Target resources are allocated to the NVMe Host for a connection\&. .RE .PP \-I , \-\-hostid= @@ -153,7 +153,7 @@ will dump the output to stdout\&. .PP \-C , \-\-config\-file= .RS 4 -Use the specified JSON configuration file instead of the default /etc/nvme/config\&.json file or +Use the specified JSON configuration file instead of the default /usr/local/etc/nvme/config\&.json file or \fInone\fR to not read in an existing configuration file\&. The JSON configuration file format is documented in \m[blue]\fBhttps://github\&.com/linux\-nvme/libnvme/doc/config\-schema\&.json\fR\m[] @@ -252,7 +252,7 @@ Connect to all records returned by the Discover Controller with IP4 address 192\ .\} Issue a \fInvme connect\-all\fR -command using a /etc/nvme/discovery\&.conf file: +command using a /usr/local/etc/nvme/discovery\&.conf file: .sp .if n \{\ .RS 4 diff --git a/Documentation/nvme-connect-all.html b/Documentation/nvme-connect-all.html index 46d806b..89eae33 100644 --- a/Documentation/nvme-connect-all.html +++ b/Documentation/nvme-connect-all.html @@ -782,8 +782,8 @@ nvme-connect-all(1) Manual Page

Send one or more Discovery requests to a NVMe over Fabrics Discovery Controller, and create controllers for the returned discovery records.

If no parameters are given, then nvme connect-all will attempt to -find a /etc/nvme/discovery.conf file to use to supply a list of -connect-all commands to run. If no /etc/nvme/discovery.conf file +find a /usr/local/etc/nvme/discovery.conf file to use to supply a list of +connect-all commands to run. If no /usr/local/etc/nvme/discovery.conf file exists, the command will quit with an error.

Otherwise a specific Discovery Controller should be specified using the --transport, --traddr and if necessary the --trsvcid and a Discovery @@ -912,7 +912,7 @@ cellspacing="0" cellpadding="4">

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 + /usr/local/etc/nvme/hostnqn first. If that does not exist, the autogenerated NQN value from the NVMe Host kernel module is used next. The Host NQN uniquely identifies the NVMe Host, and may be used by the the Discovery Controller to control what NVMe Target resources are @@ -953,7 +953,7 @@ cellspacing="0" cellpadding="4">

Use the specified JSON configuration file instead of the - default /etc/nvme/config.json file or none to not read in + default /usr/local/etc/nvme/config.json file or none to not read in an existing configuration file. The JSON configuration file format is documented in https://github.com/linux-nvme/libnvme/doc/config-schema.json @@ -1120,7 +1120,7 @@ the RDMA network. Port 4420 is used by default:

  • -Issue a nvme connect-all command using a /etc/nvme/discovery.conf file: +Issue a nvme connect-all command using a /usr/local/etc/nvme/discovery.conf file:

    @@ -1156,7 +1156,7 @@ nvme-connect(1)

    diff --git a/Documentation/nvme-connect.1 b/Documentation/nvme-connect.1 index 7de1e87..f657eb1 100644 --- a/Documentation/nvme-connect.1 +++ b/Documentation/nvme-connect.1 @@ -2,12 +2,12 @@ .\" Title: nvme-connect .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CONNECT" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-CONNECT" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -130,7 +130,7 @@ This field specifies the network interface used on the host to connect to the Co .PP \-q , \-\-hostnqn= .RS 4 -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\&. The Host NQN uniquely 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 /usr/local/etc/nvme/hostnqn first\&. If that does not exist, the autogenerated NQN value from the NVMe Host kernel module is used next\&. The Host NQN uniquely identifies the NVMe Host\&. .RE .PP \-I , \-\-hostid= @@ -140,7 +140,7 @@ UUID(Universally Unique Identifier) to be discovered which should be formatted\& .PP \-J , \-\-config\-file= .RS 4 -Use the specified JSON configuration file instead of the default /etc/nvme/config\&.json file or +Use the specified JSON configuration file instead of the default /usr/local/etc/nvme/config\&.json file or \fInone\fR to not read in an existing configuration file\&. The JSON configuration file format is documented in \m[blue]\fBhttps://github\&.com/linux\-nvme/libnvme/doc/config\-schema\&.json\fR\m[] @@ -149,7 +149,7 @@ to not read in an existing configuration file\&. The JSON configuration file for \-S , \-\-dhchap\-secret= .RS 4 NVMe In\-band authentication secret; needs to be in ASCII format as specified in NVMe 2\&.0 section 8\&.13\&.5\&.8 -\fISecret representation\fR\&. If this option is not specified, the default is read from /etc/nvme/hostkey\&. If that does not exist no in\-band authentication is attempted\&. +\fISecret representation\fR\&. If this option is not specified, the default is read from /usr/local/etc/nvme/hostkey\&. If that does not exist no in\-band authentication is attempted\&. .RE .PP \-C , \-\-dhchap\-ctrl\-secret= diff --git a/Documentation/nvme-connect.html b/Documentation/nvme-connect.html index 4119b57..19fc688 100644 --- a/Documentation/nvme-connect.html +++ b/Documentation/nvme-connect.html @@ -906,7 +906,7 @@ cellspacing="0" cellpadding="4">

    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 + /usr/local/etc/nvme/hostnqn first. If that does not exist, the autogenerated NQN value from the NVMe Host kernel module is used next. The Host NQN uniquely identifies the NVMe Host.

    @@ -932,7 +932,7 @@ cellspacing="0" cellpadding="4">

    Use the specified JSON configuration file instead of the - default /etc/nvme/config.json file or none to not read in + default /usr/local/etc/nvme/config.json file or none to not read in an existing configuration file. The JSON configuration file format is documented in https://github.com/linux-nvme/libnvme/doc/config-schema.json @@ -949,7 +949,7 @@ cellspacing="0" cellpadding="4"> NVMe In-band authentication secret; needs to be in ASCII format as specified in NVMe 2.0 section 8.13.5.8 Secret representation. If this option is not specified, the default is read from - /etc/nvme/hostkey. If that does not exist no in-band authentication + /usr/local/etc/nvme/hostkey. If that does not exist no in-band authentication is attempted.

    @@ -1162,7 +1162,7 @@ and Christoph Hellwig

    diff --git a/Documentation/nvme-copy.1 b/Documentation/nvme-copy.1 index 34e8161..12e9ee2 100644 --- a/Documentation/nvme-copy.1 +++ b/Documentation/nvme-copy.1 @@ -2,12 +2,12 @@ .\" Title: nvme-copy .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-COPY" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-COPY" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-copy.html b/Documentation/nvme-copy.html index a896ba8..08e9eb9 100644 --- a/Documentation/nvme-copy.html +++ b/Documentation/nvme-copy.html @@ -982,7 +982,7 @@ logical block ranges to a single consecutive destination logical block range.

  • diff --git a/Documentation/nvme-create-ns.1 b/Documentation/nvme-create-ns.1 index 96cb562..4e191fc 100644 --- a/Documentation/nvme-create-ns.1 +++ b/Documentation/nvme-create-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-create-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CREATE\-NS" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-CREATE\-NS" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -43,19 +43,15 @@ nvme-create-ns \- Send NVMe Namespace management command to create namespace, re [\-\-lbstm= | \-l ] [\-\-block\-size= | \-b ] [\-\-timeout= | \-t ] -DESCRIPTION + [\-\-nsze\-si= | \-S ] + [\-\-ncap\-si= | \-C ] .fi +.SH "DESCRIPTION" .sp -.nf -For the NVMe device given, sends a namespace management command to create -the namespace with the requested settings\&. On success, the namespace -identifier assigned by the controller is returned\&. - -The parameter is mandatory and may be either the NVMe character -device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&. - -OPTIONS -.fi +For the NVMe device given, sends a namespace management command to create the namespace with the requested settings\&. On success, the namespace identifier assigned by the controller is returned\&. +.sp +The 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 \-s, \-\-nsze .RS 4 @@ -106,9 +102,39 @@ Logical Block Storage Tag Mask for end\-to\-end protection\&. .RS 4 Target block size the new namespace should be formatted as\&. Potential FLBAS values will be values will be scanned and the lowest numbered will be selected for the create\-ns operation\&. Conflicts with \-\-flbas argument\&. .RE +.PP +\-S, \-\-nsze\-si +.RS 4 +The namespace size (NSZE) in standard SI units\&. The value SI suffixed is divided by the namespace LBA size to set as NSZE\&. If the value not suffixed it is set as same with the nsze option\&. +.RE +.PP +\-C, \-\-ncap\-si +.RS 4 +The namespace capacity (NCAP) in standard SI units\&. The value SI suffixed is divided by the namespace LBA size to set as NCAP\&. If the value not suffixed it is set as same with the ncap option\&. +.RE .SH "EXAMPLES" .sp -No examples provided yet\&. +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Create a namespace: +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme create\-ns /dev/nvme0 \-\-nsze 11995709440 \-\-ncap 1199570940 \-\-flbas 0 \-\-dps 0 \-\-nmic 0 +# nvme create\-ns /dev/nvme0 \-\-nsze\-si 6\&.14T \-\-ncap 1199570940 \-\-flbas 0 \-\-dps 0 \-\-nmic 0 +.fi +.if n \{\ +.RE +.\} +.RE .SH "NVME" .sp Part of the nvme\-user suite diff --git a/Documentation/nvme-create-ns.html b/Documentation/nvme-create-ns.html index 1ce2ef9..dec4ee0 100644 --- a/Documentation/nvme-create-ns.html +++ b/Documentation/nvme-create-ns.html @@ -760,20 +760,25 @@ nvme-create-ns(1) Manual Page [--lbstm=<lbstm> | -l <lbstm>] [--block-size=<block-size> | -b <block-size>] [--timeout=<timeout> | -t <timeout>] -DESCRIPTION + [--nsze-si=<nsze-si> | -S <nsze-si>] + [--ncap-si=<ncap-si> | -C <ncap-si>]
    -
    -
    -
    For the NVMe device given, sends a namespace management command to create
    +
    +
    +
    +

    DESCRIPTION

    +
    +

    For the NVMe device given, sends a namespace management command to create the namespace with the requested settings. On success, the namespace -identifier assigned by the controller is returned. - -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 -

    +identifier assigned by the controller is returned.

    +

    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

    +
    -s @@ -890,13 +895,50 @@ OPTIONS selected for the create-ns operation. Conflicts with --flbas argument.

    +
    +-S +
    +
    +--nsze-si +
    +
    +

    + The namespace size (NSZE) in standard SI units. + The value SI suffixed is divided by the namespace LBA size to set as NSZE. + If the value not suffixed it is set as same with the nsze option. +

    +
    +
    +-C +
    +
    +--ncap-si +
    +
    +

    + The namespace capacity (NCAP) in standard SI units. + The value SI suffixed is divided by the namespace LBA size to set as NCAP. + If the value not suffixed it is set as same with the ncap option. +

    +

    EXAMPLES

    -

    No examples provided yet.

    +
      +
    • +

      +Create a namespace: +

      +
      +
      +
      # nvme create-ns /dev/nvme0 --nsze 11995709440 --ncap 1199570940 --flbas 0 --dps 0 --nmic 0
      +# nvme create-ns /dev/nvme0 --nsze-si 6.14T --ncap 1199570940 --flbas 0 --dps 0 --nmic 0
      +
      +
    • +
    @@ -910,7 +952,7 @@ OPTIONS diff --git a/Documentation/nvme-create-ns.txt b/Documentation/nvme-create-ns.txt index a17c70d..dfa5656 100644 --- a/Documentation/nvme-create-ns.txt +++ b/Documentation/nvme-create-ns.txt @@ -19,6 +19,9 @@ SYNOPSIS [--lbstm= | -l ] [--block-size= | -b ] [--timeout= | -t ] + [--nsze-si= | -S ] + [--ncap-si= | -C ] + DESCRIPTION ----------- For the NVMe device given, sends a namespace management command to create @@ -75,10 +78,26 @@ OPTIONS values will be values will be scanned and the lowest numbered will be selected for the create-ns operation. Conflicts with --flbas argument. +-S:: +--nsze-si:: + The namespace size (NSZE) in standard SI units. + The value SI suffixed is divided by the namespace LBA size to set as NSZE. + If the value not suffixed it is set as same with the nsze option. + +-C:: +--ncap-si:: + The namespace capacity (NCAP) in standard SI units. + The value SI suffixed is divided by the namespace LBA size to set as NCAP. + If the value not suffixed it is set as same with the ncap option. EXAMPLES -------- -No examples provided yet. +* Create a namespace: ++ +------------ +# nvme create-ns /dev/nvme0 --nsze 11995709440 --ncap 1199570940 --flbas 0 --dps 0 --nmic 0 +# nvme create-ns /dev/nvme0 --nsze-si 6.14T --ncap 1199570940 --flbas 0 --dps 0 --nmic 0 +------------ NVME ---- diff --git a/Documentation/nvme-delete-ns.1 b/Documentation/nvme-delete-ns.1 index b6897ea..b0a90e7 100644 --- a/Documentation/nvme-delete-ns.1 +++ b/Documentation/nvme-delete-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-delete-ns.html b/Documentation/nvme-delete-ns.html index 57246f6..c9a4c8a 100644 --- a/Documentation/nvme-delete-ns.html +++ b/Documentation/nvme-delete-ns.html @@ -799,7 +799,7 @@ The '--namespace-id' option is mandatory.

    diff --git a/Documentation/nvme-dera-stat.1 b/Documentation/nvme-dera-stat.1 index d429bac..b99e453 100644 --- a/Documentation/nvme-dera-stat.1 +++ b/Documentation/nvme-dera-stat.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dera-stat .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DERA\-STAT" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-DERA\-STAT" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dera-stat.html b/Documentation/nvme-dera-stat.html index 5737d77..6b621cd 100644 --- a/Documentation/nvme-dera-stat.html +++ b/Documentation/nvme-dera-stat.html @@ -797,7 +797,7 @@ Print the Dera Device status and Additional SMART log page in a human readable f diff --git a/Documentation/nvme-detach-ns.1 b/Documentation/nvme-detach-ns.1 index 8efed67..57b95d6 100644 --- a/Documentation/nvme-detach-ns.1 +++ b/Documentation/nvme-detach-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-detach-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DETACH\-NS" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-DETACH\-NS" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-detach-ns.html b/Documentation/nvme-detach-ns.html index 1140a2f..477e40c 100644 --- a/Documentation/nvme-detach-ns.html +++ b/Documentation/nvme-detach-ns.html @@ -810,7 +810,7 @@ controller identifiers.

    diff --git a/Documentation/nvme-device-self-test.1 b/Documentation/nvme-device-self-test.1 index a9461ff..69d3651 100644 --- a/Documentation/nvme-device-self-test.1 +++ b/Documentation/nvme-device-self-test.1 @@ -2,12 +2,12 @@ .\" Title: nvme-device-self-test .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DEVICE\-SELF\-" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-DEVICE\-SELF\-" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -33,7 +33,7 @@ nvme-device-self-test \- Perform the necessary tests to observe the performance .sp .nf \fInvme device\-self\-test\fR [\-\-namespace\-id= | \-n ] - [\-\-self\-test\-code= | \-s ] + [\-\-self\-test\-code= | \-s ] [\-\-wait | \-w] .fi .SH "DESCRIPTION" .sp @@ -51,7 +51,12 @@ Indicate the namespace in which the device self\-test has to be carried out .PP \-s , \-\-self\-test\-code= .RS 4 -This field specifies the action taken by the device self\-test command : 1h: Start a short device self\-test operation 2h: Start a extended device self\-test operation eh: Start a vendor specific device self\-test operation fh: abort the device self\-test operation +This field specifies the action taken by the device self\-test command : 0h: Show current state of device self\-test operation 1h: Start a short device self\-test operation 2h: Start a extended device self\-test operation eh: Start a vendor specific device self\-test operation fh: Abort the device self\-test operation Default is 0h\&. +.RE +.PP +\-w, \-\-wait +.RS 4 +Wait for the device self test to complete before exiting The device self\-test is aborted by SIGINT signal interrupt for the wait The option is ignored if the abort self\-test code option specified\&. .RE .SH "EXAMPLES" .sp diff --git a/Documentation/nvme-device-self-test.html b/Documentation/nvme-device-self-test.html index 45ce554..ca5f09f 100644 --- a/Documentation/nvme-device-self-test.html +++ b/Documentation/nvme-device-self-test.html @@ -750,7 +750,7 @@ nvme-device-self-test(1) Manual Page
    nvme device-self-test <device> [--namespace-id=<NUM> | -n <NUM>]
    -                        [--self-test-code=<NUM> | -s <NUM>]
    + [--self-test-code=<NUM> | -s <NUM>] [--wait | -w]
    @@ -788,10 +788,25 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).

    This field specifies the action taken by the device self-test command : + 0h: Show current state of device self-test operation 1h: Start a short device self-test operation 2h: Start a extended device self-test operation eh: Start a vendor specific device self-test operation - fh: abort the device self-test operation + fh: Abort the device self-test operation + Default is 0h. +

    + +
    +-w +
    +
    +--wait +
    +
    +

    + Wait for the device self test to complete before exiting + The device self-test is aborted by SIGINT signal interrupt for the wait + The option is ignored if the abort self-test code option specified.

    @@ -833,7 +848,7 @@ Abort the device self-test operation in the namespace-id 1: diff --git a/Documentation/nvme-device-self-test.txt b/Documentation/nvme-device-self-test.txt index 62bba88..d098277 100644 --- a/Documentation/nvme-device-self-test.txt +++ b/Documentation/nvme-device-self-test.txt @@ -9,7 +9,7 @@ SYNOPSIS -------- [verse] 'nvme device-self-test' [--namespace-id= | -n ] - [--self-test-code= | -s ] + [--self-test-code= | -s ] [--wait | -w] DESCRIPTION ----------- @@ -28,12 +28,19 @@ OPTIONS -s :: --self-test-code=:: - This field specifies the action taken by the device self-test command : + This field specifies the action taken by the device self-test command : + 0h: Show current state of device self-test operation 1h: Start a short device self-test operation 2h: Start a extended device self-test operation eh: Start a vendor specific device self-test operation - fh: abort the device self-test operation - + fh: Abort the device self-test operation + Default is 0h. + +-w:: +--wait:: + Wait for the device self test to complete before exiting + The device self-test is aborted by SIGINT signal interrupt for the wait + The option is ignored if the abort self-test code option specified. EXAMPLES -------- diff --git a/Documentation/nvme-dim.1 b/Documentation/nvme-dim.1 index 866eb7d..8cfa143 100644 --- a/Documentation/nvme-dim.1 +++ b/Documentation/nvme-dim.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dim .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DIM" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-DIM" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dim.html b/Documentation/nvme-dim.html index cee3630..30ce918 100644 --- a/Documentation/nvme-dim.html +++ b/Documentation/nvme-dim.html @@ -863,7 +863,7 @@ Deregister from Central Discovery Controller (CDC) associated with nvme4 diff --git a/Documentation/nvme-dir-receive.1 b/Documentation/nvme-dir-receive.1 index c4b46ea..83c460f 100644 --- a/Documentation/nvme-dir-receive.1 +++ b/Documentation/nvme-dir-receive.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dir-receive .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DIR\-RECEIVE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-DIR\-RECEIVE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dir-receive.html b/Documentation/nvme-dir-receive.html index b13de02..135f733 100644 --- a/Documentation/nvme-dir-receive.html +++ b/Documentation/nvme-dir-receive.html @@ -969,7 +969,7 @@ Get streams directive status : diff --git a/Documentation/nvme-dir-send.1 b/Documentation/nvme-dir-send.1 index 2733697..1d52230 100644 --- a/Documentation/nvme-dir-send.1 +++ b/Documentation/nvme-dir-send.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dir-send .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DIR\-SEND" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-DIR\-SEND" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dir-send.html b/Documentation/nvme-dir-send.html index 9710f8b..6707f1f 100644 --- a/Documentation/nvme-dir-send.html +++ b/Documentation/nvme-dir-send.html @@ -982,7 +982,7 @@ Release stream ID 3 : diff --git a/Documentation/nvme-disconnect-all.1 b/Documentation/nvme-disconnect-all.1 index f40e9b8..297e2a1 100644 --- a/Documentation/nvme-disconnect-all.1 +++ b/Documentation/nvme-disconnect-all.1 @@ -2,12 +2,12 @@ .\" Title: nvme-disconnect-all .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DISCONNECT\-AL" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-DISCONNECT\-AL" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-disconnect-all.html b/Documentation/nvme-disconnect-all.html index 0e5c5b4..8857a29 100644 --- a/Documentation/nvme-disconnect-all.html +++ b/Documentation/nvme-disconnect-all.html @@ -795,7 +795,7 @@ Disconnect all existing nvme controllers: diff --git a/Documentation/nvme-disconnect.1 b/Documentation/nvme-disconnect.1 index 703cc23..09062da 100644 --- a/Documentation/nvme-disconnect.1 +++ b/Documentation/nvme-disconnect.1 @@ -2,12 +2,12 @@ .\" Title: nvme-disconnect .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DISCONNECT" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-DISCONNECT" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-disconnect.html b/Documentation/nvme-disconnect.html index 4f77f80..8ba09f6 100644 --- a/Documentation/nvme-disconnect.html +++ b/Documentation/nvme-disconnect.html @@ -839,7 +839,7 @@ Disconnect the controller nvme4 diff --git a/Documentation/nvme-discover.1 b/Documentation/nvme-discover.1 index 547900c..cc5dc49 100644 --- a/Documentation/nvme-discover.1 +++ b/Documentation/nvme-discover.1 @@ -2,12 +2,12 @@ .\" Title: nvme-discover .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DISCOVER" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-DISCOVER" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -63,7 +63,7 @@ nvme-discover \- Send Get Log Page request to Discovery Controller\&. .sp Send one or more Get Log Page requests to a NVMe\-over\-Fabrics Discovery Controller\&. .sp -If no parameters are given, then \fInvme discover\fR 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\&. +If no parameters are given, then \fInvme discover\fR will attempt to find a /usr/local/etc/nvme/discovery\&.conf file to use to supply a list of Discovery commands to run\&. If no /usr/local/etc/nvme/discovery\&.conf file exists, the command will quit with an error\&. .sp Otherwise, a specific Discovery Controller should be specified using the \-\-transport, \-\-traddr, and if necessary the \-\-trsvcid flags\&. A Discovery request will then be sent to the specified Discovery Controller\&. .SH "BACKGROUND" @@ -142,7 +142,7 @@ This field specifies the network interface used on the host to connect to the Co .PP \-q , \-\-hostnqn= .RS 4 -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\&. +Overrides the default host NQN that identifies the NVMe Host\&. If this option is not specified, the default is read from /usr/local/etc/nvme/hostnqn first\&. If that does not exist, the autogenerated NQN value from the NVMe Host kernel module is used next\&. .RE .PP \-I , \-\-hostid= @@ -166,7 +166,7 @@ This field takes a device as input\&. Device is in the format of nvme*, eg\&. nv .PP \-C , \-\-config\-file= .RS 4 -Use the specified JSON configuration file instead of the default /etc/nvme/config\&.json file or +Use the specified JSON configuration file instead of the default /usr/local/etc/nvme/config\&.json file or \fInone\fR to not read in an existing configuration file\&. The JSON configuration file format is documented in \m[blue]\fBhttps://github\&.com/linux\-nvme/libnvme/doc/config\-schema\&.json\fR\m[] @@ -278,7 +278,7 @@ Query the Discover Controller with IP4 address 192\&.168\&.1\&.3 for all resourc .\} Issue a \fInvme discover\fR -command using a /etc/nvme/discovery\&.conf file: +command using a /usr/local/etc/nvme/discovery\&.conf file: .sp .if n \{\ .RS 4 diff --git a/Documentation/nvme-discover.html b/Documentation/nvme-discover.html index 81063a4..17d8e51 100644 --- a/Documentation/nvme-discover.html +++ b/Documentation/nvme-discover.html @@ -785,8 +785,8 @@ nvme-discover(1) Manual Page

    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 -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 +find a /usr/local/etc/nvme/discovery.conf file to use to supply a list of +Discovery commands to run. If no /usr/local/etc/nvme/discovery.conf file exists, the command will quit with an error.

    Otherwise, a specific Discovery Controller should be specified using the --transport, --traddr, and if necessary the --trsvcid flags. A Discovery @@ -937,7 +937,7 @@ cellspacing="0" cellpadding="4">

    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 + /usr/local/etc/nvme/hostnqn first. If that does not exist, the autogenerated NQN value from the NVMe Host kernel module is used next.

    @@ -987,7 +987,7 @@ cellspacing="0" cellpadding="4">

    Use the specified JSON configuration file instead of the - default /etc/nvme/config.json file or none to not read in + default /usr/local/etc/nvme/config.json file or none to not read in an existing configuration file. The JSON configuration file format is documented in https://github.com/linux-nvme/libnvme/doc/config-schema.json @@ -1176,7 +1176,7 @@ Port 4420 is used by default:

  • -Issue a nvme discover command using a /etc/nvme/discovery.conf file: +Issue a nvme discover command using a /usr/local/etc/nvme/discovery.conf file:

    @@ -1218,7 +1218,7 @@ nvme-connect-all(1)

    diff --git a/Documentation/nvme-dsm.1 b/Documentation/nvme-dsm.1 index e6f4fe2..b03a15d 100644 --- a/Documentation/nvme-dsm.1 +++ b/Documentation/nvme-dsm.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dsm .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DSM" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-DSM" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dsm.html b/Documentation/nvme-dsm.html index 942198f..ccfff82 100644 --- a/Documentation/nvme-dsm.html +++ b/Documentation/nvme-dsm.html @@ -893,7 +893,7 @@ any settings from the flags may have provided.

    diff --git a/Documentation/nvme-effects-log.1 b/Documentation/nvme-effects-log.1 index 4e1856f..e136ccf 100644 --- a/Documentation/nvme-effects-log.1 +++ b/Documentation/nvme-effects-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-effects-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-EFFECTS\-LOG" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-EFFECTS\-LOG" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-effects-log.html b/Documentation/nvme-effects-log.html index ec6a645..efc7c48 100644 --- a/Documentation/nvme-effects-log.html +++ b/Documentation/nvme-effects-log.html @@ -847,7 +847,7 @@ Have the program return the raw structure in binary: diff --git a/Documentation/nvme-endurance-event-agg-log.1 b/Documentation/nvme-endurance-event-agg-log.1 index 6d45580..df4c723 100644 --- a/Documentation/nvme-endurance-event-agg-log.1 +++ b/Documentation/nvme-endurance-event-agg-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-endurance-event-agg-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ENDURANCE\-EVE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ENDURANCE\-EVE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-endurance-event-agg-log.html b/Documentation/nvme-endurance-event-agg-log.html index 5950eae..dc52e46 100644 --- a/Documentation/nvme-endurance-event-agg-log.html +++ b/Documentation/nvme-endurance-event-agg-log.html @@ -851,7 +851,7 @@ Print the raw Endurance log to a file: diff --git a/Documentation/nvme-endurance-log.1 b/Documentation/nvme-endurance-log.1 index bfea30b..1a09df9 100644 --- a/Documentation/nvme-endurance-log.1 +++ b/Documentation/nvme-endurance-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-endurance-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ENDURANCE\-LOG" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ENDURANCE\-LOG" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-endurance-log.html b/Documentation/nvme-endurance-log.html index fc79319..c8b2bd8 100644 --- a/Documentation/nvme-endurance-log.html +++ b/Documentation/nvme-endurance-log.html @@ -834,7 +834,7 @@ Print the raw Endurance log to a file: diff --git a/Documentation/nvme-error-log.1 b/Documentation/nvme-error-log.1 index 527e173..03b4777 100644 --- a/Documentation/nvme-error-log.1 +++ b/Documentation/nvme-error-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-error-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ERROR\-LOG" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ERROR\-LOG" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-error-log.html b/Documentation/nvme-error-log.html index 480e3a7..51c5b4d 100644 --- a/Documentation/nvme-error-log.html +++ b/Documentation/nvme-error-log.html @@ -849,7 +849,7 @@ Print the raw output to a file: diff --git a/Documentation/nvme-fdp-configs.1 b/Documentation/nvme-fdp-configs.1 new file mode 100644 index 0000000..499e5bc --- /dev/null +++ b/Documentation/nvme-fdp-configs.1 @@ -0,0 +1,69 @@ +'\" t +.\" Title: nvme-fdp-configs +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 01/30/2023 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-FDP\-CONFIGS" "1" "01/30/2023" "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-fdp-configs \- Get Flexible Data Placement Configurations +.SH "SYNOPSIS" +.sp +.nf +\fInvme fdp configs\fR [\-\-endgrp\-id= | \-e ] + [\-\-human\-readable | \-H] + [\-\-raw\-binary | \-b] + [\-\-output\-format= | \-o ] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, and the endurance group identifier specified, list the possible configurations for Flexible Data Placement\&. +.SH "OPTIONS" +.PP +\-e , \-\-endgrp\-id= +.RS 4 +The endurance group identifier to use when requesting the log page\&. +.RE +.PP +\-H, \-\-human\-readable +.RS 4 +Parse, print and describe individual parts of bitfields\&. +.RE +.PP +\-b, \-\-raw\-binary +.RS 4 +Print the raw buffer to the standard output stream\&. +.RE +.PP +\-o , \-\-output\-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 "NVME" +.sp +Part of nvme\-cli diff --git a/Documentation/nvme-fdp-configs.html b/Documentation/nvme-fdp-configs.html new file mode 100644 index 0000000..76a7be1 --- /dev/null +++ b/Documentation/nvme-fdp-configs.html @@ -0,0 +1,834 @@ + + + + + + +nvme-fdp-configs(1) + + + + + +
    +
    +

    SYNOPSIS

    +
    +
    +
    nvme fdp configs <device> [--endgrp-id=<NUM> | -e <NUM>]
    +                            [--human-readable | -H]
    +                            [--raw-binary | -b]
    +                            [--output-format=<FMT> | -o <FMT>]
    +
    +
    +
    +
    +
    +

    DESCRIPTION

    +
    +

    For the NVMe device given, and the endurance group identifier specified, list +the possible configurations for Flexible Data Placement.

    +
    +
    +
    +

    OPTIONS

    +
    +
    +
    +-e <NUM> +
    +
    +--endgrp-id=<NUM> +
    +
    +

    + The endurance group identifier to use when requesting the log page. +

    +
    +
    +-H +
    +
    +--human-readable +
    +
    +

    + Parse, print and describe individual parts of bitfields. +

    +
    +
    +-b +
    +
    +--raw-binary +
    +
    +

    + Print the raw buffer to the standard output stream. +

    +
    +
    +-o <format> +
    +
    +--output-format=<format> +
    +
    +

    + Set the reporting format to normal, json, or binary. Only one + output format can be used at a time. +

    +
    +
    +
    +
    +
    +

    NVME

    +
    +

    Part of nvme-cli

    +
    +
    +
    +

    + + + diff --git a/Documentation/nvme-fdp-configs.txt b/Documentation/nvme-fdp-configs.txt new file mode 100644 index 0000000..c4311fb --- /dev/null +++ b/Documentation/nvme-fdp-configs.txt @@ -0,0 +1,42 @@ +nvme-fdp-configs(1) +=================== + +NAME +---- +nvme-fdp-configs - Get Flexible Data Placement Configurations + +SYNOPSIS +-------- +[verse] +'nvme fdp configs' [--endgrp-id= | -e ] + [--human-readable | -H] + [--raw-binary | -b] + [--output-format= | -o ] + +DESCRIPTION +----------- +For the NVMe device given, and the endurance group identifier specified, list +the possible configurations for Flexible Data Placement. + +OPTIONS +------- +-e :: +--endgrp-id=:: + The endurance group identifier to use when requesting the log page. + +-H:: +--human-readable:: + Parse, print and describe individual parts of bitfields. + +-b:: +--raw-binary:: + Print the raw buffer to the standard output stream. + +-o :: +--output-format=:: + Set the reporting format to 'normal', 'json', or 'binary'. Only one + output format can be used at a time. + +NVME +---- +Part of nvme-cli diff --git a/Documentation/nvme-fdp-events.1 b/Documentation/nvme-fdp-events.1 new file mode 100644 index 0000000..b8f7e46 --- /dev/null +++ b/Documentation/nvme-fdp-events.1 @@ -0,0 +1,69 @@ +'\" t +.\" Title: nvme-fdp-events +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 01/30/2023 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-FDP\-EVENTS" "1" "01/30/2023" "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-fdp-events \- Get Flexible Data Placement Events +.SH "SYNOPSIS" +.sp +.nf +\fInvme fdp events\fR [\-\-endgrp\-id= | \-e ] + [\-\-host\-events | \-E] + [\-\-raw\-binary | \-b] + [\-\-output\-format= | \-o ] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, provide information about events affecting Reclaim Units and media usage in an Endurance Group\&. +.SH "OPTIONS" +.PP +\-e , \-\-endgrp\-id= +.RS 4 +The endurance group identifier to use when requesting the log page\&. +.RE +.PP +\-E, \-\-host\-events +.RS 4 +Request the controller to report host events\&. +.RE +.PP +\-b, \-\-raw\-binary +.RS 4 +Print the raw buffer to the standard output stream\&. +.RE +.PP +\-o , \-\-output\-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 "NVME" +.sp +Part of nvme\-cli diff --git a/Documentation/nvme-fdp-events.html b/Documentation/nvme-fdp-events.html new file mode 100644 index 0000000..293bdd1 --- /dev/null +++ b/Documentation/nvme-fdp-events.html @@ -0,0 +1,834 @@ + + + + + + +nvme-fdp-events(1) + + + + + +
    +
    +

    SYNOPSIS

    +
    +
    +
    nvme fdp events <device> [--endgrp-id=<NUM> | -e <NUM>]
    +                           [--host-events | -E]
    +                           [--raw-binary | -b]
    +                           [--output-format=<FMT> | -o <FMT>]
    +
    +
    +
    +
    +
    +

    DESCRIPTION

    +
    +

    For the NVMe device given, provide information about events affecting Reclaim +Units and media usage in an Endurance Group.

    +
    +
    +
    +

    OPTIONS

    +
    +
    +
    +-e <NUM> +
    +
    +--endgrp-id=<NUM> +
    +
    +

    + The endurance group identifier to use when requesting the log page. +

    +
    +
    +-E +
    +
    +--host-events +
    +
    +

    + Request the controller to report host events. +

    +
    +
    +-b +
    +
    +--raw-binary +
    +
    +

    + Print the raw buffer to the standard output stream. +

    +
    +
    +-o <format> +
    +
    +--output-format=<format> +
    +
    +

    + Set the reporting format to normal, json, or binary. Only one + output format can be used at a time. +

    +
    +
    +
    +
    +
    +

    NVME

    +
    +

    Part of nvme-cli

    +
    +
    +
    +

    + + + diff --git a/Documentation/nvme-fdp-events.txt b/Documentation/nvme-fdp-events.txt new file mode 100644 index 0000000..606a163 --- /dev/null +++ b/Documentation/nvme-fdp-events.txt @@ -0,0 +1,42 @@ +nvme-fdp-events(1) +================== + +NAME +---- +nvme-fdp-events - Get Flexible Data Placement Events + +SYNOPSIS +-------- +[verse] +'nvme fdp events' [--endgrp-id= | -e ] + [--host-events | -E] + [--raw-binary | -b] + [--output-format= | -o ] + +DESCRIPTION +----------- +For the NVMe device given, provide information about events affecting Reclaim +Units and media usage in an Endurance Group. + +OPTIONS +------- +-e :: +--endgrp-id=:: + The endurance group identifier to use when requesting the log page. + +-E:: +--host-events:: + Request the controller to report host events. + +-b:: +--raw-binary:: + Print the raw buffer to the standard output stream. + +-o :: +--output-format=:: + Set the reporting format to 'normal', 'json', or 'binary'. Only one + output format can be used at a time. + +NVME +---- +Part of nvme-cli diff --git a/Documentation/nvme-fdp-set-events.1 b/Documentation/nvme-fdp-set-events.1 new file mode 100644 index 0000000..b081ff3 --- /dev/null +++ b/Documentation/nvme-fdp-set-events.1 @@ -0,0 +1,64 @@ +'\" t +.\" Title: nvme-fdp-set-events +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 01/30/2023 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-FDP\-SET\-EVEN" "1" "01/30/2023" "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-fdp-set-events \- Enable or disable FDP events +.SH "SYNOPSIS" +.sp +.nf +\fInvme fdp set\-events\fR [\-\-namespace\-id= | \-n ] + [\-\-placement\-handle= | \-p ] + [\-\-enable | \-e] + [\-\-event\-types= | \-t ] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, enable or disable a list of event types from being generated for the Reclaim Unit Handle reference by the specified Placement Handle\&. +.SH "OPTIONS" +.PP +\-n , \-\-namespace\-id= +.RS 4 +Namespace identifier\&. +.RE +.PP +\-b, \-\-raw\-binary +.RS 4 +Print the raw buffer to the standard output stream\&. +.RE +.PP +\-o , \-\-output\-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 "NVME" +.sp +Part of nvme\-cli diff --git a/Documentation/nvme-fdp-set-events.html b/Documentation/nvme-fdp-set-events.html new file mode 100644 index 0000000..30b80f3 --- /dev/null +++ b/Documentation/nvme-fdp-set-events.html @@ -0,0 +1,824 @@ + + + + + + +nvme-fdp-set-events(1) + + + + + +
    +
    +

    SYNOPSIS

    +
    +
    +
    nvme fdp set-events <device> [--namespace-id=<NUM> | -n <NUM>]
    +                               [--placement-handle=<NUM> | -p <NUM>]
    +                               [--enable | -e]
    +                               [--event-types=<NUM,> | -t <NUM,>]
    +
    +
    +
    +
    +
    +

    DESCRIPTION

    +
    +

    For the NVMe device given, enable or disable a list of event types from being +generated for the Reclaim Unit Handle reference by the specified Placement +Handle.

    +
    +
    +
    +

    OPTIONS

    +
    +
    +
    +-n <NUM> +
    +
    +--namespace-id=<NUM> +
    +
    +

    + Namespace identifier. +

    +
    +
    +-b +
    +
    +--raw-binary +
    +
    +

    + Print the raw buffer to the standard output stream. +

    +
    +
    +-o <format> +
    +
    +--output-format=<format> +
    +
    +

    + Set the reporting format to normal, json, or binary. Only one + output format can be used at a time. +

    +
    +
    +
    +
    +
    +

    NVME

    +
    +

    Part of nvme-cli

    +
    +
    +
    +

    + + + diff --git a/Documentation/nvme-fdp-set-events.txt b/Documentation/nvme-fdp-set-events.txt new file mode 100644 index 0000000..b45819b --- /dev/null +++ b/Documentation/nvme-fdp-set-events.txt @@ -0,0 +1,39 @@ +nvme-fdp-set-events(1) +====================== + +NAME +---- +nvme-fdp-set-events - Enable or disable FDP events + +SYNOPSIS +-------- +[verse] +'nvme fdp set-events' [--namespace-id= | -n ] + [--placement-handle= | -p ] + [--enable | -e] + [--event-types= | -t ] + +DESCRIPTION +----------- +For the NVMe device given, enable or disable a list of event types from being +generated for the Reclaim Unit Handle reference by the specified Placement +Handle. + +OPTIONS +------- +-n :: +--namespace-id=:: + Namespace identifier. + +-b:: +--raw-binary:: + Print the raw buffer to the standard output stream. + +-o :: +--output-format=:: + Set the reporting format to 'normal', 'json', or 'binary'. Only one + output format can be used at a time. + +NVME +---- +Part of nvme-cli diff --git a/Documentation/nvme-fdp-stats.1 b/Documentation/nvme-fdp-stats.1 new file mode 100644 index 0000000..4b8498e --- /dev/null +++ b/Documentation/nvme-fdp-stats.1 @@ -0,0 +1,63 @@ +'\" t +.\" Title: nvme-fdp-stats +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 01/30/2023 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-FDP\-STATS" "1" "01/30/2023" "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-fdp-stats \- Get Flexible Data Placement Statistics +.SH "SYNOPSIS" +.sp +.nf +\fInvme fdp stats\fR [\-\-endgrp\-id= | \-e ] + [\-\-raw\-binary | \-b] + [\-\-output\-format= | \-o ] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, provide information about the FDP configuration over the life of the FDP configuration in an Endurance Group\&. +.SH "OPTIONS" +.PP +\-e , \-\-endgrp\-id= +.RS 4 +The endurance group identifier to use when requesting the log page\&. +.RE +.PP +\-b, \-\-raw\-binary +.RS 4 +Print the raw buffer to the standard output stream\&. +.RE +.PP +\-o , \-\-output\-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 "NVME" +.sp +Part of nvme\-cli diff --git a/Documentation/nvme-fdp-stats.html b/Documentation/nvme-fdp-stats.html new file mode 100644 index 0000000..2283a4d --- /dev/null +++ b/Documentation/nvme-fdp-stats.html @@ -0,0 +1,822 @@ + + + + + + +nvme-fdp-stats(1) + + + + + +
    +
    +

    SYNOPSIS

    +
    +
    +
    nvme fdp stats <device> [--endgrp-id=<NUM> | -e <NUM>]
    +                          [--raw-binary | -b]
    +                          [--output-format=<FMT> | -o <FMT>]
    +
    +
    +
    +
    +
    +

    DESCRIPTION

    +
    +

    For the NVMe device given, provide information about the FDP configuration over +the life of the FDP configuration in an Endurance Group.

    +
    +
    +
    +

    OPTIONS

    +
    +
    +
    +-e <NUM> +
    +
    +--endgrp-id=<NUM> +
    +
    +

    + The endurance group identifier to use when requesting the log page. +

    +
    +
    +-b +
    +
    +--raw-binary +
    +
    +

    + Print the raw buffer to the standard output stream. +

    +
    +
    +-o <format> +
    +
    +--output-format=<format> +
    +
    +

    + Set the reporting format to normal, json, or binary. Only one + output format can be used at a time. +

    +
    +
    +
    +
    +
    +

    NVME

    +
    +

    Part of nvme-cli

    +
    +
    +
    +

    + + + diff --git a/Documentation/nvme-fdp-stats.txt b/Documentation/nvme-fdp-stats.txt new file mode 100644 index 0000000..7f96065 --- /dev/null +++ b/Documentation/nvme-fdp-stats.txt @@ -0,0 +1,37 @@ +nvme-fdp-stats(1) +================= + +NAME +---- +nvme-fdp-stats - Get Flexible Data Placement Statistics + +SYNOPSIS +-------- +[verse] +'nvme fdp stats' [--endgrp-id= | -e ] + [--raw-binary | -b] + [--output-format= | -o ] + +DESCRIPTION +----------- +For the NVMe device given, provide information about the FDP configuration over +the life of the FDP configuration in an Endurance Group. + +OPTIONS +------- +-e :: +--endgrp-id=:: + The endurance group identifier to use when requesting the log page. + +-b:: +--raw-binary:: + Print the raw buffer to the standard output stream. + +-o :: +--output-format=:: + Set the reporting format to 'normal', 'json', or 'binary'. Only one + output format can be used at a time. + +NVME +---- +Part of nvme-cli diff --git a/Documentation/nvme-fdp-status.1 b/Documentation/nvme-fdp-status.1 new file mode 100644 index 0000000..bb3f25f --- /dev/null +++ b/Documentation/nvme-fdp-status.1 @@ -0,0 +1,63 @@ +'\" t +.\" Title: nvme-fdp-status +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 01/30/2023 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-FDP\-STATUS" "1" "01/30/2023" "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-fdp-status \- Get Reclaim Unit Handle Status +.SH "SYNOPSIS" +.sp +.nf +\fInvme fdp status\fR [\-\-namespace\-id= | \-n ] + [\-\-raw\-binary | \-b] + [\-\-output\-format= | \-o ] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, provide information about Reclaim Unit Handles that are accessible by the specified namespace\&. +.SH "OPTIONS" +.PP +\-n , \-\-namespace\-id= +.RS 4 +Namespace identifier\&. +.RE +.PP +\-b, \-\-raw\-binary +.RS 4 +Print the raw buffer to the standard output stream\&. +.RE +.PP +\-o , \-\-output\-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 "NVME" +.sp +Part of nvme\-cli diff --git a/Documentation/nvme-fdp-status.html b/Documentation/nvme-fdp-status.html new file mode 100644 index 0000000..aa26b4c --- /dev/null +++ b/Documentation/nvme-fdp-status.html @@ -0,0 +1,822 @@ + + + + + + +nvme-fdp-status(1) + + + + + +
    +
    +

    SYNOPSIS

    +
    +
    +
    nvme fdp status <device> [--namespace-id=<NUM> | -n <NUM>]
    +                           [--raw-binary | -b]
    +                           [--output-format=<FMT> | -o <FMT>]
    +
    +
    +
    +
    +
    +

    DESCRIPTION

    +
    +

    For the NVMe device given, provide information about Reclaim Unit Handles that +are accessible by the specified namespace.

    +
    +
    +
    +

    OPTIONS

    +
    +
    +
    +-n <NUM> +
    +
    +--namespace-id=<NUM> +
    +
    +

    + Namespace identifier. +

    +
    +
    +-b +
    +
    +--raw-binary +
    +
    +

    + Print the raw buffer to the standard output stream. +

    +
    +
    +-o <format> +
    +
    +--output-format=<format> +
    +
    +

    + Set the reporting format to normal, json, or binary. Only one + output format can be used at a time. +

    +
    +
    +
    +
    +
    +

    NVME

    +
    +

    Part of nvme-cli

    +
    +
    +
    +

    + + + diff --git a/Documentation/nvme-fdp-status.txt b/Documentation/nvme-fdp-status.txt new file mode 100644 index 0000000..263cb4c --- /dev/null +++ b/Documentation/nvme-fdp-status.txt @@ -0,0 +1,37 @@ +nvme-fdp-status(1) +================== + +NAME +---- +nvme-fdp-status - Get Reclaim Unit Handle Status + +SYNOPSIS +-------- +[verse] +'nvme fdp status' [--namespace-id= | -n ] + [--raw-binary | -b] + [--output-format= | -o ] + +DESCRIPTION +----------- +For the NVMe device given, provide information about Reclaim Unit Handles that +are accessible by the specified namespace. + +OPTIONS +------- +-n :: +--namespace-id=:: + Namespace identifier. + +-b:: +--raw-binary:: + Print the raw buffer to the standard output stream. + +-o :: +--output-format=:: + Set the reporting format to 'normal', 'json', or 'binary'. Only one + output format can be used at a time. + +NVME +---- +Part of nvme-cli diff --git a/Documentation/nvme-fdp-update.1 b/Documentation/nvme-fdp-update.1 new file mode 100644 index 0000000..a7b56b6 --- /dev/null +++ b/Documentation/nvme-fdp-update.1 @@ -0,0 +1,54 @@ +'\" t +.\" Title: nvme-fdp-update +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 01/30/2023 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-FDP\-UPDATE" "1" "01/30/2023" "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-fdp-update \- Reclaim Unit Handle Update +.SH "SYNOPSIS" +.sp +.nf +\fInvme fdp update\fR [\-\-namespace\-id= | \-n ] + [\-\-pids= | \-p ] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, update the given Placement Identifiers to reference a different Reclaim Unit accessible by the specified namespace\&. +.SH "OPTIONS" +.PP +\-n , \-\-namespace\-id= +.RS 4 +Namespace identifier\&. +.RE +.PP +\-p , \-\-pids= +.RS 4 +Comma\-separated list of placement identifiers to update\&. +.RE +.SH "NVME" +.sp +Part of nvme\-cli diff --git a/Documentation/nvme-fdp-update.html b/Documentation/nvme-fdp-update.html new file mode 100644 index 0000000..71ccd32 --- /dev/null +++ b/Documentation/nvme-fdp-update.html @@ -0,0 +1,809 @@ + + + + + + +nvme-fdp-update(1) + + + + + +
    +
    +

    SYNOPSIS

    +
    +
    +
    nvme fdp update <device> [--namespace-id=<NUM> | -n <NUM>]
    +                           [--pids=<NUM,> | -p <NUM,>]
    +
    +
    +
    +
    +
    +

    DESCRIPTION

    +
    +

    For the NVMe device given, update the given Placement Identifiers to reference +a different Reclaim Unit accessible by the specified namespace.

    +
    +
    +
    +

    OPTIONS

    +
    +
    +
    +-n <NUM> +
    +
    +--namespace-id=<NUM> +
    +
    +

    + Namespace identifier. +

    +
    +
    +-p <NUM,> +
    +
    +--pids=<NUM,> +
    +
    +

    + Comma-separated list of placement identifiers to update. +

    +
    +
    +
    +
    +
    +

    NVME

    +
    +

    Part of nvme-cli

    +
    +
    +
    +

    + + + diff --git a/Documentation/nvme-fdp-update.txt b/Documentation/nvme-fdp-update.txt new file mode 100644 index 0000000..4b70c24 --- /dev/null +++ b/Documentation/nvme-fdp-update.txt @@ -0,0 +1,31 @@ +nvme-fdp-update(1) +================== + +NAME +---- +nvme-fdp-update - Reclaim Unit Handle Update + +SYNOPSIS +-------- +[verse] +'nvme fdp update' [--namespace-id= | -n ] + [--pids= | -p ] + +DESCRIPTION +----------- +For the NVMe device given, update the given Placement Identifiers to reference +a different Reclaim Unit accessible by the specified namespace. + +OPTIONS +------- +-n :: +--namespace-id=:: + Namespace identifier. + +-p :: +--pids=:: + Comma-separated list of placement identifiers to update. + +NVME +---- +Part of nvme-cli diff --git a/Documentation/nvme-fdp-usage.1 b/Documentation/nvme-fdp-usage.1 new file mode 100644 index 0000000..948eec3 --- /dev/null +++ b/Documentation/nvme-fdp-usage.1 @@ -0,0 +1,63 @@ +'\" t +.\" Title: nvme-fdp-usage +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 01/30/2023 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-FDP\-USAGE" "1" "01/30/2023" "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-fdp-usage \- Get Reclaim Unit Handle Usage +.SH "SYNOPSIS" +.sp +.nf +\fInvme fdp usage\fR [\-\-endgrp\-id= | \-e ] + [\-\-raw\-binary | \-b] + [\-\-output\-format= | \-o ] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, provide information about the Reclaim Unit Handles associated with the Placement Handles of the namespaces in the specified Endurance Group\&. +.SH "OPTIONS" +.PP +\-e , \-\-endgrp\-id= +.RS 4 +The endurance group identifier to use when requesting the log page\&. +.RE +.PP +\-b, \-\-raw\-binary +.RS 4 +Print the raw buffer to the standard output stream\&. +.RE +.PP +\-o , \-\-output\-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 "NVME" +.sp +Part of nvme\-cli diff --git a/Documentation/nvme-fdp-usage.html b/Documentation/nvme-fdp-usage.html new file mode 100644 index 0000000..f60edab --- /dev/null +++ b/Documentation/nvme-fdp-usage.html @@ -0,0 +1,823 @@ + + + + + + +nvme-fdp-usage(1) + + + + + +
    +
    +

    SYNOPSIS

    +
    +
    +
    nvme fdp usage <device> [--endgrp-id=<NUM> | -e <NUM>]
    +                          [--raw-binary | -b]
    +                          [--output-format=<FMT> | -o <FMT>]
    +
    +
    +
    +
    +
    +

    DESCRIPTION

    +
    +

    For the NVMe device given, provide information about the Reclaim Unit Handles +associated with the Placement Handles of the namespaces in the specified +Endurance Group.

    +
    +
    +
    +

    OPTIONS

    +
    +
    +
    +-e <NUM> +
    +
    +--endgrp-id=<NUM> +
    +
    +

    + The endurance group identifier to use when requesting the log page. +

    +
    +
    +-b +
    +
    +--raw-binary +
    +
    +

    + Print the raw buffer to the standard output stream. +

    +
    +
    +-o <format> +
    +
    +--output-format=<format> +
    +
    +

    + Set the reporting format to normal, json, or binary. Only one + output format can be used at a time. +

    +
    +
    +
    +
    +
    +

    NVME

    +
    +

    Part of nvme-cli

    +
    +
    +
    +

    + + + diff --git a/Documentation/nvme-fdp-usage.txt b/Documentation/nvme-fdp-usage.txt new file mode 100644 index 0000000..ad9d1eb --- /dev/null +++ b/Documentation/nvme-fdp-usage.txt @@ -0,0 +1,38 @@ +nvme-fdp-usage(1) +================= + +NAME +---- +nvme-fdp-usage - Get Reclaim Unit Handle Usage + +SYNOPSIS +-------- +[verse] +'nvme fdp usage' [--endgrp-id= | -e ] + [--raw-binary | -b] + [--output-format= | -o ] + +DESCRIPTION +----------- +For the NVMe device given, provide information about the Reclaim Unit Handles +associated with the Placement Handles of the namespaces in the specified +Endurance Group. + +OPTIONS +------- +-e :: +--endgrp-id=:: + The endurance group identifier to use when requesting the log page. + +-b:: +--raw-binary:: + Print the raw buffer to the standard output stream. + +-o :: +--output-format=:: + Set the reporting format to 'normal', 'json', or 'binary'. Only one + output format can be used at a time. + +NVME +---- +Part of nvme-cli diff --git a/Documentation/nvme-fid-support-effects-log.1 b/Documentation/nvme-fid-support-effects-log.1 index 8c748fa..2b23024 100644 --- a/Documentation/nvme-fid-support-effects-log.1 +++ b/Documentation/nvme-fid-support-effects-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fid-support-effects-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FID\-SUPPORT\-" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-FID\-SUPPORT\-" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fid-support-effects-log.html b/Documentation/nvme-fid-support-effects-log.html index 12b904e..cf3eab0 100644 --- a/Documentation/nvme-fid-support-effects-log.html +++ b/Documentation/nvme-fid-support-effects-log.html @@ -814,7 +814,7 @@ raw buffer may be printed to stdout.

  • diff --git a/Documentation/nvme-flush.1 b/Documentation/nvme-flush.1 index 303ba81..5547f07 100644 --- a/Documentation/nvme-flush.1 +++ b/Documentation/nvme-flush.1 @@ -2,12 +2,12 @@ .\" Title: nvme-flush .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FLUSH" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-FLUSH" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-flush.html b/Documentation/nvme-flush.html index c9dbe68..fbfea25 100644 --- a/Documentation/nvme-flush.html +++ b/Documentation/nvme-flush.html @@ -800,7 +800,7 @@ any namespace.

    diff --git a/Documentation/nvme-format.1 b/Documentation/nvme-format.1 index 0012045..4910b4e 100644 --- a/Documentation/nvme-format.1 +++ b/Documentation/nvme-format.1 @@ -2,12 +2,12 @@ .\" Title: nvme-format .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FORMAT" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-FORMAT" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-format.html b/Documentation/nvme-format.html index b581df5..c06e267 100644 --- a/Documentation/nvme-format.html +++ b/Documentation/nvme-format.html @@ -1035,7 +1035,7 @@ information: diff --git a/Documentation/nvme-fw-commit.1 b/Documentation/nvme-fw-commit.1 index 2b85de1..8020600 100644 --- a/Documentation/nvme-fw-commit.1 +++ b/Documentation/nvme-fw-commit.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fw-commit .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FW\-COMMIT" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-FW\-COMMIT" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fw-commit.html b/Documentation/nvme-fw-commit.html index 7384673..92129a0 100644 --- a/Documentation/nvme-fw-commit.html +++ b/Documentation/nvme-fw-commit.html @@ -905,7 +905,7 @@ commit the last downloaded fw to slot 1. diff --git a/Documentation/nvme-fw-download.1 b/Documentation/nvme-fw-download.1 index 0d572bc..5786b86 100644 --- a/Documentation/nvme-fw-download.1 +++ b/Documentation/nvme-fw-download.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fw-download .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FW\-DOWNLOAD" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-FW\-DOWNLOAD" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fw-download.html b/Documentation/nvme-fw-download.html index eb916a2..f35d6fa 100644 --- a/Documentation/nvme-fw-download.html +++ b/Documentation/nvme-fw-download.html @@ -852,7 +852,7 @@ Transfer a firmware size 128KiB at a time: diff --git a/Documentation/nvme-fw-log.1 b/Documentation/nvme-fw-log.1 index e3d27c1..4bd1d9c 100644 --- a/Documentation/nvme-fw-log.1 +++ b/Documentation/nvme-fw-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fw-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FW\-LOG" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-FW\-LOG" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fw-log.html b/Documentation/nvme-fw-log.html index 9f2db92..f834047 100644 --- a/Documentation/nvme-fw-log.html +++ b/Documentation/nvme-fw-log.html @@ -835,7 +835,7 @@ Print the log firmware to a file: diff --git a/Documentation/nvme-gen-hostnqn.1 b/Documentation/nvme-gen-hostnqn.1 index bdd49e9..e2f63f5 100644 --- a/Documentation/nvme-gen-hostnqn.1 +++ b/Documentation/nvme-gen-hostnqn.1 @@ -2,12 +2,12 @@ .\" Title: nvme-gen-hostnqn .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GEN\-HOSTNQN" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-GEN\-HOSTNQN" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-gen-hostnqn.html b/Documentation/nvme-gen-hostnqn.html index 789ea41..6aced60 100644 --- a/Documentation/nvme-gen-hostnqn.html +++ b/Documentation/nvme-gen-hostnqn.html @@ -785,7 +785,7 @@ and prints it to stdout.

    diff --git a/Documentation/nvme-get-feature.1 b/Documentation/nvme-get-feature.1 index bfe6012..822dd23 100644 --- a/Documentation/nvme-get-feature.1 +++ b/Documentation/nvme-get-feature.1 @@ -2,12 +2,12 @@ .\" Title: nvme-get-feature .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-FEATURE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-FEATURE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-feature.html b/Documentation/nvme-get-feature.html index 43aed8e..24af08a 100644 --- a/Documentation/nvme-get-feature.html +++ b/Documentation/nvme-get-feature.html @@ -977,7 +977,7 @@ format: diff --git a/Documentation/nvme-get-lba-status.1 b/Documentation/nvme-get-lba-status.1 index 8206067..a400cec 100644 --- a/Documentation/nvme-get-lba-status.1 +++ b/Documentation/nvme-get-lba-status.1 @@ -2,12 +2,12 @@ .\" Title: nvme-get-lba-status .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-LBA\-STAT" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-LBA\-STAT" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-lba-status.html b/Documentation/nvme-get-lba-status.html index e0ff7a4..d307b64 100644 --- a/Documentation/nvme-get-lba-status.html +++ b/Documentation/nvme-get-lba-status.html @@ -896,7 +896,7 @@ Get LBA Status of the namespace 1 from SLBA 10 for the max Dwords of 0x1000 diff --git a/Documentation/nvme-get-log.1 b/Documentation/nvme-get-log.1 index 080c84f..0e5f386 100644 --- a/Documentation/nvme-get-log.1 +++ b/Documentation/nvme-get-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-get-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-LOG" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-LOG" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-log.html b/Documentation/nvme-get-log.html index 4e06797..0bbb25a 100644 --- a/Documentation/nvme-get-log.html +++ b/Documentation/nvme-get-log.html @@ -962,7 +962,7 @@ Have the program return the raw log page in binary: diff --git a/Documentation/nvme-get-ns-id.1 b/Documentation/nvme-get-ns-id.1 index 2358c36..624e228 100644 --- a/Documentation/nvme-get-ns-id.1 +++ b/Documentation/nvme-get-ns-id.1 @@ -2,12 +2,12 @@ .\" Title: nvme-get-ns-id .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-NS\-ID" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-NS\-ID" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-ns-id.html b/Documentation/nvme-get-ns-id.html index 38a2325..6c82dd7 100644 --- a/Documentation/nvme-get-ns-id.html +++ b/Documentation/nvme-get-ns-id.html @@ -794,7 +794,7 @@ Shows the namespace id for the given block device: diff --git a/Documentation/nvme-get-property.1 b/Documentation/nvme-get-property.1 index 407d9ac..3237714 100644 --- a/Documentation/nvme-get-property.1 +++ b/Documentation/nvme-get-property.1 @@ -2,12 +2,12 @@ .\" Title: nvme-get-property .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-PROPERTY" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-PROPERTY" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-property.html b/Documentation/nvme-get-property.html index 13b97f0..59b27b5 100644 --- a/Documentation/nvme-get-property.html +++ b/Documentation/nvme-get-property.html @@ -843,7 +843,7 @@ Then look for NVMe Fabrics command (0x7f) at trace diff --git a/Documentation/nvme-help.1 b/Documentation/nvme-help.1 index 6ad288d..090db55 100644 --- a/Documentation/nvme-help.1 +++ b/Documentation/nvme-help.1 @@ -2,12 +2,12 @@ .\" Title: nvme-help .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-HELP" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-HELP" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-help.html b/Documentation/nvme-help.html index 4d9057d..864bba2 100644 --- a/Documentation/nvme-help.html +++ b/Documentation/nvme-help.html @@ -794,7 +794,7 @@ Show help for nvme smart log: diff --git a/Documentation/nvme-huawei-id-ctrl.1 b/Documentation/nvme-huawei-id-ctrl.1 index 5b3a9d0..d5c1936 100644 --- a/Documentation/nvme-huawei-id-ctrl.1 +++ b/Documentation/nvme-huawei-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-huawei-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-HUAWEI\-ID\-CT" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-HUAWEI\-ID\-CT" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-huawei-id-ctrl.html b/Documentation/nvme-huawei-id-ctrl.html index f6a617d..df4b05a 100644 --- a/Documentation/nvme-huawei-id-ctrl.html +++ b/Documentation/nvme-huawei-id-ctrl.html @@ -855,7 +855,7 @@ fields in a human readable format: diff --git a/Documentation/nvme-huawei-list.1 b/Documentation/nvme-huawei-list.1 index 04d701e..c980f69 100644 --- a/Documentation/nvme-huawei-list.1 +++ b/Documentation/nvme-huawei-list.1 @@ -2,12 +2,12 @@ .\" Title: nvme-list .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-LIST" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-huawei-list.html b/Documentation/nvme-huawei-list.html index 4c6a3e7..9fd7a0b 100644 --- a/Documentation/nvme-huawei-list.html +++ b/Documentation/nvme-huawei-list.html @@ -797,7 +797,7 @@ for those Huawei devices as well as some pertinent information about them.

    diff --git a/Documentation/nvme-id-ctrl.1 b/Documentation/nvme-id-ctrl.1 index 04dc94b..86f85b9 100644 --- a/Documentation/nvme-id-ctrl.1 +++ b/Documentation/nvme-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-CTRL" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-CTRL" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-ctrl.html b/Documentation/nvme-id-ctrl.html index 09a26f6..ec34164 100644 --- a/Documentation/nvme-id-ctrl.html +++ b/Documentation/nvme-id-ctrl.html @@ -910,7 +910,7 @@ int main(int argc, char **argv) diff --git a/Documentation/nvme-id-domain.1 b/Documentation/nvme-id-domain.1 index cb93376..603b20d 100644 --- a/Documentation/nvme-id-domain.1 +++ b/Documentation/nvme-id-domain.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-domain .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-DOMAIN" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-DOMAIN" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-domain.html b/Documentation/nvme-id-domain.html index a029b28..40d1f22 100644 --- a/Documentation/nvme-id-domain.html +++ b/Documentation/nvme-id-domain.html @@ -812,7 +812,7 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).

    diff --git a/Documentation/nvme-id-iocs.1 b/Documentation/nvme-id-iocs.1 index 8348ee3..e68b85e 100644 --- a/Documentation/nvme-id-iocs.1 +++ b/Documentation/nvme-id-iocs.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-iocs .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-IOCS" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-IOCS" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-iocs.html b/Documentation/nvme-id-iocs.html index 479201c..e4b43ec 100644 --- a/Documentation/nvme-id-iocs.html +++ b/Documentation/nvme-id-iocs.html @@ -844,7 +844,7 @@ show the fields in human readable format diff --git a/Documentation/nvme-id-ns.1 b/Documentation/nvme-id-ns.1 index 6225e12..83ee071 100644 --- a/Documentation/nvme-id-ns.1 +++ b/Documentation/nvme-id-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-ns.html b/Documentation/nvme-id-ns.html index 437795f..dba3d3e 100644 --- a/Documentation/nvme-id-ns.html +++ b/Documentation/nvme-id-ns.html @@ -955,7 +955,7 @@ int main(int argc, char **argv) diff --git a/Documentation/nvme-id-nvmset.1 b/Documentation/nvme-id-nvmset.1 index e2ff2e2..7737a4e 100644 --- a/Documentation/nvme-id-nvmset.1 +++ b/Documentation/nvme-id-nvmset.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-nvmset .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NVMSET" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NVMSET" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-nvmset.html b/Documentation/nvme-id-nvmset.html index 9428be6..23ddc9f 100644 --- a/Documentation/nvme-id-nvmset.html +++ b/Documentation/nvme-id-nvmset.html @@ -851,7 +851,7 @@ as shown in the above example, or you can 'cat' a saved output buff diff --git a/Documentation/nvme-inspur-nvme-vendor-log.1 b/Documentation/nvme-inspur-nvme-vendor-log.1 new file mode 100644 index 0000000..5560efa --- /dev/null +++ b/Documentation/nvme-inspur-nvme-vendor-log.1 @@ -0,0 +1,71 @@ +'\" t +.\" Title: nvme-inspur-nvme-vendor-log +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 01/30/2023 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-INSPUR\-NVME\-" "1" "01/30/2023" "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-inspur-nvme-vendor-log \- Send NVMe Inspur Device Vendor log page request, returns result +.SH "SYNOPSIS" +.sp +.nf +\fInvme inspur nvme\-vendor\-log\fR +.fi +.SH "DESCRIPTION" +.sp +Retrieves the NVMe Inspur Device Vendor log page from the device and provides the returned structure\&. +.sp +The 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, vendor log structure are printed in a readable format\&. +.SH "OPTIONS" +.sp +none +.SH "EXAMPLES" +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Print the Inspur Device Vendor log page in a human readable format: +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme inspur nvme\-vendor\-log /dev/nvme0 +.fi +.if n \{\ +.RE +.\} +.RE +.SH "NVME" +.sp +Part of the nvme\-user suite diff --git a/Documentation/nvme-inspur-nvme-vendor-log.html b/Documentation/nvme-inspur-nvme-vendor-log.html new file mode 100644 index 0000000..75c340c --- /dev/null +++ b/Documentation/nvme-inspur-nvme-vendor-log.html @@ -0,0 +1,803 @@ + + + + + + +nvme-inspur-nvme-vendor-log(1) + + + + + +
    +
    +

    SYNOPSIS

    +
    +
    +
    nvme inspur nvme-vendor-log <device>
    +
    +
    +
    +
    +
    +

    DESCRIPTION

    +
    +

    Retrieves the NVMe Inspur Device Vendor log page from the device and provides the 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, vendor log structure are printed in a readable format.

    +
    +
    +
    +

    OPTIONS

    +
    +

    none

    +
    +
    +
    +

    EXAMPLES

    +
    +
      +
    • +

      +Print the Inspur Device Vendor log page in a human readable format: +

      +
      +
      +
      # nvme inspur nvme-vendor-log /dev/nvme0
      +
      +
    • +
    +
    +
    +
    +

    NVME

    +
    +

    Part of the nvme-user suite

    +
    +
    +
    +

    + + + diff --git a/Documentation/nvme-inspur-nvme-vendor-log.txt b/Documentation/nvme-inspur-nvme-vendor-log.txt new file mode 100644 index 0000000..cd0266b --- /dev/null +++ b/Documentation/nvme-inspur-nvme-vendor-log.txt @@ -0,0 +1,37 @@ +nvme-inspur-nvme-vendor-log(1) +============================== + +NAME +---- +nvme-inspur-nvme-vendor-log - Send NVMe Inspur Device Vendor log page request, returns result + +SYNOPSIS +-------- +[verse] +'nvme inspur nvme-vendor-log' + +DESCRIPTION +----------- +Retrieves the NVMe Inspur Device Vendor log page from the device and provides the returned structure. + +The parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1). + +On success, vendor log structure are printed in a readable format. + +OPTIONS +------- +none + + +EXAMPLES +-------- +* Print the Inspur Device Vendor log page in a human readable format: ++ +------------ +# nvme inspur nvme-vendor-log /dev/nvme0 +------------ + +NVME +---- +Part of the nvme-user suite diff --git a/Documentation/nvme-intel-id-ctrl.1 b/Documentation/nvme-intel-id-ctrl.1 index 6f14121..b63b676 100644 --- a/Documentation/nvme-intel-id-ctrl.1 +++ b/Documentation/nvme-intel-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-ID\-CTR" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-ID\-CTR" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-id-ctrl.html b/Documentation/nvme-intel-id-ctrl.html index 37e6228..59e1817 100644 --- a/Documentation/nvme-intel-id-ctrl.html +++ b/Documentation/nvme-intel-id-ctrl.html @@ -853,7 +853,7 @@ fields in a human readable format: diff --git a/Documentation/nvme-intel-internal-log.1 b/Documentation/nvme-intel-internal-log.1 index 25f9984..0a101cf 100644 --- a/Documentation/nvme-intel-internal-log.1 +++ b/Documentation/nvme-intel-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-INTERNA" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-INTERNA" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-internal-log.html b/Documentation/nvme-intel-internal-log.html index 16f40d1..9dce5f2 100644 --- a/Documentation/nvme-intel-internal-log.html +++ b/Documentation/nvme-intel-internal-log.html @@ -873,7 +873,7 @@ Gets the event log from the device and saves to defined file: diff --git a/Documentation/nvme-intel-lat-stats.1 b/Documentation/nvme-intel-lat-stats.1 index 85af949..4fbb9e3 100644 --- a/Documentation/nvme-intel-lat-stats.1 +++ b/Documentation/nvme-intel-lat-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-lat-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-LAT\-ST" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-LAT\-ST" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-lat-stats.html b/Documentation/nvme-intel-lat-stats.html index fe75c8f..1396891 100644 --- a/Documentation/nvme-intel-lat-stats.html +++ b/Documentation/nvme-intel-lat-stats.html @@ -832,7 +832,7 @@ Get the write statistics diff --git a/Documentation/nvme-intel-market-name.1 b/Documentation/nvme-intel-market-name.1 index 0338c4d..1326e1e 100644 --- a/Documentation/nvme-intel-market-name.1 +++ b/Documentation/nvme-intel-market-name.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-market-name .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-MARKET\" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-MARKET\" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-market-name.html b/Documentation/nvme-intel-market-name.html index 2fda9a0..dd1855d 100644 --- a/Documentation/nvme-intel-market-name.html +++ b/Documentation/nvme-intel-market-name.html @@ -813,7 +813,7 @@ Get the marketing name diff --git a/Documentation/nvme-intel-smart-log-add.1 b/Documentation/nvme-intel-smart-log-add.1 index b11957f..835e169 100644 --- a/Documentation/nvme-intel-smart-log-add.1 +++ b/Documentation/nvme-intel-smart-log-add.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-smart-log-add .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-SMART\-" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-SMART\-" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-smart-log-add.html b/Documentation/nvme-intel-smart-log-add.html index 55a81a4..ed0e6c2 100644 --- a/Documentation/nvme-intel-smart-log-add.html +++ b/Documentation/nvme-intel-smart-log-add.html @@ -850,7 +850,7 @@ Print the raw Intel Additional SMART log to a file: diff --git a/Documentation/nvme-intel-temp-stats.1 b/Documentation/nvme-intel-temp-stats.1 index e446276..bcdb571 100644 --- a/Documentation/nvme-intel-temp-stats.1 +++ b/Documentation/nvme-intel-temp-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-temp-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-TEMP\-S" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-TEMP\-S" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-temp-stats.html b/Documentation/nvme-intel-temp-stats.html index 0c7fa3c..fd8e7a3 100644 --- a/Documentation/nvme-intel-temp-stats.html +++ b/Documentation/nvme-intel-temp-stats.html @@ -822,7 +822,7 @@ Print the raw SMART log to a file: diff --git a/Documentation/nvme-io-mgmt-recv.1 b/Documentation/nvme-io-mgmt-recv.1 new file mode 100644 index 0000000..076220a --- /dev/null +++ b/Documentation/nvme-io-mgmt-recv.1 @@ -0,0 +1,72 @@ +'\" t +.\" Title: nvme-io-mgmt-recv +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 01/30/2023 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-IO\-MGMT\-RECV" "1" "01/30/2023" "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-io-mgmt-recv \- I/O Management Receive command +.SH "SYNOPSIS" +.sp +.nf +\fInvme io\-mgmt\-recv\fR [\-\-namespace\-id= | \-n ] + [\-\-mos= | \-s ] + [\-\-mo= | \-m ] + [\-\-data= | \-d ] + [\-\-data\-len= | \-l ] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, issues the I/O Management Receive command with the requested management operation (mo) and management operation specific parameter (mos)\&. This is the generic interface provided for forward compatibility as new operations are added that this program isn\(cqt aware of at the time of its development\&. As such, this is a generic command that does not do any additional decoding for specific types of data received\&. This will only report the data as a hex dump, or binary\&. +.SH "OPTIONS" +.PP +\-n , \-\-namespace\-id= +.RS 4 +Use the provided namespace id for the command\&. If not provided, the namespace id of the block device will be used\&. If the command is issued to a non\-block device, the parameter is required\&. +.RE +.PP +\-d , \-\-data= +.RS 4 +File to write received data into\&. If unspecified, received data will be hex dumped to the standard output stream\&. +.RE +.PP +\-l , \-\-data\-len= +.RS 4 +Received data buffer length +.RE +.PP +\-m , \-\-mo +.RS 4 +Management Operation to perform\&. +.RE +.PP +\-s , \-\-mos= +.RS 4 +Management Operation Specific parameter\&. +.RE +.SH "NVME" +.sp +Part of nvme\-cli diff --git a/Documentation/nvme-io-mgmt-recv.html b/Documentation/nvme-io-mgmt-recv.html new file mode 100644 index 0000000..95d1eca --- /dev/null +++ b/Documentation/nvme-io-mgmt-recv.html @@ -0,0 +1,853 @@ + + + + + + +nvme-io-mgmt-recv(1) + + + + + +
    +
    +

    SYNOPSIS

    +
    +
    +
    nvme io-mgmt-recv <device> [--namespace-id=<NUM> | -n <NUM>]
    +                             [--mos=<NUM> | -s <NUM>]
    +                             [--mo=<NUM> | -m <NUM>]
    +                             [--data=<FILE> | -d <FILE>]
    +                             [--data-len=<NUM> | -l <NUM>]
    +
    +
    +
    +
    +
    +

    DESCRIPTION

    +
    +

    For the NVMe device given, issues the I/O Management Receive command with the +requested management operation (mo) and management operation specific parameter +(mos). This is the generic interface provided for forward compatibility as new +operations are added that this program isn’t aware of at the time of its +development. As such, this is a generic command that does not do any additional +decoding for specific types of data received. This will only report the data as +a hex dump, or binary.

    +
    +
    +
    +

    OPTIONS

    +
    +
    +
    +-n <NUM> +
    +
    +--namespace-id=<NUM> +
    +
    +

    + Use the provided namespace id for the command. If not provided, the + namespace id of the block device will be used. If the command is issued + to a non-block device, the parameter is required. +

    +
    +
    +-d <FILE> +
    +
    +--data=<FILE> +
    +
    +

    + File to write received data into. If unspecified, received data will be + hex dumped to the standard output stream. +

    +
    +
    +-l <NUM> +
    +
    +--data-len=<NUM> +
    +
    +

    + Received data buffer length +

    +
    +
    +-m <NUM> +
    +
    +--mo <NUM> +
    +
    +

    + Management Operation to perform. +

    +
    +
    +-s <NUM> +
    +
    +--mos=<NUM> +
    +
    +

    + Management Operation Specific parameter. +

    +
    +
    +
    +
    +
    +

    NVME

    +
    +

    Part of nvme-cli

    +
    +
    +
    +

    + + + diff --git a/Documentation/nvme-io-mgmt-recv.txt b/Documentation/nvme-io-mgmt-recv.txt new file mode 100644 index 0000000..e611c15 --- /dev/null +++ b/Documentation/nvme-io-mgmt-recv.txt @@ -0,0 +1,55 @@ +nvme-io-mgmt-recv(1) +==================== + +NAME +---- +nvme-io-mgmt-recv - I/O Management Receive command + +SYNOPSIS +-------- +[verse] +'nvme io-mgmt-recv' [--namespace-id= | -n ] + [--mos= | -s ] + [--mo= | -m ] + [--data= | -d ] + [--data-len= | -l ] + +DESCRIPTION +----------- +For the NVMe device given, issues the I/O Management Receive command with the +requested management operation (mo) and management operation specific parameter +(mos). This is the generic interface provided for forward compatibility as new +operations are added that this program isn't aware of at the time of its +development. As such, this is a generic command that does not do any additional +decoding for specific types of data received. This will only report the data as +a hex dump, or binary. + +OPTIONS +------- +-n :: +--namespace-id=:: + Use the provided namespace id for the command. If not provided, the + namespace id of the block device will be used. If the command is issued + to a non-block device, the parameter is required. + +-d :: +--data=:: + File to write received data into. If unspecified, received data will be + hex dumped to the standard output stream. + +-l :: +--data-len=:: + Received data buffer length + +-m :: +--mo :: + Management Operation to perform. + +-s :: +--mos=:: + Management Operation Specific parameter. + + +NVME +---- +Part of nvme-cli diff --git a/Documentation/nvme-io-mgmt-send.1 b/Documentation/nvme-io-mgmt-send.1 new file mode 100644 index 0000000..8bb6538 --- /dev/null +++ b/Documentation/nvme-io-mgmt-send.1 @@ -0,0 +1,72 @@ +'\" t +.\" Title: nvme-io-mgmt-send +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 01/30/2023 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-IO\-MGMT\-SEND" "1" "01/30/2023" "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-io-mgmt-send \- I/O Management Send command +.SH "SYNOPSIS" +.sp +.nf +\fInvme io\-mgmt\-send\fR [\-\-namespace\-id= | \-n ] + [\-\-mos= | \-s ] + [\-\-mo= | \-m ] + [\-\-data= | \-d ] + [\-\-data\-len= | \-l ] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, issues the I/O Management Send command with the requested management operation (mo) and management operation specific parameter (mos)\&. This is the generic interface provided for forward compatibility as new operations are added that this program isn\(cqt aware of at the time of its development\&. As such, this is a generic command that does not provide any convenience parameters to produce the binary payload\&. +.SH "OPTIONS" +.PP +\-n , \-\-namespace\-id= +.RS 4 +Use the provided namespace id for the command\&. If not provided, the namespace id of the block device will be used\&. If the command is issued to a non\-block device, the parameter is required\&. +.RE +.PP +\-d , \-\-data= +.RS 4 +File to read payload from\&. If unspecified, data will be read from the standard input stream\&. +.RE +.PP +\-l , \-\-data\-len= +.RS 4 +Payload data buffer length +.RE +.PP +\-m , \-\-mo +.RS 4 +Management Operation to perform\&. +.RE +.PP +\-s , \-\-mos= +.RS 4 +Management Operation Specific parameter\&. +.RE +.SH "NVME" +.sp +Part of nvme\-cli diff --git a/Documentation/nvme-io-mgmt-send.html b/Documentation/nvme-io-mgmt-send.html new file mode 100644 index 0000000..676544c --- /dev/null +++ b/Documentation/nvme-io-mgmt-send.html @@ -0,0 +1,852 @@ + + + + + + +nvme-io-mgmt-send(1) + + + + + +
    +
    +

    SYNOPSIS

    +
    +
    +
    nvme io-mgmt-send <device> [--namespace-id=<NUM> | -n <NUM>]
    +                             [--mos=<NUM> | -s <NUM>]
    +                             [--mo=<NUM> | -m <NUM>]
    +                             [--data=<FILE> | -d <FILE>]
    +                             [--data-len=<NUM> | -l <NUM>]
    +
    +
    +
    +
    +
    +

    DESCRIPTION

    +
    +

    For the NVMe device given, issues the I/O Management Send command with the +requested management operation (mo) and management operation specific parameter +(mos). This is the generic interface provided for forward compatibility as new +operations are added that this program isn’t aware of at the time of its +development. As such, this is a generic command that does not provide any +convenience parameters to produce the binary payload.

    +
    +
    +
    +

    OPTIONS

    +
    +
    +
    +-n <NUM> +
    +
    +--namespace-id=<NUM> +
    +
    +

    + Use the provided namespace id for the command. If not provided, the + namespace id of the block device will be used. If the command is issued + to a non-block device, the parameter is required. +

    +
    +
    +-d <FILE> +
    +
    +--data=<FILE> +
    +
    +

    + File to read payload from. If unspecified, data will be read from the + standard input stream. +

    +
    +
    +-l <NUM> +
    +
    +--data-len=<NUM> +
    +
    +

    + Payload data buffer length +

    +
    +
    +-m <NUM> +
    +
    +--mo <NUM> +
    +
    +

    + Management Operation to perform. +

    +
    +
    +-s <NUM> +
    +
    +--mos=<NUM> +
    +
    +

    + Management Operation Specific parameter. +

    +
    +
    +
    +
    +
    +

    NVME

    +
    +

    Part of nvme-cli

    +
    +
    +
    +

    + + + diff --git a/Documentation/nvme-io-mgmt-send.txt b/Documentation/nvme-io-mgmt-send.txt new file mode 100644 index 0000000..ce8d8d2 --- /dev/null +++ b/Documentation/nvme-io-mgmt-send.txt @@ -0,0 +1,54 @@ +nvme-io-mgmt-send(1) +==================== + +NAME +---- +nvme-io-mgmt-send - I/O Management Send command + +SYNOPSIS +-------- +[verse] +'nvme io-mgmt-send' [--namespace-id= | -n ] + [--mos= | -s ] + [--mo= | -m ] + [--data= | -d ] + [--data-len= | -l ] + +DESCRIPTION +----------- +For the NVMe device given, issues the I/O Management Send command with the +requested management operation (mo) and management operation specific parameter +(mos). This is the generic interface provided for forward compatibility as new +operations are added that this program isn't aware of at the time of its +development. As such, this is a generic command that does not provide any +convenience parameters to produce the binary payload. + +OPTIONS +------- +-n :: +--namespace-id=:: + Use the provided namespace id for the command. If not provided, the + namespace id of the block device will be used. If the command is issued + to a non-block device, the parameter is required. + +-d :: +--data=:: + File to read payload from. If unspecified, data will be read from the + standard input stream. + +-l :: +--data-len=:: + Payload data buffer length + +-m :: +--mo :: + Management Operation to perform. + +-s :: +--mos=:: + Management Operation Specific parameter. + + +NVME +---- +Part of nvme-cli diff --git a/Documentation/nvme-io-passthru.1 b/Documentation/nvme-io-passthru.1 index fceda0e..f3bd35a 100644 --- a/Documentation/nvme-io-passthru.1 +++ b/Documentation/nvme-io-passthru.1 @@ -2,12 +2,12 @@ .\" Title: nvme-io-passthru .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-IO\-PASSTHRU" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-IO\-PASSTHRU" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-io-passthru.html b/Documentation/nvme-io-passthru.html index 94f5447..c870983 100644 --- a/Documentation/nvme-io-passthru.html +++ b/Documentation/nvme-io-passthru.html @@ -993,7 +993,7 @@ printed to stdout for another program to parse.

    diff --git a/Documentation/nvme-lba-status-log.1 b/Documentation/nvme-lba-status-log.1 index 0423eac..007c3b1 100644 --- a/Documentation/nvme-lba-status-log.1 +++ b/Documentation/nvme-lba-status-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-lba-status-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LBA\-STATUS\-L" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-LBA\-STATUS\-L" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-lba-status-log.html b/Documentation/nvme-lba-status-log.html index 00bd601..cf293dc 100644 --- a/Documentation/nvme-lba-status-log.html +++ b/Documentation/nvme-lba-status-log.html @@ -831,7 +831,7 @@ NVME diff --git a/Documentation/nvme-list-ctrl.1 b/Documentation/nvme-list-ctrl.1 index a00636a..c9f2202 100644 --- a/Documentation/nvme-list-ctrl.1 +++ b/Documentation/nvme-list-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-list-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST\-CTRL" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-LIST\-CTRL" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list-ctrl.html b/Documentation/nvme-list-ctrl.html index 5d852f3..9cd92f5 100644 --- a/Documentation/nvme-list-ctrl.html +++ b/Documentation/nvme-list-ctrl.html @@ -828,7 +828,7 @@ OPTIONS diff --git a/Documentation/nvme-list-endgrp.1 b/Documentation/nvme-list-endgrp.1 index 39b14a1..e58a6a6 100644 --- a/Documentation/nvme-list-endgrp.1 +++ b/Documentation/nvme-list-endgrp.1 @@ -2,12 +2,12 @@ .\" Title: nvme-list-endgrp .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST\-ENDGRP" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-LIST\-ENDGRP" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list-endgrp.html b/Documentation/nvme-list-endgrp.html index ab125c8..f5f6bc4 100644 --- a/Documentation/nvme-list-endgrp.html +++ b/Documentation/nvme-list-endgrp.html @@ -815,7 +815,7 @@ than or equal to the value specified in the CDW11.ENDGID field.

    diff --git a/Documentation/nvme-list-ns.1 b/Documentation/nvme-list-ns.1 index dafc921..f168dd3 100644 --- a/Documentation/nvme-list-ns.1 +++ b/Documentation/nvme-list-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list-ns.html b/Documentation/nvme-list-ns.html index 5912e7f..f9fa3fc 100644 --- a/Documentation/nvme-list-ns.html +++ b/Documentation/nvme-list-ns.html @@ -859,7 +859,7 @@ Print the namespaces present for NVM Command Set in normal format diff --git a/Documentation/nvme-list-subsys.1 b/Documentation/nvme-list-subsys.1 index 91240f8..85b1a3e 100644 --- a/Documentation/nvme-list-subsys.1 +++ b/Documentation/nvme-list-subsys.1 @@ -2,12 +2,12 @@ .\" Title: nvme-list-subsys .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST\-SUBSYS" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-LIST\-SUBSYS" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list-subsys.html b/Documentation/nvme-list-subsys.html index a2f6048..a2ac8fe 100644 --- a/Documentation/nvme-list-subsys.html +++ b/Documentation/nvme-list-subsys.html @@ -854,7 +854,7 @@ nvme-subsys1 - NQN=nvmf-test2 diff --git a/Documentation/nvme-list.1 b/Documentation/nvme-list.1 index cb37b9f..8533315 100644 --- a/Documentation/nvme-list.1 +++ b/Documentation/nvme-list.1 @@ -2,12 +2,12 @@ .\" Title: nvme-list .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-LIST" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list.html b/Documentation/nvme-list.html index 14e43d0..09cf858 100644 --- a/Documentation/nvme-list.html +++ b/Documentation/nvme-list.html @@ -816,7 +816,7 @@ for those devices as well as some pertinent information about them.

    diff --git a/Documentation/nvme-lockdown.1 b/Documentation/nvme-lockdown.1 index 839ae60..481e230 100644 --- a/Documentation/nvme-lockdown.1 +++ b/Documentation/nvme-lockdown.1 @@ -2,12 +2,12 @@ .\" Title: nvme-lockdown .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LOCKDOWN" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-LOCKDOWN" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-lockdown.html b/Documentation/nvme-lockdown.html index 76c1ce0..0519b1d 100644 --- a/Documentation/nvme-lockdown.html +++ b/Documentation/nvme-lockdown.html @@ -850,7 +850,7 @@ Identifier.

    diff --git a/Documentation/nvme-mi-cmd-support-effects-log.1 b/Documentation/nvme-mi-cmd-support-effects-log.1 index eb5119b..af740c4 100644 --- a/Documentation/nvme-mi-cmd-support-effects-log.1 +++ b/Documentation/nvme-mi-cmd-support-effects-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-mi-cmd-support-effects-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MI\-CMD\-SUPPO" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-MI\-CMD\-SUPPO" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-mi-cmd-support-effects-log.html b/Documentation/nvme-mi-cmd-support-effects-log.html index 679ddda..5a0008e 100644 --- a/Documentation/nvme-mi-cmd-support-effects-log.html +++ b/Documentation/nvme-mi-cmd-support-effects-log.html @@ -815,7 +815,7 @@ raw buffer may be printed to stdout.

    diff --git a/Documentation/nvme-micron-clear-pcie-errors.1 b/Documentation/nvme-micron-clear-pcie-errors.1 index 4b2a465..588a9df 100644 --- a/Documentation/nvme-micron-clear-pcie-errors.1 +++ b/Documentation/nvme-micron-clear-pcie-errors.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-clear-pcie-errors .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-CLEAR\" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-CLEAR\" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-clear-pcie-errors.html b/Documentation/nvme-micron-clear-pcie-errors.html index d9f9ee4..cb25537 100644 --- a/Documentation/nvme-micron-clear-pcie-errors.html +++ b/Documentation/nvme-micron-clear-pcie-errors.html @@ -798,7 +798,7 @@ Retrieve NAND statistics information diff --git a/Documentation/nvme-micron-internal-log.1 b/Documentation/nvme-micron-internal-log.1 index 1edfea1..71294aa 100644 --- a/Documentation/nvme-micron-internal-log.1 +++ b/Documentation/nvme-micron-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-INTERN" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-INTERN" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-internal-log.html b/Documentation/nvme-micron-internal-log.html index c9625cd..8d3fc4b 100644 --- a/Documentation/nvme-micron-internal-log.html +++ b/Documentation/nvme-micron-internal-log.html @@ -813,7 +813,7 @@ Gets the logs from the device and saves to micron_logs.zip file diff --git a/Documentation/nvme-micron-nand-stats.1 b/Documentation/nvme-micron-nand-stats.1 index 0b0c11a..5e9d9ab 100644 --- a/Documentation/nvme-micron-nand-stats.1 +++ b/Documentation/nvme-micron-nand-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-nand-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-NAND\-" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-NAND\-" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-nand-stats.html b/Documentation/nvme-micron-nand-stats.html index d796172..59d08ae 100644 --- a/Documentation/nvme-micron-nand-stats.html +++ b/Documentation/nvme-micron-nand-stats.html @@ -799,7 +799,7 @@ Retrieve NAND statistics information diff --git a/Documentation/nvme-micron-pcie-stats.1 b/Documentation/nvme-micron-pcie-stats.1 index a674c24..11281d9 100644 --- a/Documentation/nvme-micron-pcie-stats.1 +++ b/Documentation/nvme-micron-pcie-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-pcie-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-PCIE\-" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-PCIE\-" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-pcie-stats.html b/Documentation/nvme-micron-pcie-stats.html index d341dad..6d1f2b1 100644 --- a/Documentation/nvme-micron-pcie-stats.html +++ b/Documentation/nvme-micron-pcie-stats.html @@ -799,7 +799,7 @@ Retrieve PCIe error information diff --git a/Documentation/nvme-micron-selective-download.1 b/Documentation/nvme-micron-selective-download.1 index 4ae235a..5ea20e0 100644 --- a/Documentation/nvme-micron-selective-download.1 +++ b/Documentation/nvme-micron-selective-download.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-selective-download .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-SELECT" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-SELECT" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-selective-download.html b/Documentation/nvme-micron-selective-download.html index 4b6358b..b55824b 100644 --- a/Documentation/nvme-micron-selective-download.html +++ b/Documentation/nvme-micron-selective-download.html @@ -867,7 +867,7 @@ Update eeprom, OOB and main firmware diff --git a/Documentation/nvme-micron-smart-add-log.1 b/Documentation/nvme-micron-smart-add-log.1 index e5e31d5..19e9cb8 100644 --- a/Documentation/nvme-micron-smart-add-log.1 +++ b/Documentation/nvme-micron-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-SMART\" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-SMART\" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-smart-add-log.html b/Documentation/nvme-micron-smart-add-log.html index f763a2d..b5e8974 100644 --- a/Documentation/nvme-micron-smart-add-log.html +++ b/Documentation/nvme-micron-smart-add-log.html @@ -808,7 +808,7 @@ Retrieve NAND/extended SMART data and display in json format diff --git a/Documentation/nvme-micron-temperature-stats.1 b/Documentation/nvme-micron-temperature-stats.1 index b222514..363b1d2 100644 --- a/Documentation/nvme-micron-temperature-stats.1 +++ b/Documentation/nvme-micron-temperature-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-temperature-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-TEMPER" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-TEMPER" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-temperature-stats.html b/Documentation/nvme-micron-temperature-stats.html index 6317613..d622287 100644 --- a/Documentation/nvme-micron-temperature-stats.html +++ b/Documentation/nvme-micron-temperature-stats.html @@ -799,7 +799,7 @@ Retrieve temperature information diff --git a/Documentation/nvme-netapp-ontapdevices.1 b/Documentation/nvme-netapp-ontapdevices.1 index 38cf1b8..f71eeb8 100644 --- a/Documentation/nvme-netapp-ontapdevices.1 +++ b/Documentation/nvme-netapp-ontapdevices.1 @@ -2,12 +2,12 @@ .\" Title: nvme-netapp-ontapdevices .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NETAPP\-ONTAPD" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-NETAPP\-ONTAPD" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-netapp-ontapdevices.html b/Documentation/nvme-netapp-ontapdevices.html index 308046b..4888284 100644 --- a/Documentation/nvme-netapp-ontapdevices.html +++ b/Documentation/nvme-netapp-ontapdevices.html @@ -807,7 +807,7 @@ Display information, in a column-based format, for ONTAP devices. diff --git a/Documentation/nvme-netapp-smdevices.1 b/Documentation/nvme-netapp-smdevices.1 index 9b50f46..40b4bad 100644 --- a/Documentation/nvme-netapp-smdevices.1 +++ b/Documentation/nvme-netapp-smdevices.1 @@ -2,12 +2,12 @@ .\" Title: nvme-netapp-smdevices .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NETAPP\-SMDEVI" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-NETAPP\-SMDEVI" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-netapp-smdevices.html b/Documentation/nvme-netapp-smdevices.html index f1c7fb8..74dd0de 100644 --- a/Documentation/nvme-netapp-smdevices.html +++ b/Documentation/nvme-netapp-smdevices.html @@ -809,7 +809,7 @@ namespace. diff --git a/Documentation/nvme-ns-descs.1 b/Documentation/nvme-ns-descs.1 index fe7f914..fdf6a36 100644 --- a/Documentation/nvme-ns-descs.1 +++ b/Documentation/nvme-ns-descs.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ns-descs .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NS\-DESCS" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-NS\-DESCS" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ns-descs.html b/Documentation/nvme-ns-descs.html index 4f0a4b9..5435b7f 100644 --- a/Documentation/nvme-ns-descs.html +++ b/Documentation/nvme-ns-descs.html @@ -857,7 +857,7 @@ Have the program return the raw structure in binary: diff --git a/Documentation/nvme-ns-rescan.1 b/Documentation/nvme-ns-rescan.1 index 729b0c6..c2e180b 100644 --- a/Documentation/nvme-ns-rescan.1 +++ b/Documentation/nvme-ns-rescan.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ns-rescan .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NS\-RESCAN" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-NS\-RESCAN" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ns-rescan.html b/Documentation/nvme-ns-rescan.html index 245d99e..842496b 100644 --- a/Documentation/nvme-ns-rescan.html +++ b/Documentation/nvme-ns-rescan.html @@ -794,7 +794,7 @@ Rescans the nvme namespaces. diff --git a/Documentation/nvme-nvm-id-ctrl.1 b/Documentation/nvme-nvm-id-ctrl.1 index 2d5ab5c..034aa3b 100644 --- a/Documentation/nvme-nvm-id-ctrl.1 +++ b/Documentation/nvme-nvm-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-nvm-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NVM\-ID\-CTRL" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-NVM\-ID\-CTRL" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-nvm-id-ctrl.html b/Documentation/nvme-nvm-id-ctrl.html index 53488bc..3d27b2e 100644 --- a/Documentation/nvme-nvm-id-ctrl.html +++ b/Documentation/nvme-nvm-id-ctrl.html @@ -821,7 +821,7 @@ Show the output in json format diff --git a/Documentation/nvme-ocp-clear-fw-activate-history.1 b/Documentation/nvme-ocp-clear-fw-activate-history.1 new file mode 100644 index 0000000..82b63bd --- /dev/null +++ b/Documentation/nvme-ocp-clear-fw-activate-history.1 @@ -0,0 +1,78 @@ +'\" t +.\" Title: nvme-ocp-clear-fw-activate-history +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 01/30/2023 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-OCP\-CLEAR\-FW" "1" "01/30/2023" "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-ocp-clear-fw-activate-history \- Clear the OCP Firmware Update History Log +.SH "SYNOPSIS" +.sp +.nf +\fInvme ocp clear\-fw\-activate\-history\fR [\-\-no\-uuid | \-n>] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, Clear OCP Firmware Update History Log\&. +.sp +The parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1)\&. +.sp +This command with no option added, will try to automatically detect the parameters of the command\&. This will work successfully or fail gracefully for devices supporting UUID for Vendor Specific Information (NVMe 1\&.4 or later, OCP 2\&.0 requires NVMe 1\&.4b)\&. For devices that do not support OCP 2\&.0 the command will fail gracefully, unless the \-\-no\-uuid option is provided\&. +.sp +For OCP 1\&.0 devices (before NVMe 1\&.4) the \-\-no\-uuid option is required\&. When \-\-no\-uuid option is provided, results for devices before NVMe 1\&.4 without OCP support are undefined\&. +.sp +On success it returns 0, error code otherwise\&. +.SH "OPTIONS" +.PP +\-n, \-\-no\-uuid +.RS 4 +Do not try to automatically detect UUID index for this command (required for old OCP 1\&.0 support) +.RE +.SH "EXAMPLES" +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Clears OCP Firmware Activation History Log for the device: +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp clear\-fw\-activate\-history /dev/nvme0 +.fi +.if n \{\ +.RE +.\} +.RE +.SH "NVME" +.sp +Part of the nvme\-user suite\&. diff --git a/Documentation/nvme-ocp-clear-fw-activate-history.html b/Documentation/nvme-ocp-clear-fw-activate-history.html new file mode 100644 index 0000000..f1121bb --- /dev/null +++ b/Documentation/nvme-ocp-clear-fw-activate-history.html @@ -0,0 +1,824 @@ + + + + + + +nvme-ocp-clear-fw-activate-history(1) + + + + + +
    +
    +

    SYNOPSIS

    +
    +
    +
    nvme ocp clear-fw-activate-history <device> [--no-uuid | -n>]
    +
    +
    +
    +
    +
    +

    DESCRIPTION

    +
    +

    For the NVMe device given, Clear OCP Firmware Update History Log.

    +

    The <device> parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).

    +

    This command with no option added, will try to automatically detect the +parameters of the command. This will work successfully or fail gracefully for +devices supporting UUID for Vendor Specific Information (NVMe 1.4 or later, +OCP 2.0 requires NVMe 1.4b). For devices that do not support OCP 2.0 the +command will fail gracefully, unless the --no-uuid option is provided.

    +

    For OCP 1.0 devices (before NVMe 1.4) the --no-uuid option is required. +When --no-uuid option is provided, results for devices before NVMe 1.4 without +OCP support are undefined.

    +

    On success it returns 0, error code otherwise.

    +
    +
    +
    +

    OPTIONS

    +
    +
    +
    +-n +
    +
    +--no-uuid +
    +
    +

    + Do not try to automatically detect UUID index for this command (required + for old OCP 1.0 support) +

    +
    +
    +
    +
    +
    +

    EXAMPLES

    +
    +
      +
    • +

      +Clears OCP Firmware Activation History Log for the device: +

      +
      +
      +
      # nvme ocp clear-fw-activate-history /dev/nvme0
      +
      +
    • +
    +
    +
    +
    +

    NVME

    +
    +

    Part of the nvme-user suite.

    +
    +
    +
    +

    + + + diff --git a/Documentation/nvme-ocp-clear-fw-activate-history.txt b/Documentation/nvme-ocp-clear-fw-activate-history.txt new file mode 100644 index 0000000..2108480 --- /dev/null +++ b/Documentation/nvme-ocp-clear-fw-activate-history.txt @@ -0,0 +1,49 @@ +nvme-ocp-clear-fw-activate-history(1) +===================================== + +NAME +---- +nvme-ocp-clear-fw-activate-history - Clear the OCP Firmware Update History Log + +SYNOPSIS +-------- +[verse] +'nvme ocp clear-fw-activate-history' [--no-uuid | -n>] + +DESCRIPTION +----------- +For the NVMe device given, Clear OCP Firmware Update History Log. + +The parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1). + +This command with no option added, will try to automatically detect the +parameters of the command. This will work successfully or fail gracefully for +devices supporting UUID for Vendor Specific Information (NVMe 1.4 or later, +OCP 2.0 requires NVMe 1.4b). For devices that do not support OCP 2.0 the +command will fail gracefully, unless the --no-uuid option is provided. + +For OCP 1.0 devices (before NVMe 1.4) the --no-uuid option is required. +When --no-uuid option is provided, results for devices before NVMe 1.4 without +OCP support are undefined. + +On success it returns 0, error code otherwise. + +OPTIONS +------- +-n:: +--no-uuid:: + Do not try to automatically detect UUID index for this command (required + for old OCP 1.0 support) + +EXAMPLES +-------- +* Clears OCP Firmware Activation History Log for the device: ++ +------------ +# nvme ocp clear-fw-activate-history /dev/nvme0 +------------ + +NVME +---- +Part of the nvme-user suite. \ No newline at end of file diff --git a/Documentation/nvme-ocp-latency-monitor-log.1 b/Documentation/nvme-ocp-latency-monitor-log.1 index 7e06919..d5a7af5 100644 --- a/Documentation/nvme-ocp-latency-monitor-log.1 +++ b/Documentation/nvme-ocp-latency-monitor-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-latency-monitor-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-LATENCY\-" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-LATENCY\-" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-latency-monitor-log.html b/Documentation/nvme-ocp-latency-monitor-log.html index e774030..6a990a7 100644 --- a/Documentation/nvme-ocp-latency-monitor-log.html +++ b/Documentation/nvme-ocp-latency-monitor-log.html @@ -811,7 +811,7 @@ Displays the get latency monitor log for the device: diff --git a/Documentation/nvme-ocp-smart-add-log.1 b/Documentation/nvme-ocp-smart-add-log.1 index d5a666d..9771ab0 100644 --- a/Documentation/nvme-ocp-smart-add-log.1 +++ b/Documentation/nvme-ocp-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-SMART\-AD" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-SMART\-AD" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-smart-add-log.html b/Documentation/nvme-ocp-smart-add-log.html index c9213c8..feee7d5 100644 --- a/Documentation/nvme-ocp-smart-add-log.html +++ b/Documentation/nvme-ocp-smart-add-log.html @@ -812,7 +812,7 @@ Has the program issue a smart-add-log command to retrieve the 0xC0 log page. diff --git a/Documentation/nvme-persistent-event-log.1 b/Documentation/nvme-persistent-event-log.1 index 89e8549..8fae2c0 100644 --- a/Documentation/nvme-persistent-event-log.1 +++ b/Documentation/nvme-persistent-event-log.1 @@ -2,12 +2,12 @@ .\" Title: persistent-event-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "PERSISTENT\-EVENT\-L" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "PERSISTENT\-EVENT\-L" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-persistent-event-log.html b/Documentation/nvme-persistent-event-log.html index c0bfba2..4c4ec5f 100644 --- a/Documentation/nvme-persistent-event-log.html +++ b/Documentation/nvme-persistent-event-log.html @@ -867,7 +867,7 @@ Print the raw persistent event log to a file: diff --git a/Documentation/nvme-pred-lat-event-agg-log.1 b/Documentation/nvme-pred-lat-event-agg-log.1 index a918a0c..82ce0ff 100644 --- a/Documentation/nvme-pred-lat-event-agg-log.1 +++ b/Documentation/nvme-pred-lat-event-agg-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-pred-lat-event-agg-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-PRED\-LAT\-EVE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-PRED\-LAT\-EVE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-pred-lat-event-agg-log.html b/Documentation/nvme-pred-lat-event-agg-log.html index ca0fe95..1620b63 100644 --- a/Documentation/nvme-pred-lat-event-agg-log.html +++ b/Documentation/nvme-pred-lat-event-agg-log.html @@ -863,7 +863,7 @@ Print the raw Predictable Latency Event Aggregate log to a file: diff --git a/Documentation/nvme-predictable-lat-log.1 b/Documentation/nvme-predictable-lat-log.1 index 8b8ea1a..68ae9e3 100644 --- a/Documentation/nvme-predictable-lat-log.1 +++ b/Documentation/nvme-predictable-lat-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-predictable-lat-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-PREDICTABLE\-L" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-PREDICTABLE\-L" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-predictable-lat-log.html b/Documentation/nvme-predictable-lat-log.html index d2ff242..f602015 100644 --- a/Documentation/nvme-predictable-lat-log.html +++ b/Documentation/nvme-predictable-lat-log.html @@ -850,7 +850,7 @@ Print the raw Predictable latency per NVM set log to a file: diff --git a/Documentation/nvme-primary-ctrl-caps.1 b/Documentation/nvme-primary-ctrl-caps.1 index 5d58131..ed055aa 100644 --- a/Documentation/nvme-primary-ctrl-caps.1 +++ b/Documentation/nvme-primary-ctrl-caps.1 @@ -2,12 +2,12 @@ .\" Title: nvme-primary-ctrl-caps .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-PRIMARY\-CTRL\" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-PRIMARY\-CTRL\" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-primary-ctrl-caps.html b/Documentation/nvme-primary-ctrl-caps.html index ed4212a..342ca5c 100644 --- a/Documentation/nvme-primary-ctrl-caps.html +++ b/Documentation/nvme-primary-ctrl-caps.html @@ -835,7 +835,7 @@ fields in a human readable format: diff --git a/Documentation/nvme-read.1 b/Documentation/nvme-read.1 index 5183aac..6a9f105 100644 --- a/Documentation/nvme-read.1 +++ b/Documentation/nvme-read.1 @@ -2,12 +2,12 @@ .\" Title: nvme-read .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-READ" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-READ" "1" "01/30/2023" "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 | \-g ] [\-\-storage\-tag\-check | \-C ] [\-\-force] .fi @@ -181,6 +182,11 @@ be set\&. Otherwise \-\-dry\-run option will be Print out the latency the IOCTL took (in us)\&. .RE .PP +\-\-storage\-tag=, \-g +.RS 4 +Variable Sized Expected Logical Block Storage Tag(ELBST)\&. +.RE +.PP \-\-storage\-tag\-check=, \-C .RS 4 This bit specifies the Storage Tag field shall be checked as part of end\-to\-end data protection processing\&. diff --git a/Documentation/nvme-read.html b/Documentation/nvme-read.html index 4165407..b6dee07 100644 --- a/Documentation/nvme-read.html +++ b/Documentation/nvme-read.html @@ -767,6 +767,7 @@ nvme-read(1) Manual Page [--show-command | -v] [--dry-run | -w] [--latency | -t] + [--storage-tag<storage-tag> | -g <storage-tag>] [--storage-tag-check<storage-tag-check> | -C <storage-tag-check>] [--force]
    @@ -1016,6 +1017,17 @@ metadata is passes.

    +--storage-tag=<storage-tag> +
    +
    +-g <storage-tag> +
    +
    +

    + Variable Sized Expected Logical Block Storage Tag(ELBST). +

    +
    +
    --storage-tag-check=<storage-tag-check>
    @@ -1056,7 +1068,7 @@ metadata is passes.

    diff --git a/Documentation/nvme-read.txt b/Documentation/nvme-read.txt index c5f0e52..1757fd3 100644 --- a/Documentation/nvme-read.txt +++ b/Documentation/nvme-read.txt @@ -26,6 +26,7 @@ SYNOPSIS [--show-command | -v] [--dry-run | -w] [--latency | -t] + [--storage-tag | -g ] [--storage-tag-check | -C ] [--force] @@ -130,6 +131,10 @@ metadata is passes. --latency:: Print out the latency the IOCTL took (in us). +--storage-tag=:: +-g :: + Variable Sized Expected Logical Block Storage Tag(ELBST). + --storage-tag-check=:: -C :: This bit specifies the Storage Tag field shall be checked as part of end-to-end diff --git a/Documentation/nvme-reset.1 b/Documentation/nvme-reset.1 index 512735e..57c1a5c 100644 --- a/Documentation/nvme-reset.1 +++ b/Documentation/nvme-reset.1 @@ -2,12 +2,12 @@ .\" Title: nvme-reset .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESET" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-RESET" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-reset.html b/Documentation/nvme-reset.html index d08c1bb..1f0afcb 100644 --- a/Documentation/nvme-reset.html +++ b/Documentation/nvme-reset.html @@ -794,7 +794,7 @@ Resets the controller. diff --git a/Documentation/nvme-resv-acquire.1 b/Documentation/nvme-resv-acquire.1 index 211cb35..7e29f9f 100644 --- a/Documentation/nvme-resv-acquire.1 +++ b/Documentation/nvme-resv-acquire.1 @@ -2,12 +2,12 @@ .\" Title: nvme-resv-acquire .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-ACQUIRE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-ACQUIRE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-acquire.html b/Documentation/nvme-resv-acquire.html index 97a2018..3a85d5c 100644 --- a/Documentation/nvme-resv-acquire.html +++ b/Documentation/nvme-resv-acquire.html @@ -948,7 +948,7 @@ cellspacing="0" cellpadding="4"> diff --git a/Documentation/nvme-resv-notif-log.1 b/Documentation/nvme-resv-notif-log.1 index 6296f55..f50f3de 100644 --- a/Documentation/nvme-resv-notif-log.1 +++ b/Documentation/nvme-resv-notif-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-resv-notif-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-NOTIF\-L" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-NOTIF\-L" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-notif-log.html b/Documentation/nvme-resv-notif-log.html index e0d9a8d..c881555 100644 --- a/Documentation/nvme-resv-notif-log.html +++ b/Documentation/nvme-resv-notif-log.html @@ -822,7 +822,7 @@ Print the output in json format: diff --git a/Documentation/nvme-resv-register.1 b/Documentation/nvme-resv-register.1 index aab1d65..bc1c43a 100644 --- a/Documentation/nvme-resv-register.1 +++ b/Documentation/nvme-resv-register.1 @@ -2,12 +2,12 @@ .\" Title: nvme-resv-register .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-REGISTER" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-REGISTER" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-register.html b/Documentation/nvme-resv-register.html index 772bea8..8fb803b 100644 --- a/Documentation/nvme-resv-register.html +++ b/Documentation/nvme-resv-register.html @@ -937,7 +937,7 @@ cellspacing="0" cellpadding="4"> diff --git a/Documentation/nvme-resv-release.1 b/Documentation/nvme-resv-release.1 index 30ec55c..796da3e 100644 --- a/Documentation/nvme-resv-release.1 +++ b/Documentation/nvme-resv-release.1 @@ -2,12 +2,12 @@ .\" Title: nvme-resv-release .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-RELEASE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-RELEASE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-release.html b/Documentation/nvme-resv-release.html index 0e25e72..ff92bbd 100644 --- a/Documentation/nvme-resv-release.html +++ b/Documentation/nvme-resv-release.html @@ -930,7 +930,7 @@ cellspacing="0" cellpadding="4"> diff --git a/Documentation/nvme-resv-report.1 b/Documentation/nvme-resv-report.1 index 84bc4e2..7ac1f2f 100644 --- a/Documentation/nvme-resv-report.1 +++ b/Documentation/nvme-resv-report.1 @@ -2,12 +2,12 @@ .\" Title: nvme-resv-report .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-REPORT" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-REPORT" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-report.html b/Documentation/nvme-resv-report.html index e861375..8fa1019 100644 --- a/Documentation/nvme-resv-report.html +++ b/Documentation/nvme-resv-report.html @@ -855,7 +855,7 @@ Controller data structure for each such controller).

    diff --git a/Documentation/nvme-rpmb.1 b/Documentation/nvme-rpmb.1 index fa18eca..8c62f9b 100644 --- a/Documentation/nvme-rpmb.1 +++ b/Documentation/nvme-rpmb.1 @@ -2,12 +2,12 @@ .\" Title: nvme-rpmb .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RPMB" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-RPMB" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-rpmb.html b/Documentation/nvme-rpmb.html index cfcd2f1..136b2d5 100644 --- a/Documentation/nvme-rpmb.html +++ b/Documentation/nvme-rpmb.html @@ -1001,7 +1001,7 @@ data onto output.bin diff --git a/Documentation/nvme-sanitize-log.1 b/Documentation/nvme-sanitize-log.1 index 849e485..a1402a5 100644 --- a/Documentation/nvme-sanitize-log.1 +++ b/Documentation/nvme-sanitize-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-sanitize-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SANITIZE\-LOG" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SANITIZE\-LOG" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-sanitize-log.html b/Documentation/nvme-sanitize-log.html index 73c9ec0..1fe6e57 100644 --- a/Documentation/nvme-sanitize-log.html +++ b/Documentation/nvme-sanitize-log.html @@ -892,7 +892,7 @@ Has the program issue Sanitize-log Command : diff --git a/Documentation/nvme-sanitize.1 b/Documentation/nvme-sanitize.1 index 37da903..39a21a2 100644 --- a/Documentation/nvme-sanitize.1 +++ b/Documentation/nvme-sanitize.1 @@ -2,12 +2,12 @@ .\" Title: nvme-sanitize .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SANITIZE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SANITIZE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -91,22 +91,26 @@ T}:T{ Reserved T} T{ -0x01 +0x01 | +\fIexit\-failure\fR T}:T{ Exit Failure Mode T} T{ -0x02 +0x02 | +\fIstart\-block\-erase\fR T}:T{ Start a Block Erase sanitize operation T} T{ -0x03 +0x03 | +\fIstart\-overwrite\fR T}:T{ Start an Overwrite sanitize operation T} T{ -0x04 +0x04 | +\fIstart\-crypto\-erase\fR T}:T{ Start a Crypto Erase sanitize operation T} @@ -139,8 +143,9 @@ Has the program issue Sanitize Command : .RS 4 .\} .nf -# nvme sanitize /dev/nvme0n1 \-a 0x02 -# nvme sanitize /dev/nvme0n1 \-\-sanact=0x01 +# nvme sanitize /dev/nvme0 \-a 0x02 +# nvme sanitize /dev/nvme0 \-\-sanact=0x01 +# nvme sanitize /dev/nvme0 \-\-sanact=start\-overwrite .fi .if n \{\ .RE diff --git a/Documentation/nvme-sanitize.html b/Documentation/nvme-sanitize.html index 9d101f7..ce54a3a 100644 --- a/Documentation/nvme-sanitize.html +++ b/Documentation/nvme-sanitize.html @@ -863,19 +863,19 @@ cellspacing="0" cellpadding="4">

    Reserved

    -

    0x01

    +

    0x01 | exit-failure

    Exit Failure Mode

    -

    0x02

    +

    0x02 | start-block-erase

    Start a Block Erase sanitize operation

    -

    0x03

    +

    0x03 | start-overwrite

    Start an Overwrite sanitize operation

    -

    0x04

    +

    0x04 | start-crypto-erase

    Start a Crypto Erase sanitize operation

    @@ -919,8 +919,9 @@ Has the program issue Sanitize Command :

    -
    # nvme sanitize /dev/nvme0n1 -a 0x02
    -# nvme sanitize /dev/nvme0n1 --sanact=0x01
    +
    # nvme sanitize /dev/nvme0 -a 0x02
    +# nvme sanitize /dev/nvme0 --sanact=0x01
    +# nvme sanitize /dev/nvme0 --sanact=start-overwrite
    @@ -937,7 +938,7 @@ Has the program issue Sanitize Command : diff --git a/Documentation/nvme-sanitize.txt b/Documentation/nvme-sanitize.txt index f98d039..c3b9af2 100644 --- a/Documentation/nvme-sanitize.txt +++ b/Documentation/nvme-sanitize.txt @@ -70,10 +70,10 @@ OPTIONS |================= |Value|Definition |0x00| Reserved -|0x01| Exit Failure Mode -|0x02| Start a Block Erase sanitize operation -|0x03| Start an Overwrite sanitize operation -|0x04| Start a Crypto Erase sanitize operation +|0x01 \| 'exit-failure'| Exit Failure Mode +|0x02 \| 'start-block-erase'| Start a Block Erase sanitize operation +|0x03 \| 'start-overwrite'| Start an Overwrite sanitize operation +|0x04 \| 'start-crypto-erase'| Start a Crypto Erase sanitize operation |================= -p :: @@ -93,8 +93,9 @@ EXAMPLES * Has the program issue Sanitize Command : + ------------ -# nvme sanitize /dev/nvme0n1 -a 0x02 -# nvme sanitize /dev/nvme0n1 --sanact=0x01 +# nvme sanitize /dev/nvme0 -a 0x02 +# nvme sanitize /dev/nvme0 --sanact=0x01 +# nvme sanitize /dev/nvme0 --sanact=start-overwrite ------------ diff --git a/Documentation/nvme-seagate-clear-fw-activate-history.1 b/Documentation/nvme-seagate-clear-fw-activate-history.1 index d2f1090..aa2bf15 100644 --- a/Documentation/nvme-seagate-clear-fw-activate-history.1 +++ b/Documentation/nvme-seagate-clear-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-clear-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-CLEAR" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-CLEAR" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-clear-fw-activate-history.html b/Documentation/nvme-seagate-clear-fw-activate-history.html index 4773712..3055004 100644 --- a/Documentation/nvme-seagate-clear-fw-activate-history.html +++ b/Documentation/nvme-seagate-clear-fw-activate-history.html @@ -792,7 +792,7 @@ nvme block device (ex: /dev/nvme0n1).

    diff --git a/Documentation/nvme-seagate-clear-pcie-correctable-errors.1 b/Documentation/nvme-seagate-clear-pcie-correctable-errors.1 index 637ef0b..db25121 100644 --- a/Documentation/nvme-seagate-clear-pcie-correctable-errors.1 +++ b/Documentation/nvme-seagate-clear-pcie-correctable-errors.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-clear-pcie-correctable-errors .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-CLEAR" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-CLEAR" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-clear-pcie-correctable-errors.html b/Documentation/nvme-seagate-clear-pcie-correctable-errors.html index e6127b9..41be17f 100644 --- a/Documentation/nvme-seagate-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-seagate-clear-pcie-correctable-errors.html @@ -802,7 +802,7 @@ nvme block device (ex: /dev/nvme0n1).

    diff --git a/Documentation/nvme-seagate-cloud-SSD-plugin-version.1 b/Documentation/nvme-seagate-cloud-SSD-plugin-version.1 index dad16f5..61784d6 100644 --- a/Documentation/nvme-seagate-cloud-SSD-plugin-version.1 +++ b/Documentation/nvme-seagate-cloud-SSD-plugin-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-cloud-SSD-plugin-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-CLOUD" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-CLOUD" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-cloud-SSD-plugin-version.html b/Documentation/nvme-seagate-cloud-SSD-plugin-version.html index fc096a6..d4a3490 100644 --- a/Documentation/nvme-seagate-cloud-SSD-plugin-version.html +++ b/Documentation/nvme-seagate-cloud-SSD-plugin-version.html @@ -787,7 +787,7 @@ nvme-seagate-cloud-SSD-plugin-version (1) Manual Page diff --git a/Documentation/nvme-seagate-get-ctrl-tele.1 b/Documentation/nvme-seagate-get-ctrl-tele.1 index fc1d124..db73c58 100644 --- a/Documentation/nvme-seagate-get-ctrl-tele.1 +++ b/Documentation/nvme-seagate-get-ctrl-tele.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-get-ctrl-tele .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-GET\-" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-GET\-" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-get-ctrl-tele.html b/Documentation/nvme-seagate-get-ctrl-tele.html index 34e0641..7b229f1 100644 --- a/Documentation/nvme-seagate-get-ctrl-tele.html +++ b/Documentation/nvme-seagate-get-ctrl-tele.html @@ -813,7 +813,7 @@ nvme block device (ex: /dev/nvme0n1).

    diff --git a/Documentation/nvme-seagate-get-host-tele.1 b/Documentation/nvme-seagate-get-host-tele.1 index 476f106..e130550 100644 --- a/Documentation/nvme-seagate-get-host-tele.1 +++ b/Documentation/nvme-seagate-get-host-tele.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-get-host-tele .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-GET\-" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-GET\-" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-get-host-tele.html b/Documentation/nvme-seagate-get-host-tele.html index 06589a4..7cc44ed 100644 --- a/Documentation/nvme-seagate-get-host-tele.html +++ b/Documentation/nvme-seagate-get-host-tele.html @@ -825,7 +825,7 @@ nvme block device (ex: /dev/nvme0n1).

    diff --git a/Documentation/nvme-seagate-help.1 b/Documentation/nvme-seagate-help.1 index c380eb0..0b63798 100644 --- a/Documentation/nvme-seagate-help.1 +++ b/Documentation/nvme-seagate-help.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-help .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-HELP" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-HELP" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-help.html b/Documentation/nvme-seagate-help.html index 6e98d72..6d16923 100644 --- a/Documentation/nvme-seagate-help.html +++ b/Documentation/nvme-seagate-help.html @@ -812,7 +812,7 @@ help Display this help diff --git a/Documentation/nvme-seagate-plugin-version.1 b/Documentation/nvme-seagate-plugin-version.1 index 3f60389..8d41181 100644 --- a/Documentation/nvme-seagate-plugin-version.1 +++ b/Documentation/nvme-seagate-plugin-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-plugin-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-PLUGI" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-PLUGI" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-plugin-version.html b/Documentation/nvme-seagate-plugin-version.html index f194008..a3238a0 100644 --- a/Documentation/nvme-seagate-plugin-version.html +++ b/Documentation/nvme-seagate-plugin-version.html @@ -787,7 +787,7 @@ nvme-seagate-plugin-version(1) Manual Page diff --git a/Documentation/nvme-seagate-version.1 b/Documentation/nvme-seagate-version.1 index 920a9fa..ee5e0f5 100644 --- a/Documentation/nvme-seagate-version.1 +++ b/Documentation/nvme-seagate-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VERSI" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VERSI" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-version.html b/Documentation/nvme-seagate-version.html index 466c0fe..b76557b 100644 --- a/Documentation/nvme-seagate-version.html +++ b/Documentation/nvme-seagate-version.html @@ -787,7 +787,7 @@ nvme-seagate-version(1) Manual Page diff --git a/Documentation/nvme-seagate-vs-fw-activate-history.1 b/Documentation/nvme-seagate-vs-fw-activate-history.1 index d74bde3..efdabb3 100644 --- a/Documentation/nvme-seagate-vs-fw-activate-history.1 +++ b/Documentation/nvme-seagate-vs-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-F" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-F" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-fw-activate-history.html b/Documentation/nvme-seagate-vs-fw-activate-history.html index 0ee2f23..a9ee351 100644 --- a/Documentation/nvme-seagate-vs-fw-activate-history.html +++ b/Documentation/nvme-seagate-vs-fw-activate-history.html @@ -813,7 +813,7 @@ nvme block device (ex: /dev/nvme0n1).

    diff --git a/Documentation/nvme-seagate-vs-internal-log.1 b/Documentation/nvme-seagate-vs-internal-log.1 index 5167cfe..d0ea5b4 100644 --- a/Documentation/nvme-seagate-vs-internal-log.1 +++ b/Documentation/nvme-seagate-vs-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-I" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-I" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-internal-log.html b/Documentation/nvme-seagate-vs-internal-log.html index feeadd0..91089aa 100644 --- a/Documentation/nvme-seagate-vs-internal-log.html +++ b/Documentation/nvme-seagate-vs-internal-log.html @@ -813,7 +813,7 @@ nvme block device (ex: /dev/nvme0n1).

    diff --git a/Documentation/nvme-seagate-vs-log-page-sup.1 b/Documentation/nvme-seagate-vs-log-page-sup.1 index aa3cb79..2b91414 100644 --- a/Documentation/nvme-seagate-vs-log-page-sup.1 +++ b/Documentation/nvme-seagate-vs-log-page-sup.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-log-page-sup .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-L" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-L" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-log-page-sup.html b/Documentation/nvme-seagate-vs-log-page-sup.html index be821cf..a710266 100644 --- a/Documentation/nvme-seagate-vs-log-page-sup.html +++ b/Documentation/nvme-seagate-vs-log-page-sup.html @@ -814,7 +814,7 @@ LogPage-Id LogPage-Name diff --git a/Documentation/nvme-seagate-vs-pcie-stats.1 b/Documentation/nvme-seagate-vs-pcie-stats.1 index 03dace8..20b4f09 100644 --- a/Documentation/nvme-seagate-vs-pcie-stats.1 +++ b/Documentation/nvme-seagate-vs-pcie-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-pcie-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-P" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-P" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-pcie-stats.html b/Documentation/nvme-seagate-vs-pcie-stats.html index eb41df8..0d5427f 100644 --- a/Documentation/nvme-seagate-vs-pcie-stats.html +++ b/Documentation/nvme-seagate-vs-pcie-stats.html @@ -802,7 +802,7 @@ nvme block device (ex: /dev/nvme0n1).

    diff --git a/Documentation/nvme-seagate-vs-smart-add-log.1 b/Documentation/nvme-seagate-vs-smart-add-log.1 index 6d92b88..baf09d5 100644 --- a/Documentation/nvme-seagate-vs-smart-add-log.1 +++ b/Documentation/nvme-seagate-vs-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-S" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-S" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-smart-add-log.html b/Documentation/nvme-seagate-vs-smart-add-log.html index 682f379..8e3aed5 100644 --- a/Documentation/nvme-seagate-vs-smart-add-log.html +++ b/Documentation/nvme-seagate-vs-smart-add-log.html @@ -830,7 +830,7 @@ all commands work across all product families.

    diff --git a/Documentation/nvme-seagate-vs-temperature-stats.1 b/Documentation/nvme-seagate-vs-temperature-stats.1 index 4b875af..ed67345 100644 --- a/Documentation/nvme-seagate-vs-temperature-stats.1 +++ b/Documentation/nvme-seagate-vs-temperature-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-temperature-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-T" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-T" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-temperature-stats.html b/Documentation/nvme-seagate-vs-temperature-stats.html index 74712e0..ef736b1 100644 --- a/Documentation/nvme-seagate-vs-temperature-stats.html +++ b/Documentation/nvme-seagate-vs-temperature-stats.html @@ -802,7 +802,7 @@ nvme block device (ex: /dev/nvme0n1).

    diff --git a/Documentation/nvme-security-recv.1 b/Documentation/nvme-security-recv.1 index b3589a7..a9a61c5 100644 --- a/Documentation/nvme-security-recv.1 +++ b/Documentation/nvme-security-recv.1 @@ -2,12 +2,12 @@ .\" Title: nvme-security-recv .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SECURITY\-RECV" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SECURITY\-RECV" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-security-recv.html b/Documentation/nvme-security-recv.html index 8f5750b..85e8a5a 100644 --- a/Documentation/nvme-security-recv.html +++ b/Documentation/nvme-security-recv.html @@ -886,7 +886,7 @@ controller reset occurs.

    diff --git a/Documentation/nvme-security-send.1 b/Documentation/nvme-security-send.1 index 6ad98dd..36cd92e 100644 --- a/Documentation/nvme-security-send.1 +++ b/Documentation/nvme-security-send.1 @@ -2,12 +2,12 @@ .\" Title: nvme-security-send .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SECURITY\-SEND" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SECURITY\-SEND" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-security-send.html b/Documentation/nvme-security-send.html index 0c9afb7..8c5218c 100644 --- a/Documentation/nvme-security-send.html +++ b/Documentation/nvme-security-send.html @@ -872,7 +872,7 @@ Receive command is Security Protocol field dependent as defined in SPC-4.

    diff --git a/Documentation/nvme-self-test-log.1 b/Documentation/nvme-self-test-log.1 index e3e3576..9b2b48d 100644 --- a/Documentation/nvme-self-test-log.1 +++ b/Documentation/nvme-self-test-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-self-test-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SELF\-TEST\-LO" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SELF\-TEST\-LO" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-self-test-log.html b/Documentation/nvme-self-test-log.html index 5d2e381..13c26f0 100644 --- a/Documentation/nvme-self-test-log.html +++ b/Documentation/nvme-self-test-log.html @@ -847,7 +847,7 @@ Get the self-test-log and print it in a json format: diff --git a/Documentation/nvme-set-feature.1 b/Documentation/nvme-set-feature.1 index eae48a5..6749299 100644 --- a/Documentation/nvme-set-feature.1 +++ b/Documentation/nvme-set-feature.1 @@ -2,12 +2,12 @@ .\" Title: nvme-set-feature .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SET\-FEATURE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SET\-FEATURE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-set-feature.html b/Documentation/nvme-set-feature.html index 116cced..57a5ccb 100644 --- a/Documentation/nvme-set-feature.html +++ b/Documentation/nvme-set-feature.html @@ -899,7 +899,7 @@ Sets the host id to the ascii string. diff --git a/Documentation/nvme-set-property.1 b/Documentation/nvme-set-property.1 index 6c3b82b..3468f4b 100644 --- a/Documentation/nvme-set-property.1 +++ b/Documentation/nvme-set-property.1 @@ -2,12 +2,12 @@ .\" Title: nvme-set-property .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SET\-PROPERTY" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SET\-PROPERTY" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-set-property.html b/Documentation/nvme-set-property.html index fa50a2c..11e7dd8 100644 --- a/Documentation/nvme-set-property.html +++ b/Documentation/nvme-set-property.html @@ -805,7 +805,7 @@ nvme-set-property(1) Manual Page diff --git a/Documentation/nvme-show-hostnqn.1 b/Documentation/nvme-show-hostnqn.1 index 6a5aee6..424a32f 100644 --- a/Documentation/nvme-show-hostnqn.1 +++ b/Documentation/nvme-show-hostnqn.1 @@ -2,12 +2,12 @@ .\" Title: nvme-show-hostnqn .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SHOW\-HOSTNQN" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SHOW\-HOSTNQN" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -36,7 +36,7 @@ nvme-show-hostnqn \- Generate a host NVMe Qualified Name .fi .SH "DESCRIPTION" .sp -Show the host NQN configured for the system\&. If /etc/nvme/hostnqn is not present and systemd application\-specific machine IDs are available, this will show the systemd\-generated host NQN for the system\&. +Show the host NQN configured for the system\&. If /usr/local/etc/nvme/hostnqn is not present and systemd application\-specific machine IDs are available, this will show the systemd\-generated host NQN for the system\&. .SH "OPTIONS" .sp No options needed diff --git a/Documentation/nvme-show-hostnqn.html b/Documentation/nvme-show-hostnqn.html index f23f289..8e2b732 100644 --- a/Documentation/nvme-show-hostnqn.html +++ b/Documentation/nvme-show-hostnqn.html @@ -757,7 +757,7 @@ nvme-show-hostnqn(1) Manual Page

    DESCRIPTION

    -

    Show the host NQN configured for the system. If /etc/nvme/hostnqn is +

    Show the host NQN configured for the system. If /usr/local/etc/nvme/hostnqn is not present and systemd application-specific machine IDs are available, this will show the systemd-generated host NQN for the system.

    @@ -785,7 +785,7 @@ this will show the systemd-generated host NQN for the system.

    diff --git a/Documentation/nvme-show-regs.1 b/Documentation/nvme-show-regs.1 index 1af9fff..4466ded 100644 --- a/Documentation/nvme-show-regs.1 +++ b/Documentation/nvme-show-regs.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-show-regs.html b/Documentation/nvme-show-regs.html index 1687ca1..c807955 100644 --- a/Documentation/nvme-show-regs.html +++ b/Documentation/nvme-show-regs.html @@ -848,7 +848,7 @@ in a json format: diff --git a/Documentation/nvme-show-topology.1 b/Documentation/nvme-show-topology.1 index 99b1595..921f7a3 100644 --- a/Documentation/nvme-show-topology.1 +++ b/Documentation/nvme-show-topology.1 @@ -2,12 +2,12 @@ .\" Title: nvme-show-topology .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SHOW\-TOPOLOGY" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SHOW\-TOPOLOGY" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-show-topology.html b/Documentation/nvme-show-topology.html index 96611a4..f327eba 100644 --- a/Documentation/nvme-show-topology.html +++ b/Documentation/nvme-show-topology.html @@ -822,7 +822,7 @@ nvme-show-topology(1) Manual Page diff --git a/Documentation/nvme-smart-log.1 b/Documentation/nvme-smart-log.1 index d315ed7..2d21f33 100644 --- a/Documentation/nvme-smart-log.1 +++ b/Documentation/nvme-smart-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-smart-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SMART\-LOG" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SMART\-LOG" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-smart-log.html b/Documentation/nvme-smart-log.html index 65a5a56..f36af34 100644 --- a/Documentation/nvme-smart-log.html +++ b/Documentation/nvme-smart-log.html @@ -850,7 +850,7 @@ Print the raw SMART log to a file: diff --git a/Documentation/nvme-subsystem-reset.1 b/Documentation/nvme-subsystem-reset.1 index 17ed93a..8b845d5 100644 --- a/Documentation/nvme-subsystem-reset.1 +++ b/Documentation/nvme-subsystem-reset.1 @@ -2,12 +2,12 @@ .\" Title: nvme-subsystem-reset .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SUBSYSTEM\-RES" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SUBSYSTEM\-RES" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-subsystem-reset.html b/Documentation/nvme-subsystem-reset.html index 27ba2dd..256d09b 100644 --- a/Documentation/nvme-subsystem-reset.html +++ b/Documentation/nvme-subsystem-reset.html @@ -794,7 +794,7 @@ Resets the subsystem. diff --git a/Documentation/nvme-supported-log-pages.1 b/Documentation/nvme-supported-log-pages.1 index 710185a..8324afd 100644 --- a/Documentation/nvme-supported-log-pages.1 +++ b/Documentation/nvme-supported-log-pages.1 @@ -2,12 +2,12 @@ .\" Title: nvme-supported-log-pages .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SUPPORTED\-LOG" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-SUPPORTED\-LOG" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-supported-log-pages.html b/Documentation/nvme-supported-log-pages.html index dc854cf..950dd49 100644 --- a/Documentation/nvme-supported-log-pages.html +++ b/Documentation/nvme-supported-log-pages.html @@ -814,7 +814,7 @@ for each command that is supported.

    diff --git a/Documentation/nvme-telemetry-log.1 b/Documentation/nvme-telemetry-log.1 index e4a45d8..92278a3 100644 --- a/Documentation/nvme-telemetry-log.1 +++ b/Documentation/nvme-telemetry-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-telemetry-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TELEMETRY\-LOG" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-TELEMETRY\-LOG" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-telemetry-log.html b/Documentation/nvme-telemetry-log.html index 8d5cf60..5076c38 100644 --- a/Documentation/nvme-telemetry-log.html +++ b/Documentation/nvme-telemetry-log.html @@ -838,7 +838,7 @@ Retrieve Telemetry Host-Initiated data to telemetry_log.bin diff --git a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1 b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1 index 071926c..f8a5f28 100644 --- a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1 +++ b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1 @@ -2,12 +2,12 @@ .\" Title: nvme-toshiba-clear-pcie-correctable-errors .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TOSHIBA\-CLEAR" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-TOSHIBA\-CLEAR" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html index b3170d1..29663d2 100644 --- a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html @@ -791,7 +791,7 @@ Clear the PCIe correctable errors count: diff --git a/Documentation/nvme-toshiba-vs-internal-log.1 b/Documentation/nvme-toshiba-vs-internal-log.1 index aef2a91..377fbac 100644 --- a/Documentation/nvme-toshiba-vs-internal-log.1 +++ b/Documentation/nvme-toshiba-vs-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-toshiba-vs-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TOSHIBA\-VS\-I" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-TOSHIBA\-VS\-I" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-toshiba-vs-internal-log.html b/Documentation/nvme-toshiba-vs-internal-log.html index 87cf982..ddf042a 100644 --- a/Documentation/nvme-toshiba-vs-internal-log.html +++ b/Documentation/nvme-toshiba-vs-internal-log.html @@ -837,7 +837,7 @@ Get the previous log from the device and save to a binary file: diff --git a/Documentation/nvme-toshiba-vs-smart-add-log.1 b/Documentation/nvme-toshiba-vs-smart-add-log.1 index dcdfd4b..2000a19 100644 --- a/Documentation/nvme-toshiba-vs-smart-add-log.1 +++ b/Documentation/nvme-toshiba-vs-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-toshiba-vs-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TOSHIBA\-VS\-S" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-TOSHIBA\-VS\-S" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-toshiba-vs-smart-add-log.html b/Documentation/nvme-toshiba-vs-smart-add-log.html index 8476085..96608cd 100644 --- a/Documentation/nvme-toshiba-vs-smart-add-log.html +++ b/Documentation/nvme-toshiba-vs-smart-add-log.html @@ -840,7 +840,7 @@ Get the contents of log page 0xC0 from the device and save to a binary file: diff --git a/Documentation/nvme-transcend-badblock.1 b/Documentation/nvme-transcend-badblock.1 index 0eedebc..a6bb20e 100644 --- a/Documentation/nvme-transcend-badblock.1 +++ b/Documentation/nvme-transcend-badblock.1 @@ -2,12 +2,12 @@ .\" Title: nvme-transcend-badblock .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TRANSCEND\-BAD" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-TRANSCEND\-BAD" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-transcend-badblock.html b/Documentation/nvme-transcend-badblock.html index 0c665cf..055b5aa 100644 --- a/Documentation/nvme-transcend-badblock.html +++ b/Documentation/nvme-transcend-badblock.html @@ -796,7 +796,7 @@ Print the Transcend device’s bad blocks in a human readable format: diff --git a/Documentation/nvme-transcend-healthvalue.1 b/Documentation/nvme-transcend-healthvalue.1 index 7ded0c2..90e6ff7 100644 --- a/Documentation/nvme-transcend-healthvalue.1 +++ b/Documentation/nvme-transcend-healthvalue.1 @@ -2,12 +2,12 @@ .\" Title: nvme-transcend-healthvalue .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TRANSCEND\-HEA" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-TRANSCEND\-HEA" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-transcend-healthvalue.html b/Documentation/nvme-transcend-healthvalue.html index b5fe0d6..677d830 100644 --- a/Documentation/nvme-transcend-healthvalue.html +++ b/Documentation/nvme-transcend-healthvalue.html @@ -796,7 +796,7 @@ Print the Transcend Device health value in a human readable format: diff --git a/Documentation/nvme-verify.1 b/Documentation/nvme-verify.1 index bf7616c..7b5700c 100644 --- a/Documentation/nvme-verify.1 +++ b/Documentation/nvme-verify.1 @@ -2,12 +2,12 @@ .\" Title: nvme-verify .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-VERIFY" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-VERIFY" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-verify.html b/Documentation/nvme-verify.html index da27c8c..dc3d49d 100644 --- a/Documentation/nvme-verify.html +++ b/Documentation/nvme-verify.html @@ -953,7 +953,7 @@ metadata is passes.

    diff --git a/Documentation/nvme-virtium-save-smart-to-vtview-log.1 b/Documentation/nvme-virtium-save-smart-to-vtview-log.1 index 3472f9c..0209599 100644 --- a/Documentation/nvme-virtium-save-smart-to-vtview-log.1 +++ b/Documentation/nvme-virtium-save-smart-to-vtview-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-virtium-save-smart-to-vtview-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-VIRTIUM\-SAVE\" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-VIRTIUM\-SAVE\" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-virtium-save-smart-to-vtview-log.html b/Documentation/nvme-virtium-save-smart-to-vtview-log.html index b140c59..b9e4efa 100644 --- a/Documentation/nvme-virtium-save-smart-to-vtview-log.html +++ b/Documentation/nvme-virtium-save-smart-to-vtview-log.html @@ -876,7 +876,7 @@ Just logging: Default logging is run for 20 hours and log every 10 hours. diff --git a/Documentation/nvme-virtium-show-identify.1 b/Documentation/nvme-virtium-show-identify.1 index ca6311b..41f1b44 100644 --- a/Documentation/nvme-virtium-show-identify.1 +++ b/Documentation/nvme-virtium-show-identify.1 @@ -2,12 +2,12 @@ .\" Title: nvme-virtium-show-identify .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-VIRTIUM\-SHOW\" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-VIRTIUM\-SHOW\" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-virtium-show-identify.html b/Documentation/nvme-virtium-show-identify.html index f7d824e..0766c25 100644 --- a/Documentation/nvme-virtium-show-identify.html +++ b/Documentation/nvme-virtium-show-identify.html @@ -798,7 +798,7 @@ Show Identify Device: diff --git a/Documentation/nvme-wdc-cap-diag.1 b/Documentation/nvme-wdc-cap-diag.1 index a3e4d02..2b807ff 100644 --- a/Documentation/nvme-wdc-cap-diag.1 +++ b/Documentation/nvme-wdc-cap-diag.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-cap-diag .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CAP\-DIAG" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CAP\-DIAG" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-cap-diag.html b/Documentation/nvme-wdc-cap-diag.html index cc5dbe0..4cec57a 100644 --- a/Documentation/nvme-wdc-cap-diag.html +++ b/Documentation/nvme-wdc-cap-diag.html @@ -856,7 +856,7 @@ Gets the capture diagnostics log from the device transferring the data in 16k ch diff --git a/Documentation/nvme-wdc-capabilities.1 b/Documentation/nvme-wdc-capabilities.1 index 5818295..8b3feb1 100644 --- a/Documentation/nvme-wdc-capabilities.1 +++ b/Documentation/nvme-wdc-capabilities.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-capabilities .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CAPABILIT" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CAPABILIT" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-capabilities.html b/Documentation/nvme-wdc-capabilities.html index 0497740..2a102b6 100644 --- a/Documentation/nvme-wdc-capabilities.html +++ b/Documentation/nvme-wdc-capabilities.html @@ -789,7 +789,7 @@ Displays the capabilities for the device: diff --git a/Documentation/nvme-wdc-clear-assert-dump.1 b/Documentation/nvme-wdc-clear-assert-dump.1 index c8d4fdf..cce63ab 100644 --- a/Documentation/nvme-wdc-clear-assert-dump.1 +++ b/Documentation/nvme-wdc-clear-assert-dump.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-clear-assert-dump .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLEAR\-AS" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLEAR\-AS" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-clear-assert-dump.html b/Documentation/nvme-wdc-clear-assert-dump.html index f96c4f6..689e0cb 100644 --- a/Documentation/nvme-wdc-clear-assert-dump.html +++ b/Documentation/nvme-wdc-clear-assert-dump.html @@ -798,7 +798,7 @@ Clears the assert dump (if present): diff --git a/Documentation/nvme-wdc-clear-fw-activate-history.1 b/Documentation/nvme-wdc-clear-fw-activate-history.1 index b6eb51b..ec35b0e 100644 --- a/Documentation/nvme-wdc-clear-fw-activate-history.1 +++ b/Documentation/nvme-wdc-clear-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-clear-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLEAR\-FW" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLEAR\-FW" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-clear-fw-activate-history.html b/Documentation/nvme-wdc-clear-fw-activate-history.html index 1fd7fe5..ed707d9 100644 --- a/Documentation/nvme-wdc-clear-fw-activate-history.html +++ b/Documentation/nvme-wdc-clear-fw-activate-history.html @@ -797,7 +797,7 @@ Clears the firmware activate history table: diff --git a/Documentation/nvme-wdc-clear-pcie-correctable-errors.1 b/Documentation/nvme-wdc-clear-pcie-correctable-errors.1 index 7f7dc3f..00c3bf3 100644 --- a/Documentation/nvme-wdc-clear-pcie-correctable-errors.1 +++ b/Documentation/nvme-wdc-clear-pcie-correctable-errors.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-clear-pcie-correctable-errors .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLEAR\-PC" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLEAR\-PC" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-clear-pcie-correctable-errors.html b/Documentation/nvme-wdc-clear-pcie-correctable-errors.html index a3b617b..eb0c15c 100644 --- a/Documentation/nvme-wdc-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-wdc-clear-pcie-correctable-errors.html @@ -799,7 +799,7 @@ Clears the PCIe Correctable Error Count field returned in the smart-log-add comm diff --git a/Documentation/nvme-wdc-cloud-SSD-plugin-version.1 b/Documentation/nvme-wdc-cloud-SSD-plugin-version.1 index 8a4fa7a..dac1dc0 100644 --- a/Documentation/nvme-wdc-cloud-SSD-plugin-version.1 +++ b/Documentation/nvme-wdc-cloud-SSD-plugin-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-cloud-SSD-plugin-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLOUD\-SS" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLOUD\-SS" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-cloud-SSD-plugin-version.html b/Documentation/nvme-wdc-cloud-SSD-plugin-version.html index 18fbb2d..3e56a58 100644 --- a/Documentation/nvme-wdc-cloud-SSD-plugin-version.html +++ b/Documentation/nvme-wdc-cloud-SSD-plugin-version.html @@ -790,7 +790,7 @@ Displays the cloud ssd plugin version for the device: diff --git a/Documentation/nvme-wdc-cloud-boot-SSD-version.1 b/Documentation/nvme-wdc-cloud-boot-SSD-version.1 index da41e13..2fc7c85 100644 --- a/Documentation/nvme-wdc-cloud-boot-SSD-version.1 +++ b/Documentation/nvme-wdc-cloud-boot-SSD-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-cloud-boot-SSD-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLOUD\-BO" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLOUD\-BO" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-cloud-boot-SSD-version.html b/Documentation/nvme-wdc-cloud-boot-SSD-version.html index 37a38b5..1250ba3 100644 --- a/Documentation/nvme-wdc-cloud-boot-SSD-version.html +++ b/Documentation/nvme-wdc-cloud-boot-SSD-version.html @@ -790,7 +790,7 @@ Displays the cloud boot ssd version for the device: diff --git a/Documentation/nvme-wdc-drive-essentials.1 b/Documentation/nvme-wdc-drive-essentials.1 index d69d384..dcaf7bb 100644 --- a/Documentation/nvme-wdc-drive-essentials.1 +++ b/Documentation/nvme-wdc-drive-essentials.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-drive-essentials .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-DRIVE\-ES" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-DRIVE\-ES" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-drive-essentials.html b/Documentation/nvme-wdc-drive-essentials.html index a07196b..305c745 100644 --- a/Documentation/nvme-wdc-drive-essentials.html +++ b/Documentation/nvme-wdc-drive-essentials.html @@ -821,7 +821,7 @@ Gets the drive essentials data files from the device and saves the tar file to s diff --git a/Documentation/nvme-wdc-drive-log.1 b/Documentation/nvme-wdc-drive-log.1 index d37b495..5dbfb9b 100644 --- a/Documentation/nvme-wdc-drive-log.1 +++ b/Documentation/nvme-wdc-drive-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-drive-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-DRIVE\-LO" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-DRIVE\-LO" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-drive-log.html b/Documentation/nvme-wdc-drive-log.html index 9cc233e..3310441 100644 --- a/Documentation/nvme-wdc-drive-log.html +++ b/Documentation/nvme-wdc-drive-log.html @@ -829,7 +829,7 @@ Gets the drive log from the device and saves to defined file with pathname (e.g. diff --git a/Documentation/nvme-wdc-drive-resize.1 b/Documentation/nvme-wdc-drive-resize.1 index 745801b..3493746 100644 --- a/Documentation/nvme-wdc-drive-resize.1 +++ b/Documentation/nvme-wdc-drive-resize.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-drive-resize .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-DRIVE\-RE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-DRIVE\-RE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-drive-resize.html b/Documentation/nvme-wdc-drive-resize.html index e29b34a..5fe0dbf 100644 --- a/Documentation/nvme-wdc-drive-resize.html +++ b/Documentation/nvme-wdc-drive-resize.html @@ -810,7 +810,7 @@ Has the program issue WDC Resize Vendor Unique Command : diff --git a/Documentation/nvme-wdc-enc-get-log.1 b/Documentation/nvme-wdc-enc-get-log.1 index 4bc956e..f92c66a 100644 --- a/Documentation/nvme-wdc-enc-get-log.1 +++ b/Documentation/nvme-wdc-enc-get-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-enc-get-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-ENC\-GET\" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-ENC\-GET\" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-enc-get-log.html b/Documentation/nvme-wdc-enc-get-log.html index afe6119..8073401 100644 --- a/Documentation/nvme-wdc-enc-get-log.html +++ b/Documentation/nvme-wdc-enc-get-log.html @@ -832,7 +832,7 @@ Gets the enclosure log from the device based on the log id(0xd2) with default tr diff --git a/Documentation/nvme-wdc-get-crash-dump.1 b/Documentation/nvme-wdc-get-crash-dump.1 index c18daba..ce3ee03 100644 --- a/Documentation/nvme-wdc-get-crash-dump.1 +++ b/Documentation/nvme-wdc-get-crash-dump.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-crash-dump .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-CRAS" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-CRAS" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-crash-dump.html b/Documentation/nvme-wdc-get-crash-dump.html index a95fed6..d9c3dfb 100644 --- a/Documentation/nvme-wdc-get-crash-dump.html +++ b/Documentation/nvme-wdc-get-crash-dump.html @@ -830,7 +830,7 @@ Gets the crash dump from the device and saves to defined file with pathname (e.g diff --git a/Documentation/nvme-wdc-get-dev-capabilities-log.1 b/Documentation/nvme-wdc-get-dev-capabilities-log.1 index 00b40c8..afe3aaf 100644 --- a/Documentation/nvme-wdc-get-dev-capabilities-log.1 +++ b/Documentation/nvme-wdc-get-dev-capabilities-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-dev-capabilities-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-DEV\" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-DEV\" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-dev-capabilities-log.html b/Documentation/nvme-wdc-get-dev-capabilities-log.html index 7ad56c7..612a2b2 100644 --- a/Documentation/nvme-wdc-get-dev-capabilities-log.html +++ b/Documentation/nvme-wdc-get-dev-capabilities-log.html @@ -816,7 +816,7 @@ Has the program issue WDC get-dev-capabilities-log plugin command : diff --git a/Documentation/nvme-wdc-get-drive-status.1 b/Documentation/nvme-wdc-get-drive-status.1 index a042701..03f04e9 100644 --- a/Documentation/nvme-wdc-get-drive-status.1 +++ b/Documentation/nvme-wdc-get-drive-status.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-drive-status .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-DRIV" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-DRIV" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-drive-status.html b/Documentation/nvme-wdc-get-drive-status.html index 413af93..4b67ad0 100644 --- a/Documentation/nvme-wdc-get-drive-status.html +++ b/Documentation/nvme-wdc-get-drive-status.html @@ -836,7 +836,7 @@ Has the program issue WDC get-drive-status command : diff --git a/Documentation/nvme-wdc-get-error-recovery-log.1 b/Documentation/nvme-wdc-get-error-recovery-log.1 index 971b880..6590738 100644 --- a/Documentation/nvme-wdc-get-error-recovery-log.1 +++ b/Documentation/nvme-wdc-get-error-recovery-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-error-recovery-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-ERRO" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-ERRO" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-error-recovery-log.html b/Documentation/nvme-wdc-get-error-recovery-log.html index 6655a71..839074b 100644 --- a/Documentation/nvme-wdc-get-error-recovery-log.html +++ b/Documentation/nvme-wdc-get-error-recovery-log.html @@ -816,7 +816,7 @@ Has the program issue WDC get-error-recovery-log plugin command : diff --git a/Documentation/nvme-wdc-get-latency-monitor-log.1 b/Documentation/nvme-wdc-get-latency-monitor-log.1 index 8d53cb5..36c6fb9 100644 --- a/Documentation/nvme-wdc-get-latency-monitor-log.1 +++ b/Documentation/nvme-wdc-get-latency-monitor-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-latency-monitor-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-LATE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-LATE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-latency-monitor-log.html b/Documentation/nvme-wdc-get-latency-monitor-log.html index d17ea07..059301c 100644 --- a/Documentation/nvme-wdc-get-latency-monitor-log.html +++ b/Documentation/nvme-wdc-get-latency-monitor-log.html @@ -810,7 +810,7 @@ Displays the get latency monitor log for the device: diff --git a/Documentation/nvme-wdc-get-pfail-dump.1 b/Documentation/nvme-wdc-get-pfail-dump.1 index 29ba533..d17abfa 100644 --- a/Documentation/nvme-wdc-get-pfail-dump.1 +++ b/Documentation/nvme-wdc-get-pfail-dump.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-pfail-dump .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-PFAI" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-PFAI" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-pfail-dump.html b/Documentation/nvme-wdc-get-pfail-dump.html index 82e3d84..ce5d4f6 100644 --- a/Documentation/nvme-wdc-get-pfail-dump.html +++ b/Documentation/nvme-wdc-get-pfail-dump.html @@ -832,7 +832,7 @@ Gets the pfail crash dump from the device and saves to defined file with pathnam diff --git a/Documentation/nvme-wdc-get-unsupported-reqs-log.1 b/Documentation/nvme-wdc-get-unsupported-reqs-log.1 index 0472708..57f0169 100644 --- a/Documentation/nvme-wdc-get-unsupported-reqs-log.1 +++ b/Documentation/nvme-wdc-get-unsupported-reqs-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-unsupported-reqs-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-UNSU" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-UNSU" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-unsupported-reqs-log.html b/Documentation/nvme-wdc-get-unsupported-reqs-log.html index 4e10f8f..bb81c98 100644 --- a/Documentation/nvme-wdc-get-unsupported-reqs-log.html +++ b/Documentation/nvme-wdc-get-unsupported-reqs-log.html @@ -816,7 +816,7 @@ Has the program issue WDC get-unsupported-reqs-log plugin command : diff --git a/Documentation/nvme-wdc-id-ctrl.1 b/Documentation/nvme-wdc-id-ctrl.1 index 16f38dc..a352201 100644 --- a/Documentation/nvme-wdc-id-ctrl.1 +++ b/Documentation/nvme-wdc-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-ID\-CTRL" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-ID\-CTRL" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-id-ctrl.html b/Documentation/nvme-wdc-id-ctrl.html index 2d23de2..416b2cd 100644 --- a/Documentation/nvme-wdc-id-ctrl.html +++ b/Documentation/nvme-wdc-id-ctrl.html @@ -856,7 +856,7 @@ fields in a human readable format: diff --git a/Documentation/nvme-wdc-log-page-directory.1 b/Documentation/nvme-wdc-log-page-directory.1 index 4f5c09b..d7f81d1 100644 --- a/Documentation/nvme-wdc-log-page-directory.1 +++ b/Documentation/nvme-wdc-log-page-directory.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-log-page-directory .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-LOG\-PAGE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-LOG\-PAGE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-log-page-directory.html b/Documentation/nvme-wdc-log-page-directory.html index 7613d8d..b86394c 100644 --- a/Documentation/nvme-wdc-log-page-directory.html +++ b/Documentation/nvme-wdc-log-page-directory.html @@ -812,7 +812,7 @@ WDC log-page-directory example command : diff --git a/Documentation/nvme-wdc-namespace-resize.1 b/Documentation/nvme-wdc-namespace-resize.1 index dc69436..ff38640 100644 --- a/Documentation/nvme-wdc-namespace-resize.1 +++ b/Documentation/nvme-wdc-namespace-resize.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-namespace-resize .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-NAMESPACE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-NAMESPACE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-namespace-resize.html b/Documentation/nvme-wdc-namespace-resize.html index e4243c4..cb7451f 100644 --- a/Documentation/nvme-wdc-namespace-resize.html +++ b/Documentation/nvme-wdc-namespace-resize.html @@ -838,7 +838,7 @@ Resizes namespace 2 to 7% of the original TNVMCAP reported value: diff --git a/Documentation/nvme-wdc-purge-monitor.1 b/Documentation/nvme-wdc-purge-monitor.1 index b43f006..284f0d6 100644 --- a/Documentation/nvme-wdc-purge-monitor.1 +++ b/Documentation/nvme-wdc-purge-monitor.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-purge-monitor .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-PURGE\-MO" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-PURGE\-MO" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-purge-monitor.html b/Documentation/nvme-wdc-purge-monitor.html index fb52d6e..54e9873 100644 --- a/Documentation/nvme-wdc-purge-monitor.html +++ b/Documentation/nvme-wdc-purge-monitor.html @@ -837,7 +837,7 @@ Has the program issue WDC Purge-Monitor Vendor Unique Command : diff --git a/Documentation/nvme-wdc-purge.1 b/Documentation/nvme-wdc-purge.1 index 33e81c7..82bedfd 100644 --- a/Documentation/nvme-wdc-purge.1 +++ b/Documentation/nvme-wdc-purge.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-purge .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-PURGE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-PURGE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-purge.html b/Documentation/nvme-wdc-purge.html index 0a4fbd2..4be35b4 100644 --- a/Documentation/nvme-wdc-purge.html +++ b/Documentation/nvme-wdc-purge.html @@ -799,7 +799,7 @@ Has the program issue WDC Purge Vendor Unique Command : diff --git a/Documentation/nvme-wdc-vs-cloud-log.1 b/Documentation/nvme-wdc-vs-cloud-log.1 index 87b8dee..afd432b 100644 --- a/Documentation/nvme-wdc-vs-cloud-log.1 +++ b/Documentation/nvme-wdc-vs-cloud-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-cloud-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-CLOUD" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-CLOUD" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-cloud-log.html b/Documentation/nvme-wdc-vs-cloud-log.html index c1ebb49..f4818a8 100644 --- a/Documentation/nvme-wdc-vs-cloud-log.html +++ b/Documentation/nvme-wdc-vs-cloud-log.html @@ -828,7 +828,7 @@ Has the program issue WDC vs-cloud-log Vendor Unique Command : diff --git a/Documentation/nvme-wdc-vs-device-waf.1 b/Documentation/nvme-wdc-vs-device-waf.1 index 393d290..baf7d1f 100644 --- a/Documentation/nvme-wdc-vs-device-waf.1 +++ b/Documentation/nvme-wdc-vs-device-waf.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-device-waf .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-DEVIC" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-DEVIC" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-device-waf.html b/Documentation/nvme-wdc-vs-device-waf.html index c4a9cea..e8826e9 100644 --- a/Documentation/nvme-wdc-vs-device-waf.html +++ b/Documentation/nvme-wdc-vs-device-waf.html @@ -828,7 +828,7 @@ Has the program issue WDC vs-device-waf plugin Command : diff --git a/Documentation/nvme-wdc-vs-drive-info.1 b/Documentation/nvme-wdc-vs-drive-info.1 index a314a94..d5cba92 100644 --- a/Documentation/nvme-wdc-vs-drive-info.1 +++ b/Documentation/nvme-wdc-vs-drive-info.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-drive-info .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-DRIVE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-DRIVE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-drive-info.html b/Documentation/nvme-wdc-vs-drive-info.html index 9fadd7d..e5895ee 100644 --- a/Documentation/nvme-wdc-vs-drive-info.html +++ b/Documentation/nvme-wdc-vs-drive-info.html @@ -795,7 +795,7 @@ on the drive:

    diff --git a/Documentation/nvme-wdc-vs-error-reason-identifier.1 b/Documentation/nvme-wdc-vs-error-reason-identifier.1 index 5bd9913..64136b0 100644 --- a/Documentation/nvme-wdc-vs-error-reason-identifier.1 +++ b/Documentation/nvme-wdc-vs-error-reason-identifier.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-error-reason-identifier .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-ERROR" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-ERROR" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-error-reason-identifier.html b/Documentation/nvme-wdc-vs-error-reason-identifier.html index aad1677..a0c2e8a 100644 --- a/Documentation/nvme-wdc-vs-error-reason-identifier.html +++ b/Documentation/nvme-wdc-vs-error-reason-identifier.html @@ -836,7 +836,7 @@ Retrieves the controller initiated error reason identifier field and save it in diff --git a/Documentation/nvme-wdc-vs-fw-activate-history.1 b/Documentation/nvme-wdc-vs-fw-activate-history.1 index edb0bc9..6ab9d47 100644 --- a/Documentation/nvme-wdc-vs-fw-activate-history.1 +++ b/Documentation/nvme-wdc-vs-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-FW\-A" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-FW\-A" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-fw-activate-history.html b/Documentation/nvme-wdc-vs-fw-activate-history.html index 2ecd323..c0b819f 100644 --- a/Documentation/nvme-wdc-vs-fw-activate-history.html +++ b/Documentation/nvme-wdc-vs-fw-activate-history.html @@ -868,7 +868,7 @@ Has the program issue WDC vs-fw-activate-history Vendor Unique Command : diff --git a/Documentation/nvme-wdc-vs-hw-rev-log.1 b/Documentation/nvme-wdc-vs-hw-rev-log.1 index 8e8e0c3..c0e65a9 100644 --- a/Documentation/nvme-wdc-vs-hw-rev-log.1 +++ b/Documentation/nvme-wdc-vs-hw-rev-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-hw-rev-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-HW\-R" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-HW\-R" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-hw-rev-log.html b/Documentation/nvme-wdc-vs-hw-rev-log.html index 5c4c7da..34799fb 100644 --- a/Documentation/nvme-wdc-vs-hw-rev-log.html +++ b/Documentation/nvme-wdc-vs-hw-rev-log.html @@ -827,7 +827,7 @@ Has the program issue WDC vs-hw-rev-log plugin Command : diff --git a/Documentation/nvme-wdc-vs-internal-log.1 b/Documentation/nvme-wdc-vs-internal-log.1 index a977943..29a9974 100644 --- a/Documentation/nvme-wdc-vs-internal-log.1 +++ b/Documentation/nvme-wdc-vs-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-INTER" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-INTER" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-internal-log.html b/Documentation/nvme-wdc-vs-internal-log.html index 664ad96..0208ba0 100644 --- a/Documentation/nvme-wdc-vs-internal-log.html +++ b/Documentation/nvme-wdc-vs-internal-log.html @@ -950,7 +950,7 @@ Gets the controller telemetry log page to data area 3 from the device and stores diff --git a/Documentation/nvme-wdc-vs-nand-stats.1 b/Documentation/nvme-wdc-vs-nand-stats.1 index cd44619..4f291a0 100644 --- a/Documentation/nvme-wdc-vs-nand-stats.1 +++ b/Documentation/nvme-wdc-vs-nand-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-nand-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-NAND\" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-NAND\" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-nand-stats.html b/Documentation/nvme-wdc-vs-nand-stats.html index cd07a5f..31c3632 100644 --- a/Documentation/nvme-wdc-vs-nand-stats.html +++ b/Documentation/nvme-wdc-vs-nand-stats.html @@ -814,7 +814,7 @@ Has the program issue WDC vs-nand-stats Vendor Unique Command : diff --git a/Documentation/nvme-wdc-vs-smart-add-log.1 b/Documentation/nvme-wdc-vs-smart-add-log.1 index ce42747..3c334de 100644 --- a/Documentation/nvme-wdc-vs-smart-add-log.1 +++ b/Documentation/nvme-wdc-vs-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-SMART" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-SMART" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-smart-add-log.html b/Documentation/nvme-wdc-vs-smart-add-log.html index 1e62851..102ee6b 100644 --- a/Documentation/nvme-wdc-vs-smart-add-log.html +++ b/Documentation/nvme-wdc-vs-smart-add-log.html @@ -927,7 +927,7 @@ Has the program issue WDC vs-smart-add-log Vendor Unique Command for 0xC0 and 0x diff --git a/Documentation/nvme-wdc-vs-telemetry-controller-option.1 b/Documentation/nvme-wdc-vs-telemetry-controller-option.1 index 80e059b..eb60777 100644 --- a/Documentation/nvme-wdc-vs-telemetry-controller-option.1 +++ b/Documentation/nvme-wdc-vs-telemetry-controller-option.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-telemetry-controller-option .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-TELEM" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-TELEM" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-telemetry-controller-option.html b/Documentation/nvme-wdc-vs-telemetry-controller-option.html index 8752d97..92d7490 100644 --- a/Documentation/nvme-wdc-vs-telemetry-controller-option.html +++ b/Documentation/nvme-wdc-vs-telemetry-controller-option.html @@ -853,7 +853,7 @@ Gets the current status (enabled or disabled) of the controller initiated option diff --git a/Documentation/nvme-wdc-vs-temperature-stats.1 b/Documentation/nvme-wdc-vs-temperature-stats.1 index 695eb6a..92bfd86 100644 --- a/Documentation/nvme-wdc-vs-temperature-stats.1 +++ b/Documentation/nvme-wdc-vs-temperature-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-temperature-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-TEMPE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-TEMPE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-temperature-stats.html b/Documentation/nvme-wdc-vs-temperature-stats.html index 1d166fa..1eadf1e 100644 --- a/Documentation/nvme-wdc-vs-temperature-stats.html +++ b/Documentation/nvme-wdc-vs-temperature-stats.html @@ -857,7 +857,7 @@ Displays the temperature stats for the device: diff --git a/Documentation/nvme-write-uncor.1 b/Documentation/nvme-write-uncor.1 index e277dc7..369a4d2 100644 --- a/Documentation/nvme-write-uncor.1 +++ b/Documentation/nvme-write-uncor.1 @@ -2,12 +2,12 @@ .\" Title: nvme-uncor .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-UNCOR" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-UNCOR" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-write-uncor.html b/Documentation/nvme-write-uncor.html index 714a664..5d2ae1e 100644 --- a/Documentation/nvme-write-uncor.html +++ b/Documentation/nvme-write-uncor.html @@ -830,7 +830,7 @@ blocks.

    diff --git a/Documentation/nvme-write-zeroes.1 b/Documentation/nvme-write-zeroes.1 index 9a9ab08..3ddd1fa 100644 --- a/Documentation/nvme-write-zeroes.1 +++ b/Documentation/nvme-write-zeroes.1 @@ -2,12 +2,12 @@ .\" Title: nvme-write-zeroes .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WRITE\-ZEROES" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WRITE\-ZEROES" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-write-zeroes.html b/Documentation/nvme-write-zeroes.html index b982cc1..c914b25 100644 --- a/Documentation/nvme-write-zeroes.html +++ b/Documentation/nvme-write-zeroes.html @@ -975,7 +975,7 @@ metadata is passes.

    diff --git a/Documentation/nvme-write.1 b/Documentation/nvme-write.1 index 4cd1452..acd66fc 100644 --- a/Documentation/nvme-write.1 +++ b/Documentation/nvme-write.1 @@ -2,12 +2,12 @@ .\" Title: nvme-write .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WRITE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-WRITE" "1" "01/30/2023" "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 | \-g ] [\-\-storage\-tag\-check | \-C ] [\-\-force] .fi @@ -191,6 +192,11 @@ be set\&. Otherwise \-\-dry\-run option will be Print out the latency the IOCTL took (in us)\&. .RE .PP +\-\-storage\-tag=, \-g +.RS 4 +Variable Sized Expected Logical Block Storage Tag(ELBST)\&. +.RE +.PP \-\-storage\-tag\-check=, \-C .RS 4 This bit specifies the Storage Tag field shall be checked as part of end\-to\-end data protection processing\&. diff --git a/Documentation/nvme-write.html b/Documentation/nvme-write.html index a0aa250..b6c2435 100644 --- a/Documentation/nvme-write.html +++ b/Documentation/nvme-write.html @@ -767,6 +767,7 @@ nvme-write(1) Manual Page [--show-command | -v] [--dry-run | -w] [--latency | -t] + [--storage-tag<storage-tag> | -g <storage-tag>] [--storage-tag-check<storage-tag-check> | -C <storage-tag-check>] [--force]
    @@ -1038,6 +1039,17 @@ metadata is passes.

    +--storage-tag=<storage-tag> +
    +
    +-g <storage-tag> +
    +
    +

    + Variable Sized Expected Logical Block Storage Tag(ELBST). +

    +
    +
    --storage-tag-check=<storage-tag-check>
    @@ -1078,7 +1090,7 @@ metadata is passes.

    diff --git a/Documentation/nvme-write.txt b/Documentation/nvme-write.txt index 837bd5c..89aa667 100644 --- a/Documentation/nvme-write.txt +++ b/Documentation/nvme-write.txt @@ -26,6 +26,7 @@ SYNOPSIS [--show-command | -v] [--dry-run | -w] [--latency | -t] + [--storage-tag | -g ] [--storage-tag-check | -C ] [--force] @@ -138,6 +139,10 @@ metadata is passes. --latency:: Print out the latency the IOCTL took (in us). +--storage-tag=:: +-g :: + Variable Sized Expected Logical Block Storage Tag(ELBST). + --storage-tag-check=:: -C :: This bit specifies the Storage Tag field shall be checked as part of end-to-end diff --git a/Documentation/nvme-zns-changed-zone-list.1 b/Documentation/nvme-zns-changed-zone-list.1 index 447936a..f5e93c0 100644 --- a/Documentation/nvme-zns-changed-zone-list.1 +++ b/Documentation/nvme-zns-changed-zone-list.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-changed-zone-list .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-CHANGED\-" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-CHANGED\-" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-changed-zone-list.html b/Documentation/nvme-zns-changed-zone-list.html index 816309a..75089f7 100644 --- a/Documentation/nvme-zns-changed-zone-list.html +++ b/Documentation/nvme-zns-changed-zone-list.html @@ -833,7 +833,7 @@ Show the output in json format diff --git a/Documentation/nvme-zns-close-zone.1 b/Documentation/nvme-zns-close-zone.1 index d7c42f2..db7ba53 100644 --- a/Documentation/nvme-zns-close-zone.1 +++ b/Documentation/nvme-zns-close-zone.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-close-zone .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-CLOSE\-ZO" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-CLOSE\-ZO" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-close-zone.html b/Documentation/nvme-zns-close-zone.html index 7dcd2d2..c4f4059 100644 --- a/Documentation/nvme-zns-close-zone.html +++ b/Documentation/nvme-zns-close-zone.html @@ -846,7 +846,7 @@ Close all zones on namespace 1: diff --git a/Documentation/nvme-zns-finish-zone.1 b/Documentation/nvme-zns-finish-zone.1 index e49f897..1c06319 100644 --- a/Documentation/nvme-zns-finish-zone.1 +++ b/Documentation/nvme-zns-finish-zone.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-finish-zone .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-FINISH\-Z" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-FINISH\-Z" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-finish-zone.html b/Documentation/nvme-zns-finish-zone.html index 3a2bbab..8d46b67 100644 --- a/Documentation/nvme-zns-finish-zone.html +++ b/Documentation/nvme-zns-finish-zone.html @@ -847,7 +847,7 @@ Finish all zones on namespace 1: diff --git a/Documentation/nvme-zns-id-ctrl.1 b/Documentation/nvme-zns-id-ctrl.1 index 031103f..f31d7a6 100644 --- a/Documentation/nvme-zns-id-ctrl.1 +++ b/Documentation/nvme-zns-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ID\-CTRL" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ID\-CTRL" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-id-ctrl.html b/Documentation/nvme-zns-id-ctrl.html index 1caaa11..24a757a 100644 --- a/Documentation/nvme-zns-id-ctrl.html +++ b/Documentation/nvme-zns-id-ctrl.html @@ -821,7 +821,7 @@ Show the output in json format diff --git a/Documentation/nvme-zns-id-ns.1 b/Documentation/nvme-zns-id-ns.1 index 53b17b0..c9ec69b 100644 --- a/Documentation/nvme-zns-id-ns.1 +++ b/Documentation/nvme-zns-id-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ID\-NS" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ID\-NS" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-id-ns.html b/Documentation/nvme-zns-id-ns.html index fae15a7..306e585 100644 --- a/Documentation/nvme-zns-id-ns.html +++ b/Documentation/nvme-zns-id-ns.html @@ -847,7 +847,7 @@ Show the output in json format with extra details diff --git a/Documentation/nvme-zns-offline-zone.1 b/Documentation/nvme-zns-offline-zone.1 index 94761cc..e2920d8 100644 --- a/Documentation/nvme-zns-offline-zone.1 +++ b/Documentation/nvme-zns-offline-zone.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-offline-zone .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-OFFLINE\-" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-OFFLINE\-" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-offline-zone.html b/Documentation/nvme-zns-offline-zone.html index e3ad35a..216b3b4 100644 --- a/Documentation/nvme-zns-offline-zone.html +++ b/Documentation/nvme-zns-offline-zone.html @@ -846,7 +846,7 @@ Offline all zones on namespace 1: diff --git a/Documentation/nvme-zns-open-zone.1 b/Documentation/nvme-zns-open-zone.1 index de3e8f2..5c4ae4f 100644 --- a/Documentation/nvme-zns-open-zone.1 +++ b/Documentation/nvme-zns-open-zone.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-open-zone .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-OPEN\-ZON" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-OPEN\-ZON" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-open-zone.html b/Documentation/nvme-zns-open-zone.html index e66997a..aec35d0 100644 --- a/Documentation/nvme-zns-open-zone.html +++ b/Documentation/nvme-zns-open-zone.html @@ -858,7 +858,7 @@ Open the first zone on namespace 1: diff --git a/Documentation/nvme-zns-report-zones.1 b/Documentation/nvme-zns-report-zones.1 index e51f24d..2bc1741 100644 --- a/Documentation/nvme-zns-report-zones.1 +++ b/Documentation/nvme-zns-report-zones.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-report-zones .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-REPORT\-Z" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-REPORT\-Z" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-report-zones.html b/Documentation/nvme-zns-report-zones.html index e015edd..8dfbcff 100644 --- a/Documentation/nvme-zns-report-zones.html +++ b/Documentation/nvme-zns-report-zones.html @@ -957,7 +957,7 @@ Show the output in json format with extra details diff --git a/Documentation/nvme-zns-reset-zone.1 b/Documentation/nvme-zns-reset-zone.1 index b28e94e..487289b 100644 --- a/Documentation/nvme-zns-reset-zone.1 +++ b/Documentation/nvme-zns-reset-zone.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-reset-zone .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-RESET\-ZO" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-RESET\-ZO" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-reset-zone.html b/Documentation/nvme-zns-reset-zone.html index 633cc45..15bde7a 100644 --- a/Documentation/nvme-zns-reset-zone.html +++ b/Documentation/nvme-zns-reset-zone.html @@ -847,7 +847,7 @@ Reset the first zone on namespace 1: diff --git a/Documentation/nvme-zns-set-zone-desc.1 b/Documentation/nvme-zns-set-zone-desc.1 index ee04f7e..19e3b19 100644 --- a/Documentation/nvme-zns-set-zone-desc.1 +++ b/Documentation/nvme-zns-set-zone-desc.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-set-zone-desc .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-SET\-ZONE" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-SET\-ZONE" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-set-zone-desc.html b/Documentation/nvme-zns-set-zone-desc.html index 7587d8a..01774ef 100644 --- a/Documentation/nvme-zns-set-zone-desc.html +++ b/Documentation/nvme-zns-set-zone-desc.html @@ -859,7 +859,7 @@ Write "hello world" into the zone descriptor for namespace 1’s first zone diff --git a/Documentation/nvme-zns-zone-append.1 b/Documentation/nvme-zns-zone-append.1 index 1de897b..bf7351d 100644 --- a/Documentation/nvme-zns-zone-append.1 +++ b/Documentation/nvme-zns-zone-append.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-zone-append .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ZONE\-APP" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ZONE\-APP" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-zone-append.html b/Documentation/nvme-zns-zone-append.html index de48205..c7ecf31 100644 --- a/Documentation/nvme-zns-zone-append.html +++ b/Documentation/nvme-zns-zone-append.html @@ -940,7 +940,7 @@ Append the data "hello world" into 4k worth of blocks into the zone starting diff --git a/Documentation/nvme-zns-zone-mgmt-recv.1 b/Documentation/nvme-zns-zone-mgmt-recv.1 index 95af07f..125e302 100644 --- a/Documentation/nvme-zns-zone-mgmt-recv.1 +++ b/Documentation/nvme-zns-zone-mgmt-recv.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-zone-mgmt-recv .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ZONE\-MGM" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ZONE\-MGM" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-zone-mgmt-recv.html b/Documentation/nvme-zns-zone-mgmt-recv.html index 0ddc298..f2a6e09 100644 --- a/Documentation/nvme-zns-zone-mgmt-recv.html +++ b/Documentation/nvme-zns-zone-mgmt-recv.html @@ -882,7 +882,7 @@ Binary dump of a report all zones diff --git a/Documentation/nvme-zns-zone-mgmt-send.1 b/Documentation/nvme-zns-zone-mgmt-send.1 index 60d4f86..5d21bf5 100644 --- a/Documentation/nvme-zns-zone-mgmt-send.1 +++ b/Documentation/nvme-zns-zone-mgmt-send.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-zone-mgmt-send .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ZONE\-MGM" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ZONE\-MGM" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-zone-mgmt-send.html b/Documentation/nvme-zns-zone-mgmt-send.html index b35735e..3a17aee 100644 --- a/Documentation/nvme-zns-zone-mgmt-send.html +++ b/Documentation/nvme-zns-zone-mgmt-send.html @@ -916,7 +916,7 @@ Write "hello world" into the zone descriptor for namespace 1’s first zone diff --git a/Documentation/nvme.1 b/Documentation/nvme.1 index 1ccbbea..c8348e8 100644 --- a/Documentation/nvme.1 +++ b/Documentation/nvme.1 @@ -2,12 +2,12 @@ .\" Title: nvme .\" Author: [see the "Authors" section] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 11/02/2022 +.\" Date: 01/30/2023 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME" "1" "11/02/2022" "NVMe" "NVMe Manual" +.TH "NVME" "1" "01/30/2023" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -848,6 +848,11 @@ Zone Management Send command .RS 4 Flush LBAs associated with a ZRWA to a zone .RE +.PP +\fBnvme-inspur-nvme-vendor-log\fR(1) +.RS 4 +NVMe Inspur Device Vendor log page request +.RE .SH "RETURNS" .sp All commands will behave the same, they will return 0 on success and 1 on failure\&. diff --git a/Documentation/nvme.html b/Documentation/nvme.html index 3ccb107..086a3b7 100644 --- a/Documentation/nvme.html +++ b/Documentation/nvme.html @@ -2063,6 +2063,14 @@ available, run "nvme help".

    Flush LBAs associated with a ZRWA to a zone

    +
    +nvme-inspur-nvme-vendor-log(1) +
    +
    +

    + NVMe Inspur Device Vendor log page request +

    +
    @@ -2106,7 +2114,7 @@ NVM-Express Site.

    diff --git a/completions/_nvme b/completions/_nvme index 16c9b7c..5910898 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -1,6 +1,5 @@ -# SPDX-License-Identifier: GPL-2.0-or-later - #compdef _nvme nvme +# SPDX-License-Identifier: GPL-2.0-or-later # zsh completions for the nvme command-line interface, # very loosely based on git and adb command completion diff --git a/completions/bash-nvme-completion.sh b/completions/bash-nvme-completion.sh index f067940..c5fbda0 100644 --- a/completions/bash-nvme-completion.sh +++ b/completions/bash-nvme-completion.sh @@ -4,114 +4,6 @@ # (unfortunately, bash won't let me add descriptions to cmds) # Kelly Kaoudis kelly.n.kaoudis at intel.com, Aug. 2015 -# Constant to indicate command has no options -NO_OPTS="" -readonly NO_OPTS - -# Associative array of plugins and associated subcommands -# Order here is same as PLUGIN_OBJS in Makefile -typeset -Ar _plugin_subcmds=( - [intel]="id-ctrl internal-log lat-stats \ - set-bucket-thresholds lat-stats-tracking \ - market-name smart-log-add temp-stats" - [amzn]="id-ctrl" - [memblaze]="smart-log-add get-pm-status set-pm-status \ - select-download lat-stats lat-stats-print lat-log \ - lat-log-print clear-error-log" - [wdc]="cap-diag drive-log get-crash-dump get-pfail-dump \ - id-ctrl purge purge-monitor vs-internal-log \ - vs-nand-stats vs-smart-add-log clear-pcie-correctable-errors \ - drive-essentials get-drive-status clear-assert-dump \ - drive-resize vs-fw-activate-history clear-fw-activate-history \ - enc-get-log vs-telemetry-controller-option \ - vs-error-reason-identifier log-page-directory \ - namespace-resize vs-drive-info vs-temperature-stats \ - capabilities cloud-SSD-plugin-version vs-pcie-stats" - [huawei]="list id-ctrl" - [netapp]="smdevices ontapdevices" - [toshiba]="vs-smart-add-log vs-internal-log \ - clear-pcie-correctable-errors" - [micron]="select-download vs-temperature-stats vs-pcie-stats \ - clear-pcie-correctable-errors vs-internal-log \ - vs-telemetry-controller-option vs-nand-stats \ - vs-drive-info plugin-version cloud-SSD-plugin-version \ - log-page-directory vs-fw-activate-history \ - vs-error-reason-identifier vs-smart-add-log \ - clear-fw-activate-history vs-smbus-option" - [seagate]="vs-temperature-stats vs-log-page-sup \ - vs-smart-add-log vs-pcie-stats clear-pcie-correctable-errors \ - get-host-tele get-ctrl-tele vs-internal-log \ - plugin-version" - [virtium]="save-smart-to-vtview-log show-identify" - [shannon]="smart-log-add get-feature-add set-feature-add id-ctrl" - [dera]="smart-log-add" - [sfx]="smart-log-add lat-stats get-bad-block query-cap \ - change-cap set-feature get-feature" - [transcend]="healthvalue badblock" - [zns]="id-ctrl id-ns zone-mgmt-recv \ - zone-mgmt-send report-zones close-zone \ - finish-zone open-zone reset-zone offline-zone \ - set-zone-desc zone-append changed-zone-list" - [nvidia]="id-ctrl" - [ymtc]="smart-log-add" -) -readonly _plugin_subcmds - -# Associative array mapping plugins to coresponding option completions -typeset -Ar _plugin_funcs=( - [intel]="plugin_intel_opts" - [amzn]="plugin_amzn_opts" - [memblaze]="plugin_memblaze_opts" - [wdc]="plugin_wdc_opts" - [huawei]="plugin_huawei_opts" - [toshiba]="plugin_toshiba_opts" - [micron]="plugin_micron_opts" - [seagate]="plugin_seagate_opts" - [virtium]="plugin_virtium_opts" - [shannon]="plugin_shannon_opts" - [dera]="plugin_dera_opts" - [sfx]="pluginx_sfx_opts" - [transcend]="plugin_transcend_opts" - [zns]="plugin_zns_opts" - [nvidia]="plugin_nvidia_opts" - [ymtc]="plugin_ymtc_opts" -) -readonly _plugin_funcs - -# Top level commands -_cmds="list list-subsys id-ctrl id-ns \ - id-ns-granularity list-ns list-ctrl \ - id-ns-lba-format nvm-id-ns nvm-id-ns-lba-format \ - nvm-id-ctrl primary-ctrl-caps list-secondary \ - ns-descs id-nvmset id-uuid id-iocs create-ns \ - delete-ns get-ns-id get-log telemetry-log \ - fw-log changed-ns-list-log smart-log ana-log \ - error-log effects-log endurance-log \ - predictable-lat-log pred-lat-event-agg-log \ - persistent-event-log endurance-agg-log \ - lba-status-log resv-notif-log get-feature \ - device-self-test self-test-log set-feature \ - set-property get-property format fw-commit \ - fw-download admin-passthru io-passthru \ - security-send security-recv get-lba-status \ - resv-acquire resv-register resv-release \ - resv-report dsm copy flush compare read \ - write write-zeros write-uncor verify \ - sanitize sanitize-log reset subsystem-reset \ - ns-rescan show-regs discover connect-all \ - connect disconnect disconnect-all gen-hostnqn \ - show-hostnqn dir-receive dir-send virt-mgmt \ - rpmb boot-part-log fid-support-effects-log \ - supported-log-pages lockdown media-unit-stat-log \ - supported-cap-config-log dim show-topology" - -# Add plugins: -for plugin in "${!_plugin_subcmds[@]}"; do - _cmds+=" $plugin" -done - -cmds+=" version help" - nvme_list_opts () { local opts="" local compargs="" @@ -1333,7 +1225,38 @@ plugin_ymtc_opts () { opts+=" --namespace-id= -n --raw-binary -b" ;; "help") - opts+=NO_OPTS + opts+=$NO_OPTS + ;; + esac + + COMPREPLY+=( $( compgen $compargs -W "$opts" -- $cur ) ) + + return 0 +} + +plugin_inspur_opts () { + local opts="" + local compargs="" + + local nonopt_args=0 + for (( i=0; i < ${#words[@]}-1; i++ )); do + if [[ ${words[i]} != -* ]]; then + let nonopt_args+=1 + fi + done + + if [ $nonopt_args -eq 3 ]; then + opts="/dev/nvme* " + fi + + opts+=" " + + case "$1" in + "nvme-vendor-log") + opts+=$NO_OPTS + ;; + "help") + opts+=$NO_OPTS ;; esac @@ -1346,6 +1269,113 @@ _nvme_subcmds () { local cur prev words cword _init_completion || return + # Constant to indicate command has no options + NO_OPTS="" + + # Associative array of plugins and associated subcommands + # Order here is same as PLUGIN_OBJS in Makefile + typeset -Ar _plugin_subcmds=( + [intel]="id-ctrl internal-log lat-stats \ + set-bucket-thresholds lat-stats-tracking \ + market-name smart-log-add temp-stats" + [amzn]="id-ctrl" + [memblaze]="smart-log-add get-pm-status set-pm-status \ + select-download lat-stats lat-stats-print lat-log \ + lat-log-print clear-error-log" + [wdc]="cap-diag drive-log get-crash-dump get-pfail-dump \ + id-ctrl purge purge-monitor vs-internal-log \ + vs-nand-stats vs-smart-add-log clear-pcie-correctable-errors \ + drive-essentials get-drive-status clear-assert-dump \ + drive-resize vs-fw-activate-history clear-fw-activate-history \ + enc-get-log vs-telemetry-controller-option \ + vs-error-reason-identifier log-page-directory \ + namespace-resize vs-drive-info vs-temperature-stats \ + capabilities cloud-SSD-plugin-version vs-pcie-stats" + [huawei]="list id-ctrl" + [netapp]="smdevices ontapdevices" + [toshiba]="vs-smart-add-log vs-internal-log \ + clear-pcie-correctable-errors" + [micron]="select-download vs-temperature-stats vs-pcie-stats \ + clear-pcie-correctable-errors vs-internal-log \ + vs-telemetry-controller-option vs-nand-stats \ + vs-drive-info plugin-version cloud-SSD-plugin-version \ + log-page-directory vs-fw-activate-history \ + vs-error-reason-identifier vs-smart-add-log \ + clear-fw-activate-history vs-smbus-option" + [seagate]="vs-temperature-stats vs-log-page-sup \ + vs-smart-add-log vs-pcie-stats clear-pcie-correctable-errors \ + get-host-tele get-ctrl-tele vs-internal-log \ + plugin-version" + [virtium]="save-smart-to-vtview-log show-identify" + [shannon]="smart-log-add get-feature-add set-feature-add id-ctrl" + [dera]="smart-log-add" + [sfx]="smart-log-add lat-stats get-bad-block query-cap \ + change-cap set-feature get-feature" + [transcend]="healthvalue badblock" + [zns]="id-ctrl id-ns zone-mgmt-recv \ + zone-mgmt-send report-zones close-zone \ + finish-zone open-zone reset-zone offline-zone \ + set-zone-desc zone-append changed-zone-list" + [nvidia]="id-ctrl" + [ymtc]="smart-log-add" + [inspur]="nvme-vendor-log" + ) + + # Associative array mapping plugins to coresponding option completions + typeset -Ar _plugin_funcs=( + [intel]="plugin_intel_opts" + [amzn]="plugin_amzn_opts" + [memblaze]="plugin_memblaze_opts" + [wdc]="plugin_wdc_opts" + [huawei]="plugin_huawei_opts" + [toshiba]="plugin_toshiba_opts" + [micron]="plugin_micron_opts" + [seagate]="plugin_seagate_opts" + [virtium]="plugin_virtium_opts" + [shannon]="plugin_shannon_opts" + [dera]="plugin_dera_opts" + [sfx]="plugin_sfx_opts" + [transcend]="plugin_transcend_opts" + [zns]="plugin_zns_opts" + [nvidia]="plugin_nvidia_opts" + [ymtc]="plugin_ymtc_opts" + [inspur]="plugin_inspur_opts" + ) + + # Top level commands + _cmds="list list-subsys id-ctrl id-ns \ + id-ns-granularity list-ns list-ctrl \ + id-ns-lba-format nvm-id-ns nvm-id-ns-lba-format \ + nvm-id-ctrl primary-ctrl-caps list-secondary \ + ns-descs id-nvmset id-uuid id-iocs create-ns \ + delete-ns get-ns-id get-log telemetry-log \ + fw-log changed-ns-list-log smart-log ana-log \ + error-log effects-log endurance-log \ + predictable-lat-log pred-lat-event-agg-log \ + persistent-event-log endurance-agg-log \ + lba-status-log resv-notif-log get-feature \ + device-self-test self-test-log set-feature \ + set-property get-property format fw-commit \ + fw-download admin-passthru io-passthru \ + security-send security-recv get-lba-status \ + resv-acquire resv-register resv-release \ + resv-report dsm copy flush compare read \ + write write-zeros write-uncor verify \ + sanitize sanitize-log reset subsystem-reset \ + ns-rescan show-regs discover connect-all \ + connect disconnect disconnect-all gen-hostnqn \ + show-hostnqn dir-receive dir-send virt-mgmt \ + rpmb boot-part-log fid-support-effects-log \ + supported-log-pages lockdown media-unit-stat-log \ + supported-cap-config-log dim show-topology list-endgrp" + + # Add plugins: + for plugin in "${!_plugin_subcmds[@]}"; do + _cmds+=" $plugin" + done + + cmds+=" version help" + if [[ ${#words[*]} -lt 3 ]]; then COMPREPLY+=( $(compgen -W "$_cmds" -- $cur ) ) else diff --git a/fabrics.c b/fabrics.c index 5560b72..b94097b 100644 --- a/fabrics.c +++ b/fabrics.c @@ -124,6 +124,94 @@ static void space_strip_len(int max, char *str) } } +/* + * Compare two C strings and handle NULL pointers gracefully. + * If either of the two strings is NULL, return 0 + * to let caller ignore the compare. + */ +static inline int strcmp0(const char *s1, const char *s2) +{ + if (!s1 || !s2) + return 0; + return strcmp(s1, s2); +} + +/* + * Compare two C strings and handle NULL pointers gracefully. + * If either of the two strings is NULL, return 0 + * to let caller ignore the compare. + */ +static inline int strcasecmp0(const char *s1, const char *s2) +{ + if (!s1 || !s2) + return 0; + return strcasecmp(s1, s2); +} + +static bool is_persistent_discovery_ctrl(nvme_host_t h, nvme_ctrl_t c) +{ + if (nvme_host_is_pdc_enabled(h, DEFAULT_PDC_ENABLED)) + return nvme_ctrl_is_unique_discovery_ctrl(c); + + return false; +} + +static bool disc_ctrl_config_match(nvme_ctrl_t c, struct tr_config *trcfg) +{ + if (nvme_ctrl_is_discovery_ctrl(c) && + !strcmp0(nvme_ctrl_get_transport(c), trcfg->transport) && + !strcasecmp0(nvme_ctrl_get_traddr(c), trcfg->traddr) && + !strcmp0(nvme_ctrl_get_trsvcid(c), trcfg->trsvcid) && + !strcmp0(nvme_ctrl_get_host_traddr(c), trcfg->host_traddr) && + !strcmp0(nvme_ctrl_get_host_iface(c), trcfg->host_iface)) + return true; + + return false; +} + +static bool ctrl_config_match(nvme_ctrl_t c, struct tr_config *trcfg) +{ + if (!strcmp0(nvme_ctrl_get_subsysnqn(c), trcfg->subsysnqn) && + !strcmp0(nvme_ctrl_get_transport(c), trcfg->transport) && + !strcasecmp0(nvme_ctrl_get_traddr(c), trcfg->traddr) && + !strcmp0(nvme_ctrl_get_trsvcid(c), trcfg->trsvcid) && + !strcmp0(nvme_ctrl_get_host_traddr(c), trcfg->host_traddr) && + !strcmp0(nvme_ctrl_get_host_iface(c), trcfg->host_iface)) + return true; + + return false; +} + +static nvme_ctrl_t __lookup_ctrl(nvme_root_t r, struct tr_config *trcfg, + bool (*filter)(nvme_ctrl_t, struct tr_config *)) +{ + nvme_host_t h; + nvme_subsystem_t s; + nvme_ctrl_t c; + + nvme_for_each_host(r, h) { + nvme_for_each_subsystem(h, s) { + nvme_subsystem_for_each_ctrl(s, c) { + if (!(filter(c, trcfg))) + continue; + return c; + } + } + } + + return NULL; +} + +static nvme_ctrl_t lookup_discovery_ctrl(nvme_root_t r, struct tr_config *trcfg) +{ + return __lookup_ctrl(r, trcfg, disc_ctrl_config_match); +} + +static nvme_ctrl_t lookup_ctrl(nvme_root_t r, struct tr_config *trcfg) +{ + return __lookup_ctrl(r, trcfg, ctrl_config_match); +} + static int set_discovery_kato(struct nvme_fabrics_config *cfg) { int tmo = cfg->keep_alive_tmo; @@ -152,6 +240,8 @@ static nvme_ctrl_t __create_discover_ctrl(nvme_root_t r, nvme_host_t h, return NULL; nvme_ctrl_set_discovery_ctrl(c, true); + nvme_ctrl_set_unique_discovery_ctrl(c, + strcmp(trcfg->subsysnqn, NVME_DISC_SUBSYS_NAME)); tmo = set_discovery_kato(cfg); errno = 0; @@ -159,7 +249,6 @@ static nvme_ctrl_t __create_discover_ctrl(nvme_root_t r, nvme_host_t h, cfg->keep_alive_tmo = tmo; if (ret) { - errno = ret; nvme_free_ctrl(c); return NULL; } @@ -177,7 +266,7 @@ static nvme_ctrl_t create_discover_ctrl(nvme_root_t r, nvme_host_t h, if (!c) return NULL; - if (!persistent) + if (nvme_ctrl_is_unique_discovery_ctrl(c)) return c; /* Find out the name of discovery controller */ @@ -225,11 +314,12 @@ static void print_discovery_log(struct nvmf_discovery_log *log, int numrec) nvmf_adrfam_str(e->adrfam): ""); printf("subtype: %s\n", nvmf_subtype_str(e->subtype)); printf("treq: %s\n", nvmf_treq_str(e->treq)); - printf("portid: %d\n", e->portid); + printf("portid: %d\n", le16_to_cpu(e->portid)); printf("trsvcid: %s\n", e->trsvcid); printf("subnqn: %s\n", e->subnqn); printf("traddr: %s\n", e->traddr); - printf("eflags: %s\n", nvmf_eflags_str(e->eflags)); + printf("eflags: %s\n", + nvmf_eflags_str(le16_to_cpu(e->eflags))); switch (e->trtype) { case NVMF_TRTYPE_RDMA: @@ -265,9 +355,9 @@ static void json_discovery_log(struct nvmf_discovery_log *log, int numrec) struct nvmf_disc_log_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); + space_strip_len(NVMF_TRSVCID_SIZE, e->trsvcid); + space_strip_len(NVMF_NQN_SIZE, e->subnqn); + space_strip_len(NVMF_TRADDR_SIZE, e->traddr); json_object_add_value_string(entry, "trtype", nvmf_trtype_str(e->trtype)); @@ -282,7 +372,8 @@ static void json_discovery_log(struct nvmf_discovery_log *log, int numrec) 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); - json_object_add_value_uint(entry, "eflags", e->eflags); + json_object_add_value_string(entry, "eflags", + nvmf_eflags_str(le16_to_cpu(e->eflags))); switch (e->trtype) { case NVMF_TRTYPE_RDMA: @@ -355,43 +446,104 @@ static int __discover(nvme_ctrl_t c, struct nvme_fabrics_config *defcfg, struct nvmf_discovery_log *log = NULL; nvme_subsystem_t s = nvme_ctrl_get_subsystem(c); nvme_host_t h = nvme_subsystem_get_host(s); + nvme_root_t r = nvme_host_get_root(h); uint64_t numrec; - int err; - err = nvmf_get_discovery_log(c, &log, MAX_DISC_RETRIES); - if (err) { - if (err > 0) - nvme_show_status(err); - else - fprintf(stderr, "failed to get discovery log: %s\n", - nvme_strerror(errno)); - return err; - } + struct nvme_get_discovery_args args = { + .c = c, + .args_size = sizeof(args), + .max_retries = MAX_DISC_RETRIES, + .result = 0, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .lsp = 0, + }; + log = nvmf_get_discovery_wargs(&args); + if (!log) { + fprintf(stderr, "failed to get discovery log: %s\n", + nvme_strerror(errno)); + return errno; + } numrec = le64_to_cpu(log->numrec); if (raw) save_discovery_log(raw, log); else if (!connect) { - if (flags == JSON) - json_discovery_log(log, numrec); - else + switch (flags) { + case NORMAL: print_discovery_log(log, numrec); + break; + case JSON: + json_discovery_log(log, numrec); + break; + case BINARY: + d_raw((unsigned char *)log, + sizeof(struct nvmf_discovery_log) + + numrec * sizeof(struct nvmf_disc_log_entry)); + break; + default: + break; + } } else if (connect) { int i; for (i = 0; i < numrec; i++) { struct nvmf_disc_log_entry *e = &log->entries[i]; + nvme_ctrl_t cl; bool discover = false; + bool disconnect; nvme_ctrl_t child; int tmo = defcfg->keep_alive_tmo; + struct tr_config trcfg = { + .subsysnqn = e->subnqn, + .transport = nvmf_trtype_str(e->trtype), + .traddr = e->traddr, + .host_traddr = defcfg->host_traddr, + .host_iface = defcfg->host_iface, + .trsvcid = e->trsvcid, + }; + + /* Already connected ? */ + cl = lookup_ctrl(r, &trcfg); + if (cl && nvme_ctrl_get_name(cl)) + continue; + /* Skip connect if the transport types don't match */ - if (strcmp(nvme_ctrl_get_transport(c), nvmf_trtype_str(e->trtype))) + if (strcmp(nvme_ctrl_get_transport(c), + nvmf_trtype_str(e->trtype))) continue; - if (e->subtype == NVME_NQN_DISC) + if (e->subtype == NVME_NQN_DISC || + e->subtype == NVME_NQN_CURR) { + __u16 eflags = le16_to_cpu(e->eflags); + /* + * Does this discovery controller return the + * same information? + */ + if (eflags & NVMF_DISC_EFLAGS_DUPRETINFO) + continue; + + /* Are we supposed to keep the discovery + * controller around? */ + disconnect = !persistent; + + if (strcmp(e->subnqn, NVME_DISC_SUBSYS_NAME)) { + /* + * Does this discovery controller doesn't + * support explicit persistent connection? + */ + if (!(eflags & NVMF_DISC_EFLAGS_EPCSD)) + disconnect = true; + else + disconnect = false; + } + set_discovery_kato(defcfg); + } else { + /* NVME_NQN_NVME */ + disconnect = false; + } errno = 0; child = nvmf_connect_disc_entry(h, e, defcfg, @@ -403,8 +555,8 @@ static int __discover(nvme_ctrl_t c, struct nvme_fabrics_config *defcfg, if (discover) __discover(child, defcfg, raw, true, persistent, flags); - if (e->subtype != NVME_NQN_NVME && - !persistent) { + + if (disconnect) { nvme_disconnect_ctrl(child); nvme_free_ctrl(child); } @@ -423,62 +575,6 @@ static int __discover(nvme_ctrl_t c, struct nvme_fabrics_config *defcfg, return 0; } -/* - * Compare two C strings and handle NULL pointers gracefully. - * If either of the two strings is NULL, return 0 - * to let caller ignore the compare. - */ -static inline int strcmp0(const char *s1, const char *s2) -{ - if (!s1 || !s2) - return 0; - return strcmp(s1, s2); -} - -/* - * Compare two C strings and handle NULL pointers gracefully. - * If either of the two strings is NULL, return 0 - * to let caller ignore the compare. - */ -static inline int strcasecmp0(const char *s1, const char *s2) -{ - if (!s1 || !s2) - return 0; - return strcasecmp(s1, s2); -} - -static bool ctrl_config_match(nvme_ctrl_t c, struct tr_config *trcfg) -{ - if (!strcmp0(nvme_ctrl_get_transport(c), trcfg->transport) && - !strcasecmp0(nvme_ctrl_get_traddr(c), trcfg->traddr) && - !strcmp0(nvme_ctrl_get_trsvcid(c), trcfg->trsvcid) && - !strcmp0(nvme_ctrl_get_host_traddr(c), trcfg->host_traddr) && - !strcmp0(nvme_ctrl_get_host_iface(c), trcfg->host_iface)) - return true; - - return false; -} - -static nvme_ctrl_t lookup_discover_ctrl(nvme_root_t r, struct tr_config *trcfg) -{ - nvme_host_t h; - nvme_subsystem_t s; - nvme_ctrl_t c; - - nvme_for_each_host(r, h) { - nvme_for_each_subsystem(h, s) { - nvme_subsystem_for_each_ctrl(s, c) { - if (!nvme_ctrl_is_discovery_ctrl(c)) - continue; - if (ctrl_config_match(c, trcfg)) - return c; - } - } - } - - return NULL; -} - static char *get_default_trsvcid(const char *transport, bool discovery_ctrl) { @@ -581,7 +677,7 @@ static int discover_from_conf_file(nvme_root_t r, nvme_host_t h, }; if (!force) { - c = lookup_discover_ctrl(r, &trcfg); + c = lookup_discovery_ctrl(r, &trcfg); if (c) { __discover(c, &cfg, raw, connect, true, flags); @@ -594,7 +690,7 @@ static int discover_from_conf_file(nvme_root_t r, nvme_host_t h, goto next; __discover(c, &cfg, raw, connect, persistent, flags); - if (!persistent) + if (!(persistent || is_persistent_discovery_ctrl(h, c))) ret = nvme_disconnect_ctrl(c); nvme_free_ctrl(c); @@ -657,9 +753,9 @@ static int discover_from_json_config_file(nvme_root_t r, nvme_host_t h, }; if (!force) { - cn = lookup_discover_ctrl(r, &trcfg); + cn = lookup_discovery_ctrl(r, &trcfg); if (cn) { - __discover(c, &cfg, raw, connect, + __discover(cn, &cfg, raw, connect, true, flags); continue; } @@ -670,7 +766,7 @@ static int discover_from_json_config_file(nvme_root_t r, nvme_host_t h, continue; __discover(cn, &cfg, raw, connect, persistent, flags); - if (!persistent) + if (!(persistent || is_persistent_discovery_ctrl(h, cn))) ret = nvme_disconnect_ctrl(cn); nvme_free_ctrl(cn); } @@ -825,7 +921,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) } } if (!c && !force) { - c = lookup_discover_ctrl(r, &trcfg); + c = lookup_discovery_ctrl(r, &trcfg); if (c) persistent = true; } @@ -841,9 +937,8 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) } } - ret = __discover(c, &cfg, raw, connect, - persistent, flags); - if (!persistent) + ret = __discover(c, &cfg, raw, connect, persistent, flags); + if (!(persistent || is_persistent_discovery_ctrl(h, c))) nvme_disconnect_ctrl(c); nvme_free_ctrl(c); @@ -953,6 +1048,23 @@ int nvmf_connect(const char *desc, int argc, char **argv) nvme_host_set_dhchap_key(h, hostkey); if (!trsvcid) trsvcid = get_default_trsvcid(transport, false); + + struct tr_config trcfg = { + .subsysnqn = subsysnqn, + .transport = transport, + .traddr = traddr, + .host_traddr = cfg.host_traddr, + .host_iface = cfg.host_iface, + .trsvcid = trsvcid, + }; + + c = lookup_ctrl(r, &trcfg); + if (c && nvme_ctrl_get_name(c)) { + fprintf(stderr, "already connected\n"); + errno = EALREADY; + goto out_free; + } + c = nvme_create_ctrl(r, subsysnqn, transport, traddr, cfg.host_traddr, cfg.host_iface, trsvcid); if (!c) { @@ -965,7 +1077,7 @@ int nvmf_connect(const char *desc, int argc, char **argv) errno = 0; ret = nvmf_add_ctrl(h, c, &cfg); if (ret) - fprintf(stderr, "no controller found: %s\n", + fprintf(stderr, "could not add new controller: %s\n", nvme_strerror(errno)); else { errno = 0; diff --git a/meson.build b/meson.build index cd85a98..c05dc47 100644 --- a/meson.build +++ b/meson.build @@ -2,13 +2,13 @@ ################################################################################ project( 'nvme-cli', ['c'], - meson_version: '>= 0.48.0', + meson_version: '>= 0.50.0', license: 'GPL-2.0-only', - version: '2.2.1', + version: '2.3', default_options: [ 'c_std=gnu99', - 'buildtype=release', - 'prefix=/usr', + 'buildtype=debug', + 'prefix=/usr/local', 'warning_level=1', ] ) @@ -44,7 +44,7 @@ endif conf.set('SYSCONFDIR', '"@0@"'.format(sysconfdir)) # Check for libnvme availability -libnvme_dep = dependency('libnvme', version: '>=1.2', required: true, +libnvme_dep = dependency('libnvme', version: '>=1.3', required: true, fallback : ['libnvme', 'libnvme_dep']) libnvme_mi_dep = dependency('libnvme-mi', required: true, fallback : ['libnvme', 'libnvme_mi_dep']) @@ -77,6 +77,8 @@ conf.set('CONFIG_LIBHUGETLBFS', have_libhugetlbfs, description: 'Is libhugetlbfs # Set the nvme-cli version conf.set('NVME_VERSION', '"' + meson.project_version() + '"') +conf.set10('DEFAULT_PDC_ENABLED', get_option('pdc-enabled')) + # local (cross-compilable) implementations of ccan configure steps conf.set10( 'HAVE_BUILTIN_TYPES_COMPATIBLE_P', @@ -249,7 +251,10 @@ sources = [ subdir('ccan') subdir('plugins') -subdir('tests') +subdir('unit') +if get_option('nvme-tests') + subdir('tests') +endif subdir('util') subdir('Documentation') diff --git a/meson_options.txt b/meson_options.txt index fd90511..04843ea 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -5,6 +5,7 @@ option('dracutrulesdir', type : 'string', value : 'lib/dracut/dracut.conf.d/', d option('systemddir', type : 'string', value : 'lib/systemd/system', description : 'directory for systemd files') option('htmldir', type : 'string', value : '', description : 'directory for HTML documentation') option('systemctl', type : 'string', value : '/usr/bin/systemctl', description : 'path to systemctl binary') - +option('nvme-tests', type : 'boolean', value : false, description: 'Run tests against real hardware') option('docs', type : 'combo', choices : ['false', 'html', 'man', 'all'], description : 'install documentation') -option('docs-build', type : 'boolean', value : false, description : 'build documentation') +option('docs-build', type : 'boolean', value : false, description : 'build documentation') +option('pdc-enabled', type: 'boolean', value : false, description : 'set default Persistent Discovery Controllers behavior') diff --git a/nvme-builtin.h b/nvme-builtin.h index c501b74..73528a6 100644 --- a/nvme-builtin.h +++ b/nvme-builtin.h @@ -107,6 +107,8 @@ COMMAND_LIST( ENTRY("lockdown", "Submit a Lockdown command,return result", lockdown_cmd) ENTRY("dim", "Send Discovery Information Management command to a Discovery Controller", dim_cmd) \ ENTRY("show-topology", "Show the topology", show_topology_cmd) \ + ENTRY("io-mgmt-recv", "I/O Management Receive", io_mgmt_recv) + ENTRY("io-mgmt-send", "I/O Management Send", io_mgmt_send) ); #endif diff --git a/nvme-print.c b/nvme-print.c index c27f087..cabce68 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -169,13 +169,13 @@ static void json_nvme_id_ns(struct nvme_id_ns *ns, bool cap_only) } json_object_add_value_int(root, "mssrl", le16_to_cpu(ns->mssrl)); - json_object_add_value_int(root, "mcl", le32_to_cpu(ns->mcl)); + json_object_add_value_uint(root, "mcl", le32_to_cpu(ns->mcl)); json_object_add_value_int(root, "msrc", ns->msrc); } json_object_add_value_int(root, "nulbaf", ns->nulbaf); if (!cap_only) { - json_object_add_value_int(root, "anagrpid", le32_to_cpu(ns->anagrpid)); + json_object_add_value_uint(root, "anagrpid", le32_to_cpu(ns->anagrpid)); json_object_add_value_int(root, "endgid", le16_to_cpu(ns->endgid)); memset(eui64, 0, sizeof(eui64_buf)); @@ -247,7 +247,7 @@ static void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl, json_object_add_value_uint(root, "rtd3r", le32_to_cpu(ctrl->rtd3r)); json_object_add_value_uint(root, "rtd3e", le32_to_cpu(ctrl->rtd3e)); json_object_add_value_uint(root, "oaes", le32_to_cpu(ctrl->oaes)); - json_object_add_value_int(root, "ctratt", le32_to_cpu(ctrl->ctratt)); + json_object_add_value_uint(root, "ctratt", le32_to_cpu(ctrl->ctratt)); json_object_add_value_int(root, "rrls", le16_to_cpu(ctrl->rrls)); json_object_add_value_int(root, "cntrltype", ctrl->cntrltype); json_object_add_value_string(root, "fguid", util_uuid_to_string(ctrl->fguid)); @@ -281,19 +281,19 @@ static void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl, json_object_add_value_int(root, "hctma", le16_to_cpu(ctrl->hctma)); json_object_add_value_int(root, "mntmt", le16_to_cpu(ctrl->mntmt)); json_object_add_value_int(root, "mxtmt", le16_to_cpu(ctrl->mxtmt)); - json_object_add_value_int(root, "sanicap", le32_to_cpu(ctrl->sanicap)); - json_object_add_value_int(root, "hmminds", le32_to_cpu(ctrl->hmminds)); + json_object_add_value_uint(root, "sanicap", le32_to_cpu(ctrl->sanicap)); + json_object_add_value_uint(root, "hmminds", le32_to_cpu(ctrl->hmminds)); json_object_add_value_int(root, "hmmaxd", le16_to_cpu(ctrl->hmmaxd)); json_object_add_value_int(root, "nsetidmax", le16_to_cpu(ctrl->nsetidmax)); json_object_add_value_int(root, "endgidmax", le16_to_cpu(ctrl->endgidmax)); json_object_add_value_int(root, "anatt",ctrl->anatt); json_object_add_value_int(root, "anacap", ctrl->anacap); - json_object_add_value_int(root, "anagrpmax", + json_object_add_value_uint(root, "anagrpmax", le32_to_cpu(ctrl->anagrpmax)); - json_object_add_value_int(root, "nanagrpid", + json_object_add_value_uint(root, "nanagrpid", le32_to_cpu(ctrl->nanagrpid)); - json_object_add_value_int(root, "pels", le32_to_cpu(ctrl->pels)); + json_object_add_value_uint(root, "pels", le32_to_cpu(ctrl->pels)); json_object_add_value_int(root, "domainid", le16_to_cpu(ctrl->domainid)); json_object_add_value_uint128(root, "megcap", megcap); json_object_add_value_int(root, "sqes", ctrl->sqes); @@ -310,16 +310,16 @@ static void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl, json_object_add_value_int(root, "nwpc", ctrl->nwpc); json_object_add_value_int(root, "acwu", le16_to_cpu(ctrl->acwu)); json_object_add_value_int(root, "ocfs", le16_to_cpu(ctrl->ocfs)); - json_object_add_value_int(root, "sgls", le32_to_cpu(ctrl->sgls)); - json_object_add_value_int(root, "mnan", le32_to_cpu(ctrl->mnan)); + json_object_add_value_uint(root, "sgls", le32_to_cpu(ctrl->sgls)); + json_object_add_value_uint(root, "mnan", le32_to_cpu(ctrl->mnan)); json_object_add_value_uint128(root, "maxdna", maxdna); - json_object_add_value_int(root, "maxcna", le32_to_cpu(ctrl->maxcna)); + json_object_add_value_uint(root, "maxcna", le32_to_cpu(ctrl->maxcna)); if (strlen(subnqn)) json_object_add_value_string(root, "subnqn", subnqn); - json_object_add_value_int(root, "ioccsz", le32_to_cpu(ctrl->ioccsz)); - json_object_add_value_int(root, "iorcsz", le32_to_cpu(ctrl->iorcsz)); + json_object_add_value_uint(root, "ioccsz", le32_to_cpu(ctrl->ioccsz)); + json_object_add_value_uint(root, "iorcsz", le32_to_cpu(ctrl->iorcsz)); json_object_add_value_int(root, "icdoff", le16_to_cpu(ctrl->icdoff)); json_object_add_value_int(root, "fcatt", ctrl->fcatt); json_object_add_value_int(root, "msdbd", ctrl->msdbd); @@ -422,7 +422,7 @@ static void json_nvme_resv_report(struct nvme_resv_status *status, root = json_create_object(); - json_object_add_value_int(root, "gen", le32_to_cpu(status->gen)); + json_object_add_value_uint(root, "gen", le32_to_cpu(status->gen)); json_object_add_value_int(root, "rtype", status->rtype); json_object_add_value_int(root, "regctl", regctl); json_object_add_value_int(root, "ptpls", status->ptpls); @@ -782,7 +782,7 @@ static void json_self_test_log(struct nvme_self_test_log *self_test, __u8 dst_en json_object_add_value_uint64(valid_attrs, "Power on hours", le64_to_cpu(self_test->result[i].poh)); if (self_test->result[i].vdi & NVME_ST_VALID_DIAG_INFO_NSID) - json_object_add_value_int(valid_attrs, "Namespace Identifier", + json_object_add_value_uint(valid_attrs, "Namespace Identifier", le32_to_cpu(self_test->result[i].nsid)); if (self_test->result[i].vdi & NVME_ST_VALID_DIAG_INFO_FLBA) { json_object_add_value_uint64(valid_attrs, "Failing LBA", @@ -2292,6 +2292,358 @@ static void json_supported_cap_config_log( json_free_object(root); } +static void json_nvme_fdp_configs(struct nvme_fdp_config_log *log, size_t len) +{ + struct json_object *root, *obj_configs; + uint16_t n; + + void *p = log->configs; + + root = json_create_object(); + obj_configs = json_create_array(); + + n = le16_to_cpu(log->n); + + json_object_add_value_uint(root, "n", n); + + for (int i = 0; i < n + 1; i++) { + struct nvme_fdp_config_desc *config = p; + + struct json_object *obj_config = json_create_object(); + struct json_object *obj_ruhs = json_create_array(); + + json_object_add_value_uint(obj_config, "fdpa", config->fdpa); + json_object_add_value_uint(obj_config, "vss", config->vss); + json_object_add_value_uint(obj_config, "nrg", le32_to_cpu(config->nrg)); + json_object_add_value_uint(obj_config, "nruh", le16_to_cpu(config->nruh)); + json_object_add_value_uint(obj_config, "nnss", le32_to_cpu(config->nnss)); + json_object_add_value_uint64(obj_config, "runs", le64_to_cpu(config->runs)); + json_object_add_value_uint(obj_config, "erutl", le32_to_cpu(config->erutl)); + + for (int j = 0; j < le16_to_cpu(config->nruh); j++) { + struct nvme_fdp_ruh_desc *ruh = &config->ruhs[j]; + + struct json_object *obj_ruh = json_create_object(); + + json_object_add_value_uint(obj_ruh, "ruht", ruh->ruht); + + json_array_add_value_object(obj_ruhs, obj_ruh); + } + + json_array_add_value_object(obj_configs, obj_config); + + p += config->size; + } + + json_object_add_value_array(root, "configs", obj_configs); + + json_print_object(root, NULL); + printf("\n"); + + json_free_object(root); +} + +void nvme_show_fdp_config_fdpa(uint8_t fdpa) +{ + __u8 valid = (fdpa >> 7) & 0x1; + __u8 rsvd = (fdpa >> 5) >> 0x3; + __u8 fdpvwc = (fdpa >> 4) & 0x1; + __u8 rgif = fdpa & 0xf; + + printf(" [7:7] : %#x\tFDP Configuration %sValid\n", + valid, valid ? "" : "Not "); + if (rsvd) + printf(" [6:5] : %#x\tReserved\n", rsvd); + printf(" [4:4] : %#x\tFDP Volatile Write Cache %sPresent\n", + fdpvwc, fdpvwc ? "" : "Not "); + printf(" [3:0] : %#x\tReclaim Group Identifier Format\n", rgif); +} + +void nvme_show_fdp_configs(struct nvme_fdp_config_log *log, size_t len, + enum nvme_print_flags flags) +{ + void *p = log->configs; + int human = flags & VERBOSE; + uint16_t n; + + if (flags & BINARY) + return d_raw((unsigned char *)log, len); + if (flags & JSON) + return json_nvme_fdp_configs(log, len); + + n = le16_to_cpu(log->n) + 1; + + for (int i = 0; i < n; i++) { + struct nvme_fdp_config_desc *config = p; + + printf("FDP Attributes: %#x\n", config->fdpa); + if (human) + nvme_show_fdp_config_fdpa(config->fdpa); + + printf("Vendor Specific Size: %u\n", config->vss); + printf("Number of Reclaim Groups: %"PRIu32"\n", le32_to_cpu(config->nrg)); + printf("Number of Reclaim Unit Handles: %"PRIu16"\n", le16_to_cpu(config->nruh)); + printf("Number of Namespaces Supported: %"PRIu32"\n", le32_to_cpu(config->nnss)); + printf("Reclaim Unit Nominal Size: %"PRIu64"\n", le64_to_cpu(config->runs)); + printf("Estimated Reclaim Unit Time Limit: %"PRIu32"\n", le32_to_cpu(config->erutl)); + + printf("Reclaim Unit Handle List:\n"); + for (int j = 0; j < le16_to_cpu(config->nruh); j++) { + struct nvme_fdp_ruh_desc *ruh = &config->ruhs[j]; + + printf(" [%d]: %s\n", j, ruh->ruht == NVME_FDP_RUHT_INITIALLY_ISOLATED ? "Initially Isolated" : "Persistently Isolated"); + } + + p += config->size; + } +} + +static void json_nvme_fdp_usage(struct nvme_fdp_ruhu_log *log, size_t len) +{ + struct json_object *root, *obj_ruhus; + uint16_t nruh; + + root = json_create_object(); + obj_ruhus = json_create_array(); + + nruh = le16_to_cpu(log->nruh); + + json_object_add_value_uint(root, "nruh", nruh); + + for (int i = 0; i < nruh; i++) { + struct nvme_fdp_ruhu_desc *ruhu = &log->ruhus[i]; + + struct json_object *obj_ruhu = json_create_object(); + + json_object_add_value_uint(obj_ruhu, "ruha", ruhu->ruha); + + json_array_add_value_object(obj_ruhus, obj_ruhu); + } + + json_object_add_value_array(root, "ruhus", obj_ruhus); + + json_print_object(root, NULL); + printf("\n"); + + json_free_object(root); +} + +void nvme_show_fdp_usage(struct nvme_fdp_ruhu_log *log, size_t len, + enum nvme_print_flags flags) +{ + if (flags & BINARY) + return d_raw((unsigned char *)log, len); + if (flags & JSON) + return json_nvme_fdp_usage(log, len); + + uint16_t nruh = le16_to_cpu(log->nruh); + + for (int i = 0; i < nruh; i++) { + struct nvme_fdp_ruhu_desc *ruhu = &log->ruhus[i]; + + printf("Reclaim Unit Handle %d Attributes: 0x%"PRIx8" (%s)\n", i, ruhu->ruha, + ruhu->ruha == 0x0 ? "Unused" : ( + ruhu->ruha == 0x1 ? "Host Specified" : ( + ruhu->ruha == 0x2 ? "Controller Specified" : "Unknown"))); + } +} + +static void json_nvme_fdp_stats(struct nvme_fdp_stats_log *log) +{ + struct json_object *root = json_create_object(); + + json_object_add_value_uint128(root, "hbmw", le128_to_cpu(log->hbmw)); + json_object_add_value_uint128(root, "mbmw", le128_to_cpu(log->mbmw)); + json_object_add_value_uint128(root, "mbe", le128_to_cpu(log->mbe)); + + json_print_object(root, NULL); + printf("\n"); + + json_free_object(root); +} + +void nvme_show_fdp_stats(struct nvme_fdp_stats_log *log, + enum nvme_print_flags flags) +{ + if (flags & BINARY) + return d_raw((unsigned char*)log, sizeof(*log)); + if (flags & JSON) + return json_nvme_fdp_stats(log); + + printf("Host Bytes with Metadata Written (HBMW): %s\n", + uint128_t_to_string(le128_to_cpu(log->hbmw))); + printf("Media Bytes with Metadata Written (MBMW): %s\n", + uint128_t_to_string(le128_to_cpu(log->mbmw))); + printf("Media Bytes Erased (MBE): %s\n", + uint128_t_to_string(le128_to_cpu(log->mbe))); +} + +static void json_nvme_fdp_events(struct nvme_fdp_events_log *log) +{ + struct json_object *root, *obj_events; + uint32_t n; + + root = json_create_object(); + obj_events = json_create_array(); + + n = le32_to_cpu(log->n); + + json_object_add_value_uint(root, "n", n); + + for (unsigned int i = 0; i < n; i++) { + struct nvme_fdp_event *event = &log->events[i]; + + struct json_object *obj_event = json_create_object(); + + json_object_add_value_uint(obj_event, "type", event->type); + json_object_add_value_uint(obj_event, "fdpef", event->flags); + json_object_add_value_uint(obj_event, "pid", le16_to_cpu(event->pid)); + json_object_add_value_uint64(obj_event, "timestamp", le64_to_cpu(*(uint64_t *)&event->ts)); + json_object_add_value_uint(obj_event, "nsid", le32_to_cpu(event->nsid)); + + if (event->type == NVME_FDP_EVENT_REALLOC) { + struct nvme_fdp_event_realloc *mr; + mr = (struct nvme_fdp_event_realloc *)&event->type_specific; + + json_object_add_value_uint(obj_event, "nlbam", le16_to_cpu(mr->nlbam)); + + if (mr->flags & NVME_FDP_EVENT_REALLOC_F_LBAV) + json_object_add_value_uint64(obj_event, "lba", le64_to_cpu(mr->lba)); + } + + json_array_add_value_object(obj_events, obj_event); + } + + json_object_add_value_array(root, "events", obj_events); + + json_print_object(root, NULL); + printf("\n"); + + json_free_object(root); +} + +static const char *nvme_fdp_event_to_string(enum nvme_fdp_event_type event) +{ + switch (event) { + case NVME_FDP_EVENT_RUNFW: return "Reclaim Unit Not Fully Written"; + case NVME_FDP_EVENT_RUTLE: return "Reclaim Unit Active Time Limit Exceeded"; + case NVME_FDP_EVENT_RESET: return "Controller Level Reset Modified Reclaim Unit Handles"; + case NVME_FDP_EVENT_PID: return "Invalid Placement Identifier"; + case NVME_FDP_EVENT_REALLOC: return "Media Reallocated"; + case NVME_FDP_EVENT_MODIFY: return "Implicitly Modified Reclaim Unit Handle"; + } + + return "Unknown"; +} + +void nvme_show_fdp_events(struct nvme_fdp_events_log *log, + enum nvme_print_flags flags) +{ + struct tm *tm; + char buffer[320]; + time_t ts; + + if (flags & BINARY) + return d_raw((unsigned char*)log, sizeof(*log)); + if (flags & JSON) + return json_nvme_fdp_events(log); + + uint32_t n = le32_to_cpu(log->n); + + for (unsigned int i = 0; i < n; i++) { + struct nvme_fdp_event *event = &log->events[i]; + + ts = int48_to_long(event->ts.timestamp) / 1000; + tm = localtime(&ts); + + printf("Event[%u]\n", i); + printf(" Event Type: 0x%"PRIx8" (%s)\n", event->type, nvme_fdp_event_to_string(event->type)); + printf(" Event Timestamp: %"PRIu64" (%s)\n", int48_to_long(event->ts.timestamp), + strftime(buffer, sizeof(buffer), "%c %Z", tm) ? buffer : "-"); + + if (event->flags & NVME_FDP_EVENT_F_PIV) + printf(" Placement Identifier (PID): 0x%"PRIx16"\n", le16_to_cpu(event->pid)); + + if (event->flags & NVME_FDP_EVENT_F_NSIDV) + printf(" Namespace Identifier (NSID): %"PRIu32"\n", le32_to_cpu(event->nsid)); + + if (event->type == NVME_FDP_EVENT_REALLOC) { + struct nvme_fdp_event_realloc *mr; + mr = (struct nvme_fdp_event_realloc *)&event->type_specific; + + printf(" Number of LBAs Moved (NLBAM): %"PRIu16"\n", le16_to_cpu(mr->nlbam)); + + if (mr->flags & NVME_FDP_EVENT_REALLOC_F_LBAV) { + printf(" Logical Block Address (LBA): 0x%"PRIx64"\n", le64_to_cpu(mr->lba)); + } + } + + if (event->flags & NVME_FDP_EVENT_F_LV) { + printf(" Reclaim Group Identifier: %"PRIu16"\n", le16_to_cpu(event->rgid)); + printf(" Reclaim Unit Handle Identifier %"PRIu8"\n", event->ruhid); + } + + printf("\n"); + } +} + +static void json_nvme_fdp_ruh_status(struct nvme_fdp_ruh_status *status, size_t len) +{ + struct json_object *root, *obj_ruhss; + uint16_t nruhsd; + + root = json_create_object(); + obj_ruhss = json_create_array(); + + nruhsd = le16_to_cpu(status->nruhsd); + + json_object_add_value_uint(root, "nruhsd", nruhsd); + + for (unsigned int i = 0; i < nruhsd; i++) { + struct nvme_fdp_ruh_status_desc *ruhs = &status->ruhss[i]; + + struct json_object *obj_ruhs = json_create_object(); + + json_object_add_value_uint(obj_ruhs, "pid", le16_to_cpu(ruhs->pid)); + json_object_add_value_uint(obj_ruhs, "ruhid", le16_to_cpu(ruhs->ruhid)); + json_object_add_value_uint(obj_ruhs, "earutr", le32_to_cpu(ruhs->earutr)); + json_object_add_value_uint64(obj_ruhs, "ruamw", le64_to_cpu(ruhs->ruamw)); + + json_array_add_value_object(obj_ruhss, obj_ruhs); + } + + json_object_add_value_array(root, "ruhss", obj_ruhss); + + json_print_object(root, NULL); + printf("\n"); + + json_free_object(root); +} + +void nvme_show_fdp_ruh_status(struct nvme_fdp_ruh_status *status, size_t len, + enum nvme_print_flags flags) +{ + if (flags & BINARY) + return d_raw((unsigned char *)status, len); + if (flags & JSON) + return json_nvme_fdp_ruh_status(status, len); + + uint16_t nruhsd = le16_to_cpu(status->nruhsd); + + for (unsigned int i = 0; i < nruhsd; i++) { + struct nvme_fdp_ruh_status_desc *ruhs = &status->ruhss[i]; + + printf("Placement Identifier %"PRIu16"; Reclaim Unit Handle Identifier %"PRIu16"\n", + le16_to_cpu(ruhs->pid), le16_to_cpu(ruhs->ruhid)); + printf(" Estimated Active Reclaim Unit Time Remaining (EARUTR): %"PRIu32"\n", + le32_to_cpu(ruhs->earutr)); + printf(" Reclaim Unit Available Media Writes (RUAMW): %"PRIu64"\n", + le64_to_cpu(ruhs->ruamw)); + + printf("\n"); + } +} + void nvme_show_supported_cap_config_log( struct nvme_supported_cap_config_list_log *cap, enum nvme_print_flags flags) @@ -3352,7 +3704,9 @@ static void nvme_show_id_ctrl_oaes(__le32 ctrl_oaes) static void nvme_show_id_ctrl_ctratt(__le32 ctrl_ctratt) { __u32 ctratt = le32_to_cpu(ctrl_ctratt); - __u32 rsvd = ctratt >> 16; + __u32 rsvd20 = (ctratt >> 20); + __u32 fdps = (ctratt >> 19) & 0x1; + __u32 rsvd16 = (ctratt >> 16) & 0x7; __u32 elbas = (ctratt >> 15) & 0x1; __u32 delnvmset = (ctratt >> 14) & 0x1; __u32 delegrp = (ctratt >> 13) & 0x1; @@ -3370,8 +3724,12 @@ static void nvme_show_id_ctrl_ctratt(__le32 ctrl_ctratt) __u32 sqa = (ctratt & NVME_CTRL_CTRATT_SQ_ASSOCIATIONS) >> 8; __u32 uuidlist = (ctratt & NVME_CTRL_CTRATT_UUID_LIST) >> 9; - if (rsvd) - printf(" [31:16] : %#x\tReserved\n", rsvd); + if (rsvd20) + printf(" [31:20] : %#x\tReserved\n", rsvd20); + printf(" [19:19] : %#x\tFlexible Data Placement %sSupported\n", + fdps, fdps ? "" : "Not "); + if (rsvd16) + printf(" [18:16] : %#x\tReserved\n", rsvd16); printf(" [15:15] : %#x\tExtended LBA Formats %sSupported\n", elbas, elbas ? "" : "Not "); printf(" [14:14] : %#x\tDelete NVM Set %sSupported\n", @@ -4209,7 +4567,7 @@ void nvme_show_id_ns(struct nvme_id_ns *ns, unsigned int nsid, printf("nows : %u\n", le16_to_cpu(ns->nows)); } printf("mssrl : %u\n", le16_to_cpu(ns->mssrl)); - printf("mcl : %d\n", le32_to_cpu(ns->mcl)); + printf("mcl : %u\n", le32_to_cpu(ns->mcl)); printf("msrc : %u\n", ns->msrc); } printf("nulbaf : %u\n", ns->nulbaf); @@ -4291,7 +4649,7 @@ static void json_nvme_cmd_set_independent_id_ns( json_object_add_value_int(root, "nmic", ns->nmic); json_object_add_value_int(root, "rescap", ns->rescap); json_object_add_value_int(root, "fpi", ns->fpi); - json_object_add_value_int(root, "anagrpid", le32_to_cpu(ns->anagrpid)); + json_object_add_value_uint(root, "anagrpid", le32_to_cpu(ns->anagrpid)); json_object_add_value_int(root, "nsattr", ns->nsattr); json_object_add_value_int(root, "nvmsetid", le16_to_cpu(ns->nvmsetid)); json_object_add_value_int(root, "endgid", le16_to_cpu(ns->endgid)); @@ -4687,7 +5045,7 @@ void nvme_show_id_ctrl(struct nvme_id_ctrl *ctrl, enum nvme_print_flags flags, printf("sanicap : %#x\n", le32_to_cpu(ctrl->sanicap)); if (human) nvme_show_id_ctrl_sanicap(ctrl->sanicap); - printf("hmminds : %d\n", le32_to_cpu(ctrl->hmminds)); + printf("hmminds : %u\n", le32_to_cpu(ctrl->hmminds)); printf("hmmaxd : %d\n", le16_to_cpu(ctrl->hmmaxd)); printf("nsetidmax : %d\n", le16_to_cpu(ctrl->nsetidmax)); printf("endgidmax : %d\n", le16_to_cpu(ctrl->endgidmax)); @@ -4695,9 +5053,9 @@ void nvme_show_id_ctrl(struct nvme_id_ctrl *ctrl, enum nvme_print_flags flags, printf("anacap : %d\n", ctrl->anacap); if (human) nvme_show_id_ctrl_anacap(ctrl->anacap); - printf("anagrpmax : %d\n", ctrl->anagrpmax); - printf("nanagrpid : %d\n", le32_to_cpu(ctrl->nanagrpid)); - printf("pels : %d\n", le32_to_cpu(ctrl->pels)); + printf("anagrpmax : %u\n", ctrl->anagrpmax); + printf("nanagrpid : %u\n", le32_to_cpu(ctrl->nanagrpid)); + printf("pels : %u\n", le32_to_cpu(ctrl->pels)); printf("domainid : %d\n", le16_to_cpu(ctrl->domainid)); printf("megcap : %s\n", uint128_t_to_string(le128_to_cpu(ctrl->megcap))); @@ -4736,13 +5094,13 @@ void nvme_show_id_ctrl(struct nvme_id_ctrl *ctrl, enum nvme_print_flags flags, printf("sgls : %#x\n", le32_to_cpu(ctrl->sgls)); if (human) nvme_show_id_ctrl_sgls(ctrl->sgls); - printf("mnan : %d\n", le32_to_cpu(ctrl->mnan)); + printf("mnan : %u\n", le32_to_cpu(ctrl->mnan)); printf("maxdna : %s\n", uint128_t_to_string(le128_to_cpu(ctrl->maxdna))); - printf("maxcna : %d\n", le32_to_cpu(ctrl->maxcna)); + printf("maxcna : %u\n", le32_to_cpu(ctrl->maxcna)); printf("subnqn : %-.*s\n", (int)sizeof(ctrl->subnqn), ctrl->subnqn); - printf("ioccsz : %d\n", le32_to_cpu(ctrl->ioccsz)); - printf("iorcsz : %d\n", le32_to_cpu(ctrl->iorcsz)); + printf("ioccsz : %u\n", le32_to_cpu(ctrl->ioccsz)); + printf("iorcsz : %u\n", le32_to_cpu(ctrl->iorcsz)); printf("icdoff : %d\n", le16_to_cpu(ctrl->icdoff)); printf("fcatt : %#x\n", ctrl->fcatt); if (human) @@ -4816,8 +5174,8 @@ static void json_nvme_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns, struct json_object *elbaf = json_create_object(); unsigned int elbaf_val = le32_to_cpu(nvm_ns->elbaf[i]); - json_object_add_value_int(elbaf, "sts", elbaf_val & 0x7F); - json_object_add_value_int(elbaf, "pif", (elbaf_val >> 7) & 0x3); + json_object_add_value_uint(elbaf, "sts", elbaf_val & 0x7F); + json_object_add_value_uint(elbaf, "pif", (elbaf_val >> 7) & 0x3); json_array_add_value_object(elbafs, elbaf); } @@ -4919,17 +5277,17 @@ static void json_nvme_zns_id_ns(struct nvme_zns_id_ns *ns, root = json_create_object(); json_object_add_value_int(root, "zoc", le16_to_cpu(ns->zoc)); json_object_add_value_int(root, "ozcs", le16_to_cpu(ns->ozcs)); - json_object_add_value_int(root, "mar", le32_to_cpu(ns->mar)); - json_object_add_value_int(root, "mor", le32_to_cpu(ns->mor)); - json_object_add_value_int(root, "rrl", le32_to_cpu(ns->rrl)); - json_object_add_value_int(root, "frl", le32_to_cpu(ns->frl)); - json_object_add_value_int(root, "rrl1", le32_to_cpu(ns->rrl1)); - json_object_add_value_int(root, "rrl2", le32_to_cpu(ns->rrl2)); - json_object_add_value_int(root, "rrl3", le32_to_cpu(ns->rrl3)); - json_object_add_value_int(root, "frl1", le32_to_cpu(ns->frl1)); - json_object_add_value_int(root, "frl2", le32_to_cpu(ns->frl2)); - json_object_add_value_int(root, "frl3", le32_to_cpu(ns->frl3)); - json_object_add_value_int(root, "numzrwa", le32_to_cpu(ns->numzrwa)); + json_object_add_value_uint(root, "mar", le32_to_cpu(ns->mar)); + json_object_add_value_uint(root, "mor", le32_to_cpu(ns->mor)); + json_object_add_value_uint(root, "rrl", le32_to_cpu(ns->rrl)); + json_object_add_value_uint(root, "frl", le32_to_cpu(ns->frl)); + json_object_add_value_uint(root, "rrl1", le32_to_cpu(ns->rrl1)); + json_object_add_value_uint(root, "rrl2", le32_to_cpu(ns->rrl2)); + json_object_add_value_uint(root, "rrl3", le32_to_cpu(ns->rrl3)); + json_object_add_value_uint(root, "frl1", le32_to_cpu(ns->frl1)); + json_object_add_value_uint(root, "frl2", le32_to_cpu(ns->frl2)); + json_object_add_value_uint(root, "frl3", le32_to_cpu(ns->frl3)); + json_object_add_value_uint(root, "numzrwa", le32_to_cpu(ns->numzrwa)); json_object_add_value_int(root, "zrwafg", le16_to_cpu(ns->zrwafg)); json_object_add_value_int(root, "zrwasz", le16_to_cpu(ns->zrwasz)); json_object_add_value_int(root, "zrwacap", ns->zrwacap); @@ -5358,9 +5716,9 @@ static void json_nvme_id_nvmset(struct nvme_id_nvmset_list *nvmset) le16_to_cpu(nvmset->ent[i].nvmsetid)); json_object_add_value_int(entry, "endurance_group_id", le16_to_cpu(nvmset->ent[i].endgid)); - json_object_add_value_int(entry, "random_4k_read_typical", + json_object_add_value_uint(entry, "random_4k_read_typical", le32_to_cpu(nvmset->ent[i].rr4kt)); - json_object_add_value_int(entry, "optimal_write_size", + json_object_add_value_uint(entry, "optimal_write_size", le32_to_cpu(nvmset->ent[i].ows)); json_object_add_value_uint128(entry, "total_nvmset_cap", le128_to_cpu(nvmset->ent[i].tnvmsetcap)); @@ -5419,15 +5777,15 @@ static void json_nvme_primary_ctrl_cap(const struct nvme_primary_ctrl_cap *caps) json_object_add_value_uint(root, "portid", le16_to_cpu(caps->portid)); json_object_add_value_uint(root, "crt", caps->crt); - json_object_add_value_int(root, "vqfrt", le32_to_cpu(caps->vqfrt)); - json_object_add_value_int(root, "vqrfa", le32_to_cpu(caps->vqrfa)); + json_object_add_value_uint(root, "vqfrt", le32_to_cpu(caps->vqfrt)); + json_object_add_value_uint(root, "vqrfa", le32_to_cpu(caps->vqrfa)); json_object_add_value_int(root, "vqrfap", le16_to_cpu(caps->vqrfap)); json_object_add_value_int(root, "vqprt", le16_to_cpu(caps->vqprt)); json_object_add_value_int(root, "vqfrsm", le16_to_cpu(caps->vqfrsm)); json_object_add_value_int(root, "vqgran", le16_to_cpu(caps->vqgran)); - json_object_add_value_int(root, "vifrt", le32_to_cpu(caps->vifrt)); - json_object_add_value_int(root, "virfa", le32_to_cpu(caps->virfa)); + json_object_add_value_uint(root, "vifrt", le32_to_cpu(caps->vifrt)); + json_object_add_value_uint(root, "virfa", le32_to_cpu(caps->virfa)); json_object_add_value_int(root, "virfap", le16_to_cpu(caps->virfap)); json_object_add_value_int(root, "viprt", le16_to_cpu(caps->viprt)); json_object_add_value_int(root, "vifrsm", le16_to_cpu(caps->vifrsm)); @@ -5466,14 +5824,14 @@ void nvme_show_primary_ctrl_cap(const struct nvme_primary_ctrl_cap *caps, printf("crt : %#x\n", caps->crt); if (human) nvme_show_primary_ctrl_caps_crt(caps->crt); - printf("vqfrt : %d\n", le32_to_cpu(caps->vqfrt)); - printf("vqrfa : %d\n", le32_to_cpu(caps->vqrfa)); + printf("vqfrt : %u\n", le32_to_cpu(caps->vqfrt)); + printf("vqrfa : %u\n", le32_to_cpu(caps->vqrfa)); printf("vqrfap : %d\n", le16_to_cpu(caps->vqrfap)); printf("vqprt : %d\n", le16_to_cpu(caps->vqprt)); printf("vqfrsm : %d\n", le16_to_cpu(caps->vqfrsm)); printf("vqgran : %d\n", le16_to_cpu(caps->vqgran)); - printf("vifrt : %d\n", le32_to_cpu(caps->vifrt)); - printf("virfa : %d\n", le32_to_cpu(caps->virfa)); + printf("vifrt : %u\n", le32_to_cpu(caps->vifrt)); + printf("virfa : %u\n", le32_to_cpu(caps->virfa)); printf("virfap : %d\n", le16_to_cpu(caps->virfap)); printf("viprt : %d\n", le16_to_cpu(caps->viprt)); printf("vifrsm : %d\n", le16_to_cpu(caps->vifrsm)); @@ -5871,7 +6229,7 @@ void nvme_show_resv_report(struct nvme_resv_status *status, int bytes, regctl = status->regctl[0] | (status->regctl[1] << 8); printf("\nNVME Reservation status:\n\n"); - printf("gen : %d\n", le32_to_cpu(status->gen)); + printf("gen : %u\n", le32_to_cpu(status->gen)); printf("rtype : %d\n", status->rtype); printf("regctl : %d\n", regctl); printf("ptpls : %d\n", status->ptpls); @@ -5913,7 +6271,7 @@ void nvme_show_resv_report(struct nvme_resv_status *status, int bytes, le64_to_cpu(status->regctl_eds[i].rkey)); printf(" hostid : "); for (j = 0; j < 16; j++) - printf("%x", + printf("%02x", status->regctl_eds[i].hostid[j]); printf("\n"); } @@ -6255,10 +6613,14 @@ void nvme_show_smart_log(struct nvme_smart_log *smart, unsigned int nsid, smart->percent_used); printf("endurance group critical warning summary: %#x\n", smart->endu_grp_crit_warn_sumry); - printf("data_units_read : %s\n", - uint128_t_to_string(le128_to_cpu(smart->data_units_read))); - printf("data_units_written : %s\n", - uint128_t_to_string(le128_to_cpu(smart->data_units_written))); + printf("Data Units Read : %s (%s)\n", + uint128_t_to_string(le128_to_cpu(smart->data_units_read)), + uint128_t_to_si_string(le128_to_cpu(smart->data_units_read), + 1000 * 512)); + printf("Data Units Written : %s (%s)\n", + uint128_t_to_string(le128_to_cpu(smart->data_units_written)), + uint128_t_to_si_string(le128_to_cpu(smart->data_units_written), + 1000 * 512)); printf("host_read_commands : %s\n", uint128_t_to_string(le128_to_cpu(smart->host_reads))); printf("host_write_commands : %s\n", @@ -6554,6 +6916,8 @@ const char *nvme_feature_to_string(enum nvme_features_id feature) case NVME_FEAT_FID_RESV_MASK: return "Reservation Notification Mask"; case NVME_FEAT_FID_RESV_PERSIST:return "Reservation Persistence"; case NVME_FEAT_FID_WRITE_PROTECT: return "Namespace Write Protect"; + case NVME_FEAT_FID_FDP: return "Flexible Direct Placement"; + case NVME_FEAT_FID_FDP_EVENTS: return "Flexible Direct Placement Events"; } /* * We don't use the "default:" statement to let the compiler warning if @@ -7119,6 +7483,21 @@ void nvme_feature_show_fields(enum nvme_features_id fid, unsigned int result, un case NVME_FEAT_FID_WRITE_PROTECT: printf("\tNamespace Write Protect: %s\n", nvme_show_ns_wp_cfg(result)); break; + case NVME_FEAT_FID_FDP: + printf("\tFlexible Direct Placement Enable (FDPE) : %s\n", + (result & 0x1) ? "Yes" : "No"); + printf("\tFlexible Direct Placement Configuration Index : %u\n", + (result >> 8) & 0xf); + break; + case NVME_FEAT_FID_FDP_EVENTS: + for (unsigned int i = 0; i < result; i++) { + struct nvme_fdp_supported_event_desc *d; + + d = &((struct nvme_fdp_supported_event_desc *)buf)[i]; + + printf("\t%-53s: %sEnabled\n", nvme_fdp_event_to_string(d->evt), + d->evta & 0x1 ? "" : "Not "); + } default: break; } @@ -7411,15 +7790,15 @@ static void json_detail_list(nvme_root_t r) nvme_ctrl_for_each_ns(c, n) { struct json_object *jns = json_create_object(); - long long lba = nvme_ns_get_lba_size(n); - double nsze = nvme_ns_get_lba_count(n) * lba; - double nuse = nvme_ns_get_lba_util(n) * lba; + int lba = nvme_ns_get_lba_size(n); + uint64_t nsze = nvme_ns_get_lba_count(n) * lba; + uint64_t nuse = nvme_ns_get_lba_util(n) * lba; json_object_add_value_string(jns, "NameSpace", nvme_ns_get_name(n)); json_object_add_value_int(jns, "NSID", nvme_ns_get_nsid(n)); - json_object_add_value_int(jns, "UsedBytes", nuse); - json_object_add_value_int(jns, "MaximumLBA", nvme_ns_get_lba_count(n)); - json_object_add_value_int(jns, "PhysicalSize", nsze); + json_object_add_value_uint64(jns, "UsedBytes", nuse); + json_object_add_value_uint64(jns, "MaximumLBA", nvme_ns_get_lba_count(n)); + json_object_add_value_uint64(jns, "PhysicalSize", nsze); json_object_add_value_int(jns, "SectorSize", lba); json_array_add_value_object(jnss, jns); @@ -7443,15 +7822,15 @@ static void json_detail_list(nvme_root_t r) nvme_subsystem_for_each_ns(s, n) { struct json_object *jns = json_create_object(); - long long lba = nvme_ns_get_lba_size(n); - double nsze = nvme_ns_get_lba_count(n) * lba; - double nuse = nvme_ns_get_lba_util(n) * lba; + int lba = nvme_ns_get_lba_size(n); + uint64_t nsze = nvme_ns_get_lba_count(n) * lba; + uint64_t nuse = nvme_ns_get_lba_util(n) * lba; json_object_add_value_string(jns, "NameSpace", nvme_ns_get_name(n)); json_object_add_value_int(jns, "NSID", nvme_ns_get_nsid(n)); - json_object_add_value_int(jns, "UsedBytes", nuse); - json_object_add_value_int(jns, "MaximumLBA", nvme_ns_get_lba_count(n)); - json_object_add_value_int(jns, "PhysicalSize", nsze); + json_object_add_value_uint64(jns, "UsedBytes", nuse); + json_object_add_value_uint64(jns, "MaximumLBA", nvme_ns_get_lba_count(n)); + json_object_add_value_uint64(jns, "PhysicalSize", nsze); json_object_add_value_int(jns, "SectorSize", lba); json_array_add_value_object(jnss, jns); @@ -7475,9 +7854,9 @@ static struct json_object *json_list_item(nvme_ns_t n) struct json_object *jdevice = json_create_object(); char devname[128] = { 0 }; - long long lba = nvme_ns_get_lba_size(n); - double nsze = nvme_ns_get_lba_count(n) * lba; - double nuse = nvme_ns_get_lba_util(n) * lba; + int lba = nvme_ns_get_lba_size(n); + uint64_t nsze = nvme_ns_get_lba_count(n) * lba; + uint64_t nuse = nvme_ns_get_lba_util(n) * lba; nvme_dev_full_path(n, devname, sizeof(devname)); @@ -7486,9 +7865,9 @@ static struct json_object *json_list_item(nvme_ns_t n) json_object_add_value_string(jdevice, "Firmware", nvme_ns_get_firmware(n)); json_object_add_value_string(jdevice, "ModelNumber", nvme_ns_get_model(n)); json_object_add_value_string(jdevice, "SerialNumber", nvme_ns_get_serial(n)); - json_object_add_value_int(jdevice, "UsedBytes", nuse); - json_object_add_value_int(jdevice, "MaximumLBA", nvme_ns_get_lba_count(n)); - json_object_add_value_int(jdevice, "PhysicalSize", nsze); + json_object_add_value_uint64(jdevice, "UsedBytes", nuse); + json_object_add_value_uint64(jdevice, "MaximumLBA", nvme_ns_get_lba_count(n)); + json_object_add_value_uint64(jdevice, "PhysicalSize", nsze); json_object_add_value_int(jdevice, "SectorSize", lba); return jdevice; diff --git a/nvme-print.h b/nvme-print.h index f30f63e..35a9aa8 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -132,6 +132,17 @@ void json_nvme_finish_zone_list(__u64 nr_zones, struct json_object *zone_list); void nvme_show_list_item(nvme_ns_t n); +void nvme_show_fdp_configs(struct nvme_fdp_config_log *configs, size_t len, + enum nvme_print_flags flags); +void nvme_show_fdp_stats(struct nvme_fdp_stats_log *log, + enum nvme_print_flags flags); +void nvme_show_fdp_events(struct nvme_fdp_events_log *log, + enum nvme_print_flags flags); +void nvme_show_fdp_usage(struct nvme_fdp_ruhu_log *log, size_t len, + enum nvme_print_flags flags); +void nvme_show_fdp_ruh_status(struct nvme_fdp_ruh_status *status, size_t len, + enum nvme_print_flags flags); + const char *nvme_cmd_to_string(int admin, __u8 opcode); const char *nvme_select_to_string(int sel); const char *nvme_feature_to_string(enum nvme_features_id feature); diff --git a/nvme-wrap.c b/nvme-wrap.c index c31ec11..ae7cd92 100644 --- a/nvme-wrap.c +++ b/nvme-wrap.c @@ -77,6 +77,12 @@ int nvme_cli_identify_ns(struct nvme_dev *dev, __u32 nsid, return do_admin_op(identify_ns, dev, nsid, ns); } +int nvme_cli_identify_ns_descs(struct nvme_dev *dev, __u32 nsid, + struct nvme_ns_id_desc *descs) +{ + return do_admin_op(identify_ns_descs, dev, nsid, descs); +} + int nvme_cli_identify_allocated_ns(struct nvme_dev *dev, __u32 nsid, struct nvme_id_ns *ns) { @@ -95,6 +101,20 @@ int nvme_cli_identify_allocated_ns_list(struct nvme_dev *dev, __u32 nsid, return do_admin_op(identify_allocated_ns_list, dev, nsid, list); } +int nvme_cli_identify_primary_ctrl(struct nvme_dev *dev, __u32 nsid, + struct nvme_primary_ctrl_cap *cap) +{ + return do_admin_op(identify_primary_ctrl, dev, nsid, cap); +} + +int nvme_cli_identify_secondary_ctrl_list(struct nvme_dev *dev, __u32 nsid, + __u16 ctrl_id, + struct nvme_secondary_ctrl_list *sc_list) +{ + return do_admin_op(identify_secondary_ctrl_list, dev, nsid, ctrl_id, + sc_list); +} + int nvme_cli_get_features(struct nvme_dev *dev, struct nvme_get_features_args *args) { @@ -335,6 +355,19 @@ int nvme_cli_fw_commit(struct nvme_dev *dev, return do_admin_args_op(fw_commit, dev, args); } +int nvme_cli_admin_passthru(struct nvme_dev *dev, __u8 opcode, __u8 flags, + __u16 rsvd, __u32 nsid, __u32 cdw2, __u32 cdw3, + __u32 cdw10, __u32 cdw11, __u32 cdw12, __u32 cdw13, + __u32 cdw14, __u32 cdw15, __u32 data_len, + void *data, __u32 metadata_len, void *metadata, + __u32 timeout_ms, __u32 *result) +{ + return do_admin_op(admin_passthru, dev, opcode, flags, rsvd, nsid, + cdw2, cdw3, cdw10, cdw11, cdw12, cdw13, cdw14, cdw15, + data_len, data, metadata_len, metadata, timeout_ms, + result); +} + /* The MI & direct interfaces don't have an exactly-matching API for * ns_mgmt_create, as we don't support a timeout for MI. */ @@ -360,3 +393,26 @@ int nvme_cli_get_feature_length2(int fid, __u32 cdw11, enum nvme_data_tfr dir, return err; return nvme_get_feature_length(fid, cdw11, len); } + +int nvme_cli_security_send(struct nvme_dev *dev, + struct nvme_security_send_args* args) +{ + return do_admin_args_op(security_send, dev, args); +} + +int nvme_cli_security_receive(struct nvme_dev *dev, + struct nvme_security_receive_args* args) +{ + /* Cannot use do_admin_args_op here because the API have different suffix*/ + if (dev->type == NVME_DEV_DIRECT) { + args->fd = dev->direct.fd; + args->timeout = NVME_DEFAULT_IOCTL_TIMEOUT; + return nvme_security_receive(args); + } + + if (dev->type == NVME_DEV_MI) + return nvme_mi_admin_security_recv(dev->mi.ctrl, args); + + return -ENODEV; +} + diff --git a/nvme-wrap.h b/nvme-wrap.h index fe89391..4dcc665 100644 --- a/nvme-wrap.h +++ b/nvme-wrap.h @@ -18,13 +18,19 @@ int nvme_cli_identify_nsid_ctrl_list(struct nvme_dev *dev, __u32 nsid, struct nvme_ctrl_list *list); int nvme_cli_identify_ns(struct nvme_dev *dev, __u32 nsid, struct nvme_id_ns *ns); +int nvme_cli_identify_ns_descs(struct nvme_dev *dev, __u32 nsid, + struct nvme_ns_id_desc *descs); int nvme_cli_identify_allocated_ns(struct nvme_dev *dev, __u32 nsid, struct nvme_id_ns *ns); int nvme_cli_identify_active_ns_list(struct nvme_dev *dev, __u32 nsid, struct nvme_ns_list *list); int nvme_cli_identify_allocated_ns_list(struct nvme_dev *dev, __u32 nsid, struct nvme_ns_list *list); - +int nvme_cli_identify_primary_ctrl(struct nvme_dev *dev, __u32 nsid, + struct nvme_primary_ctrl_cap *cap); +int nvme_cli_identify_secondary_ctrl_list(struct nvme_dev *dev, __u32 nsid, + __u16 ctrl_id, + struct nvme_secondary_ctrl_list *sc_list); int nvme_cli_ns_mgmt_delete(struct nvme_dev *dev, __u32 nsid); int nvme_cli_ns_mgmt_create(struct nvme_dev *dev, struct nvme_id_ns *ns, __u32 *nsid, __u32 timeout, __u8 csi); @@ -119,7 +125,20 @@ int nvme_cli_fw_download(struct nvme_dev *dev, int nvme_cli_fw_commit(struct nvme_dev *dev, struct nvme_fw_commit_args *args); +int nvme_cli_admin_passthru(struct nvme_dev *dev, __u8 opcode, __u8 flags, + __u16 rsvd, __u32 nsid, __u32 cdw2, __u32 cdw3, + __u32 cdw10, __u32 cdw11, __u32 cdw12, __u32 cdw13, + __u32 cdw14, __u32 cdw15, __u32 data_len, + void *data, __u32 metadata_len, void *metadata, + __u32 timeout_ms, __u32 *result); + int nvme_cli_get_feature_length2(int fid, __u32 cdw11, enum nvme_data_tfr dir, __u32 *len); +int nvme_cli_security_send(struct nvme_dev *dev, + struct nvme_security_send_args* args); + +int nvme_cli_security_receive(struct nvme_dev *dev, + struct nvme_security_receive_args* args); + #endif /* _NVME_WRAP_H */ diff --git a/nvme.c b/nvme.c index df4d297..350e823 100644 --- a/nvme.c +++ b/nvme.c @@ -40,6 +40,7 @@ #include #include #include +#include #ifdef CONFIG_LIBHUGETLBFS #include @@ -64,6 +65,7 @@ #include "nvme-wrap.h" #include "util/argconfig.h" +#include "util/suffix.h" #include "fabrics.h" #define CREATE_CMD @@ -74,6 +76,7 @@ struct feat_cfg { __u32 namespace_id; enum nvme_get_features_sel sel; __u32 cdw11; + __u32 cdw12; __u8 uuid_index; __u32 data_len; bool raw_binary; @@ -104,6 +107,54 @@ static struct program nvme = { const char *output_format = "Output format: normal|json|binary"; static const char *output_format_no_binary = "Output format: normal|json"; +static const char *app_tag = "app tag for end-to-end PI"; +static const char *app_tag_mask = "app tag mask for end-to-end PI"; +static const char *block_count = "number of blocks (zeroes based) on device to access"; +static const char *crkey = "current reservation key"; +static const char *buf_len = "buffer len (if) data is sent or received"; +static const char *domainid = "Domain Identifier"; +static const char *doper = "directive operation"; +static const char *dry = "show command instead of sending"; +static const char *dspec_w_dtype = "directive specification associated with directive type"; +static const char *dtype = "directive type"; +static const char *force_unit_access = "force device to commit data before command completes"; +static const char *human_readable_directive = "show directive in readable format"; +static const char *human_readable_identify = "show identify in readable format"; +static const char *human_readable_info = "show info in readable format"; +static const char *human_readable_log = "show log in readable format"; +static const char *iekey = "ignore existing res. key"; +static const char *latency = "output latency statistics"; +static const char *lba_format_index = "The index into the LBA Format list "\ + "identifying the LBA Format capabilities that are to be returned"; +static const char *limited_retry = "limit media access attempts"; +static const char *lsp = "log specific field"; +static const char *mos = "management operation specific"; +static const char *mo = "management operation"; +static const char *namespace_desired = "desired namespace"; +static const char *namespace_id_desired = "identifier of desired namespace"; +static const char *namespace_id_optional = "optional namespace attached to controller"; +static const char *nssf = "NVMe Security Specific Field"; +static const char *prinfo = "PI and check field"; +static const char *rae = "Retain an Asynchronous Event"; +static const char *raw_directive = "show directive in binary format"; +static const char *raw_dump = "dump output in binary format"; +static const char *raw_identify = "show identify in binary format"; +static const char *raw_log = "show log in binary format"; +static const char *raw_output = "output in binary format"; +static const char *ref_tag = "reference tag for end-to-end PI"; +static const char *raw_use = "use binary output"; +static const char *rtype = "reservation type"; +static const char *secp = "security protocol (cf. SPC-4)"; +static const char *spsp = "security-protocol-specific (cf. SPC-4)"; +static const char *start_block = "64-bit LBA of first block to access"; +static const char *storage_tag = "storage tag for end-to-end PI"; +static const char *timeout = "timeout value, in milliseconds"; +static const char *uuid_index = "UUID index"; +static const char *uuid_index_specify = "specify uuid index"; +static const char *verbose = "Increase output verbosity"; +static const char dash[51] = {[0 ... 49] = '=', '\0'}; +static const char space[51] = {[0 ... 49] = ' ', '\0'}; + static void *mmap_registers(nvme_root_t r, struct nvme_dev *dev); static void *__nvme_alloc(size_t len, bool *huge) { @@ -167,6 +218,12 @@ int map_log_level(int verbose, bool quiet) { int log_level; + /* + * LOG_NOTICE is unsued thus the user has to provide two 'v' for getting + * any feedback at all. Thus skip this level + */ + verbose++; + switch (verbose) { case 0: log_level = LOG_WARNING; @@ -411,8 +468,6 @@ static int get_smart_log(int argc, char **argv, struct command *cmd, struct plug "(or optionally a namespace) in either decoded format "\ "(default) or binary."; const char *namespace = "(optional) desired namespace"; - const char *raw = "output in binary format"; - const char *human_readable = "show info in readable format"; enum nvme_print_flags flags; struct nvme_dev *dev; int err = -1; @@ -435,8 +490,8 @@ static int get_smart_log(int argc, char **argv, struct command *cmd, struct plug OPT_ARGS(opts) = { OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), - OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_output), + OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable_info), OPT_END() }; @@ -452,7 +507,7 @@ static int get_smart_log(int argc, char **argv, struct command *cmd, struct plug if (cfg.human_readable) flags |= VERBOSE; - err = nvme_cli_get_log_smart(dev, cfg.namespace_id, true, + err = nvme_cli_get_log_smart(dev, cfg.namespace_id, false, &smart_log); if (!err) nvme_show_smart_log(&smart_log, cfg.namespace_id, @@ -540,6 +595,100 @@ ret: return err; } +static int get_telemetry_log_helper(struct nvme_dev *dev, bool create, + bool ctrl, struct nvme_telemetry_log **buf, + enum nvme_telemetry_da da, + size_t *size) +{ + static const __u32 xfer = NVME_LOG_TELEM_BLOCK_SIZE; + struct nvme_telemetry_log *telem; + struct nvme_id_ctrl id_ctrl; + void *log, *tmp; + int err; + *size = 0; + + log = calloc(1, xfer); + if (!log) + return -ENOMEM; + + if (ctrl) { + /* set rae = true so it won't clear the current telemetry log in controller */ + err = nvme_cli_get_log_telemetry_ctrl(dev, true, 0, xfer, log); + } else { + if (create) + err = nvme_cli_get_log_create_telemetry_host(dev, log); + else + err = nvme_cli_get_log_telemetry_host(dev, 0, xfer, log); + } + + if (err) + goto free; + + telem = log; + if (ctrl && !telem->ctrlavail) { + *buf = log; + *size = xfer; + printf("Warning: Telemetry Controller-Initiated Data Not Available.\n"); + return 0; + } + + switch (da) { + case NVME_TELEMETRY_DA_1: + case NVME_TELEMETRY_DA_2: + case NVME_TELEMETRY_DA_3: + /* dalb3 >= dalb2 >= dalb1 */ + *size = (le16_to_cpu(telem->dalb3) + 1) * xfer; + break; + case NVME_TELEMETRY_DA_4: + err = nvme_cli_identify_ctrl(dev, &id_ctrl); + if (err) { + perror("identify-ctrl"); + goto free; + } + + if (id_ctrl.lpa & 0x40) { + *size = (le32_to_cpu(telem->dalb4) + 1) * xfer; + } else { + fprintf(stderr, "Data area 4 unsupported, bit 6 of Log Page Attributes not set\n"); + err = -EINVAL; + goto free; + } + break; + default: + fprintf(stderr, "Invalid data area parameter - %d\n", da); + err = -EINVAL; + goto free; + } + + if (xfer == *size) { + fprintf(stderr, "ERRO: No telemetry data block\n"); + err = -ENOENT; + goto free; + } + + tmp = realloc(log, *size); + if (!tmp) { + err = -ENOMEM; + goto free; + } + log = tmp; + + if (ctrl) { + err = nvme_cli_get_log_telemetry_ctrl(dev, true, 0, *size, log); + } else { + err = nvme_cli_get_log_telemetry_host(dev, 0, *size, log); + } + + if (!err) { + *buf = log; + return 0; + } +free: + free(log); + return err; +} + + static int get_telemetry_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { @@ -596,18 +745,22 @@ static int get_telemetry_log(int argc, char **argv, struct command *cmd, } if (cfg.ctrl_init) - err = nvme_get_ctrl_telemetry(dev_fd(dev), true, &log, - cfg.data_area, &total_size); + /* Create Telemetry Host-Initiated Data = false, Controller-Initiated = true */ + err = get_telemetry_log_helper(dev, false, true, &log, + cfg.data_area, &total_size); else if (cfg.host_gen) - err = nvme_get_new_host_telemetry(dev_fd(dev), &log, - cfg.data_area, &total_size); + /* Create Telemetry Host-Initiated Data = true, Controller-Initiated = false */ + err = get_telemetry_log_helper(dev, true, false, &log, + cfg.data_area, &total_size); else - err = nvme_get_host_telemetry(dev_fd(dev), &log, - cfg.data_area, &total_size); + /* Create Telemetry Host-Initiated Data = false, Controller-Initiated = false */ + err = get_telemetry_log_helper(dev, false, false, &log, + cfg.data_area, &total_size); if (err < 0) { fprintf(stderr, "get-telemetry-log: %s\n", nvme_strerror(errno)); + goto close_output; } else if (err > 0) { nvme_show_status(err); fprintf(stderr, "Failed to acquire telemetry log %d!\n", err); @@ -721,8 +874,6 @@ static int collect_effects_log(struct nvme_dev *dev, enum nvme_csi csi, static int get_effects_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { const char *desc = "Retrieve command effects log page and print the table."; - const char *raw = "show log in binary format"; - const char *human_readable = "show log in readable format"; const char *csi = ""; struct list_head log_pages; nvme_effects_log_node_t *node; @@ -749,8 +900,8 @@ static int get_effects_log(int argc, char **argv, struct command *cmd, struct pl OPT_ARGS(opts) = { OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("human-readable",'H', &cfg.human_readable, human_readable), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("human-readable",'H', &cfg.human_readable, human_readable_log), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_log), OPT_INT("csi", 'c', &cfg.csi, csi), OPT_END() }; @@ -820,7 +971,6 @@ static int get_supported_log_pages(int argc, char **argv, struct command *cmd, struct plugin *plugin) { const char *desc = "Retrieve supported logs and print the table."; - const char *verbose = "Increase output verbosity"; struct nvme_supported_log_pages supports; enum nvme_print_flags flags; struct nvme_dev *dev; @@ -952,7 +1102,6 @@ static int get_fw_log(int argc, char **argv, struct command *cmd, struct plugin { const char *desc = "Retrieve the firmware log for the "\ "specified device in either decoded format (default) or binary."; - const char *raw = "use binary output"; struct nvme_firmware_slot fw_log; enum nvme_print_flags flags; struct nvme_dev *dev; @@ -970,7 +1119,7 @@ static int get_fw_log(int argc, char **argv, struct command *cmd, struct plugin OPT_ARGS(opts) = { OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_use), OPT_END() }; @@ -1002,7 +1151,6 @@ static int get_changed_ns_list_log(int argc, char **argv, struct command *cmd, s const char *desc = "Retrieve Changed Namespaces log for the given device "\ "in either decoded format "\ "(default) or binary."; - const char *raw = "output in binary format"; struct nvme_ns_list changed_ns_list_log; enum nvme_print_flags flags; struct nvme_dev *dev; @@ -1020,7 +1168,7 @@ static int get_changed_ns_list_log(int argc, char **argv, struct command *cmd, s OPT_ARGS(opts) = { OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_output), OPT_END() }; @@ -1057,7 +1205,6 @@ static int get_pred_lat_per_nvmset_log(int argc, char **argv, "page and prints it for the given device in either decoded " \ "format(default),json or binary."; const char *nvmset_id = "NVM Set Identifier"; - const char *raw = "use binary output"; struct nvme_nvmset_predictable_lat_log plpns_log; enum nvme_print_flags flags; struct nvme_dev *dev; @@ -1078,7 +1225,7 @@ static int get_pred_lat_per_nvmset_log(int argc, char **argv, OPT_ARGS(opts) = { OPT_SHRT("nvmset-id", 'i', &cfg.nvmset_id, nvmset_id), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_use), OPT_END() }; @@ -1118,8 +1265,6 @@ static int get_pred_lat_event_agg_log(int argc, char **argv, "json or binary."; const char *log_entries = "Number of pending NVM Set" \ "log Entries list"; - const char *rae = "Retain an Asynchronous Event"; - const char *raw = "use binary output"; enum nvme_print_flags flags; struct nvme_id_ctrl ctrl; struct nvme_dev *dev; @@ -1145,7 +1290,7 @@ static int get_pred_lat_event_agg_log(int argc, char **argv, OPT_UINT("log-entries", 'e', &cfg.log_entries, log_entries), OPT_FLAG("rae", 'r', &cfg.rae, rae), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_use), OPT_END() }; @@ -1210,7 +1355,6 @@ static int get_persistent_event_log(int argc, char **argv, const char *action = "action the controller shall take during"\ " processing this persistent log page command."; const char *log_len = "number of bytes to retrieve"; - const char *raw = "use binary output"; struct nvme_persistent_event_log *pevent, *pevent_collected; enum nvme_print_flags flags; void *pevent_log_info; @@ -1236,7 +1380,7 @@ static int get_persistent_event_log(int argc, char **argv, OPT_BYTE("action", 'a', &cfg.action, action), OPT_UINT("log_len", 'l', &cfg.log_len, log_len), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_use), OPT_END() }; @@ -1342,8 +1486,6 @@ static int get_endurance_event_agg_log(int argc, char **argv, "json or binary."; const char *log_entries = "Number of pending Endurance Group " \ "Event log Entries list"; - const char *rae = "Retain an Asynchronous Event"; - const char *raw = "use binary output"; void *endurance_log; struct nvme_id_ctrl ctrl; enum nvme_print_flags flags; @@ -1369,7 +1511,7 @@ static int get_endurance_event_agg_log(int argc, char **argv, OPT_UINT("log-entries", 'e', &cfg.log_entries, log_entries), OPT_FLAG("rae", 'r', &cfg.rae, rae), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_use), OPT_END() }; @@ -1432,7 +1574,6 @@ static int get_lba_status_log(int argc, char **argv, const char *desc = "Retrieve Get LBA Status Info Log " \ "and prints it, for the given device in either " \ "decoded format(default),json or binary."; - const char *rae = "Retain an Asynchronous Event"; void *lab_status; enum nvme_print_flags flags; struct nvme_dev *dev; @@ -1553,7 +1694,6 @@ static int get_boot_part_log(int argc, char **argv, struct command *cmd, struct "log page and prints it, for the given " \ "device in either decoded format(default), " \ "json or binary."; - const char *lsp = "log specific field"; const char *fname = "boot partition data output file name"; struct nvme_boot_partition boot; __u8 *bp_log; @@ -1661,8 +1801,6 @@ static int get_media_unit_stat_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { const char *desc = "Retrieve the configuration and wear of media units and print it"; - const char *domainid = "Domain Identifier"; - const char *raw = "use binary output"; struct nvme_media_unit_stat_log mus; enum nvme_print_flags flags; struct nvme_dev *dev; @@ -1683,7 +1821,7 @@ static int get_media_unit_stat_log(int argc, char **argv, struct command *cmd, OPT_ARGS(opts) = { OPT_UINT("domain-id", 'd', &cfg.domainid, domainid), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_use), OPT_END() }; @@ -1717,8 +1855,6 @@ static int get_supp_cap_config_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { const char *desc = "Retrieve the list of Supported Capacity Configuration Descriptors"; - const char *domainid = "Domain Identifier"; - const char *raw = "use binary output"; struct nvme_supported_cap_config_list_log cap_log; enum nvme_print_flags flags; struct nvme_dev *dev; @@ -1739,7 +1875,7 @@ static int get_supp_cap_config_log(int argc, char **argv, struct command *cmd, OPT_ARGS(opts) = { OPT_UINT("domain-id", 'd', &cfg.domainid, domainid), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_use), OPT_END() }; @@ -1769,21 +1905,213 @@ ret: return err; } +static int io_mgmt_send(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "I/O Management Send"; + const char *data = "optional file for data (default stdin)"; + + struct nvme_dev *dev; + void *buf = NULL; + int err = -1; + int dfd = STDIN_FILENO; + + struct config { + __u16 mos; + __u8 mo; + __u32 namespace_id; + char *file; + __u32 data_len; + }; + + struct config cfg = { + .mos = 0, + }; + + OPT_ARGS(opts) = { + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), + OPT_UINT("mos", 's', &cfg.mos, mos), + OPT_BYTE("mo", 'm', &cfg.mo, mo), + OPT_FILE("data", 'd', &cfg.file, data), + OPT_UINT("data-len", 'l', &cfg.data_len, buf_len), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return errno; + + if (!cfg.namespace_id) { + err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id); + if (err < 0) { + perror("get-namespace-id"); + goto close_dev; + } + } + + if (cfg.data_len) { + buf = calloc(1, cfg.data_len); + if (!buf) { + perror("could not alloc memory for io mgmt receive data"); + err = -ENOMEM; + goto close_dev; + } + } + + if (cfg.file) { + dfd = open(cfg.file, O_RDONLY); + if (dfd < 0) { + perror(cfg.file); + goto free; + } + } + + err = read(dfd, buf, cfg.data_len); + if (err < 0) { + perror("read"); + goto close_fd; + } + + struct nvme_io_mgmt_send_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .nsid = cfg.namespace_id, + .mos = cfg.mos, + .mo = cfg.mo, + .data_len = cfg.data_len, + .data = buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + }; + + err = nvme_io_mgmt_send(&args); + if (!err) + printf("io-mgmt-send: Success, mos:%u mo:%u nsid:%d\n", + cfg.mos, cfg.mo, cfg.namespace_id); + else if (err > 0) + nvme_show_status(err); + else + perror("io-mgmt-send"); + +close_fd: + if (cfg.file) + close(dfd); +free: + free(buf); +close_dev: + dev_close(dev); + return err; +} + +static int io_mgmt_recv(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "I/O Management Receive"; + const char *data = "optional file for data (default stdout)"; + + struct nvme_dev *dev; + void *buf = NULL; + int err = -1; + int dfd = STDOUT_FILENO; + + struct config { + __u16 mos; + __u8 mo; + __u32 namespace_id; + char *file; + __u32 data_len; + }; + + struct config cfg = { + .mos = 0, + }; + + OPT_ARGS(opts) = { + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), + OPT_UINT("mos", 's', &cfg.mos, mos), + OPT_BYTE("mo", 'm', &cfg.mo, mo), + OPT_FILE("data", 'd', &cfg.file, data), + OPT_UINT("data-len", 'l', &cfg.data_len, buf_len), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return errno; + + if (!cfg.namespace_id) { + err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id); + if (err < 0) { + perror("get-namespace-id"); + goto close_dev; + } + } + + if (cfg.data_len) { + buf = calloc(1, cfg.data_len); + if (!buf) { + perror("could not alloc memory for io mgmt receive data"); + err = -ENOMEM; + goto close_dev; + } + } + + struct nvme_io_mgmt_recv_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .nsid = cfg.namespace_id, + .mos = cfg.mos, + .mo = cfg.mo, + .data_len = cfg.data_len, + .data = buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + }; + + err = nvme_io_mgmt_recv(&args); + if (!err) { + printf("io-mgmt-recv: Success, mos:%u mo:%u nsid:%d\n", + cfg.mos, cfg.mo, cfg.namespace_id); + + if (cfg.file) { + dfd = open(cfg.file, O_WRONLY | O_CREAT, 0644); + if (dfd < 0) { + perror(cfg.file); + goto free; + } + + err = write(dfd, buf, cfg.data_len); + if (err < 0) { + perror("write"); + goto close_fd; + } + } else { + d((unsigned char *)buf, cfg.data_len, 16, 1); + } + } else if (err > 0) { + nvme_show_status(err); + } else { + perror("io-mgmt-recv"); + } + +close_fd: + if (cfg.file) + close(dfd); +free: + free(buf); +close_dev: + dev_close(dev); + + return err; +} + static int get_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { const char *desc = "Retrieve desired number of bytes "\ "from a given log on a specified device in either "\ "hex-dump (default) or binary format"; - const char *namespace_id = "desired namespace"; const char *log_id = "identifier of log to retrieve"; const char *log_len = "how many bytes to retrieve"; const char *aen = "result of the aen, use to override log id"; - const char *lsp = "log specific field"; const char *lpo = "log page offset specifies the location within a log page from where to start returning data"; const char *lsi = "log specific identifier specifies an identifier that is required for a particular log page"; - const char *rae = "retain an asynchronous event"; const char *raw = "output in raw format"; - const char *uuid_index = "UUID index"; const char *csi = "command set identifier"; const char *offset_type = "offset type"; struct nvme_dev *dev; @@ -1821,7 +2149,7 @@ static int get_log(int argc, char **argv, struct command *cmd, struct plugin *pl }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_desired), OPT_BYTE("log-id", 'i', &cfg.log_id, log_id), OPT_UINT("log-len", 'l', &cfg.log_len, log_len), OPT_UINT("aen", 'a', &cfg.aen, aen), @@ -1909,9 +2237,6 @@ ret: static int sanitize_log(int argc, char **argv, struct command *command, struct plugin *plugin) { const char *desc = "Retrieve sanitize log and show it."; - const char *rae = "Retain an Asynchronous Event"; - const char *raw = "show log in binary format"; - const char *human_readable = "show log in readable format"; struct nvme_sanitize_log_page sanitize_log; enum nvme_print_flags flags; struct nvme_dev *dev; @@ -1934,8 +2259,8 @@ static int sanitize_log(int argc, char **argv, struct command *command, struct p OPT_ARGS(opts) = { OPT_FLAG("rae", 'r', &cfg.rae, rae), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("human-readable",'H', &cfg.human_readable, human_readable), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("human-readable",'H', &cfg.human_readable, human_readable_log), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_log), OPT_END() }; @@ -1969,7 +2294,6 @@ static int get_fid_support_effects_log(int argc, char **argv, struct command *cm struct plugin *plugin) { const char *desc = "Retrieve FID Support and Effects log and show it."; - const char *human_readable = "show log in readable format"; struct nvme_fid_supported_effects_log fid_support_log; enum nvme_print_flags flags; struct nvme_dev *dev; @@ -1987,7 +2311,7 @@ static int get_fid_support_effects_log(int argc, char **argv, struct command *cm OPT_ARGS(opts) = { OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("human-readable",'H', &cfg.human_readable, human_readable), + OPT_FLAG("human-readable",'H', &cfg.human_readable, human_readable_log), OPT_END() }; @@ -2021,7 +2345,6 @@ static int get_mi_cmd_support_effects_log(int argc, char **argv, struct command struct plugin *plugin) { const char *desc = "Retrieve NVMe-MI Command Support and Effects log and show it."; - const char *human_readable = "show log in readable format"; struct nvme_mi_cmd_supported_effects_log mi_cmd_support_log; enum nvme_print_flags flags; struct nvme_dev *dev; @@ -2039,7 +2362,7 @@ static int get_mi_cmd_support_effects_log(int argc, char **argv, struct command OPT_ARGS(opts) = { OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("human-readable",'H', &cfg.human_readable, human_readable), + OPT_FLAG("human-readable",'H', &cfg.human_readable, human_readable_log), OPT_END() }; @@ -2074,7 +2397,6 @@ static int list_ctrl(int argc, char **argv, struct command *cmd, struct plugin * const char *desc = "Show controller list information for the subsystem the "\ "given device is part of, or optionally controllers attached to a specific namespace."; const char *controller = "controller to display"; - const char *namespace_id = "optional namespace attached to controller"; struct nvme_ctrl_list *cntlist; enum nvme_print_flags flags; struct nvme_dev *dev; @@ -2094,7 +2416,7 @@ static int list_ctrl(int argc, char **argv, struct command *cmd, struct plugin * OPT_ARGS(opts) = { OPT_SHRT("cntid", 'c', &cfg.cntid, controller), - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_optional), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), OPT_END() }; @@ -2220,10 +2542,6 @@ static int id_ns_lba_format(int argc, char **argv, struct command *cmd, struct p const char *desc = "Send an Identify Namespace command to the given "\ "device, returns capability field properties of the specified "\ "LBA Format index in various formats."; - const char *lba_format_index = "The index into the LBA Format list "\ - "identifying the LBA Format capabilities that are to be returned"; - const char *uuid_index = "UUID index"; - const char *verbose = "Increase output verbosity"; enum nvme_print_flags flags; struct nvme_id_ns ns; struct nvme_dev *dev; @@ -2348,7 +2666,6 @@ static int delete_ns(int argc, char **argv, struct command *cmd, struct plugin * "becomes inactive when that namespace is detached or, if "\ "the namespace is not already inactive, once deleted."; const char *namespace_id = "namespace to delete"; - const char *timeout = "timeout value, in milliseconds"; struct nvme_dev *dev; int err; @@ -2489,6 +2806,86 @@ static int detach_ns(int argc, char **argv, struct command *cmd, struct plugin * return nvme_attach_ns(argc, argv, 0, desc, cmd); } +static int parse_lba_num_si(struct nvme_dev *dev, const char *opt, + const char *val, __u8 flbas, __u64 *num) +{ + bool suffixed = false; + struct nvme_id_ctrl ctrl; + __u32 nsid = 1; + struct nvme_id_ns ns; + int err = -EINVAL; + int i; + int lbas; + struct nvme_ns_list ns_list; + struct nvme_identify_args args = { + .args_size = sizeof(args), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .data = &ns_list, + .cns = NVME_IDENTIFY_CNS_NS_ACTIVE_LIST, + .nsid = nsid - 1. + }; + + if (!val) + return 0; + + if (*num) { + fprintf(stderr, + "Invalid specification of both %s and its SI argument, please specify only one\n", + opt); + return err; + } + + err = nvme_cli_identify_ctrl(dev, &ctrl); + if (err) { + if (err < 0) + fprintf(stderr, "identify controller: %s\n", + nvme_strerror(errno)); + else + nvme_show_status(err); + return err; + } + + if ((ctrl.oacs & 0x8) >> 3) + nsid = NVME_NSID_ALL; + else { + err = nvme_cli_identify(dev, &args); + if (err) { + if (err < 0) + fprintf(stderr, "identify namespace list: %s", + nvme_strerror(errno)); + else + nvme_show_status(err); + return err; + } + nsid = le32_to_cpu(ns_list.ns[0]); + } + + err = nvme_cli_identify_ns(dev, nsid, &ns); + if (err) { + if (err < 0) + fprintf(stderr, "identify namespace: %s", + nvme_strerror(errno)); + else + nvme_show_status(err); + return err; + } + + i = flbas & NVME_NS_FLBAS_LOWER_MASK; + lbas = (1 << ns.lbaf[i].ds) + ns.lbaf[i].ms; + + *num = suffix_si_parse(val, &suffixed); + + if (errno) + fprintf(stderr, + "Expected long suffixed integer argument for '%s-si' but got '%s'!\n", + opt, val); + + if (suffixed) + *num /= lbas; + + return errno; +} + static int create_ns(int argc, char **argv, struct command *cmd, struct plugin *plugin) { const char *desc = "Send a namespace management command "\ @@ -2506,9 +2903,10 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin * const char *nvmsetid = "NVM Set Identifier (NVMSETID)"; const char *csi = "command set identifier (CSI)"; const char *lbstm = "logical block storage tag mask (LBSTM)"; - const char *timeout = "timeout value, in milliseconds"; const char *bs = "target block size, specify only if \'FLBAS\' "\ "value not entered"; + const char *nsze_si = "size of ns (NSZE) in standard SI units"; + const char *ncap_si = "capacity of ns (NCAP) in standard SI units"; struct nvme_id_ns ns; struct nvme_dev *dev; @@ -2527,6 +2925,8 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin * __u32 timeout; __u8 csi; __u64 lbstm; + char *nsze_si; + char *ncap_si; }; struct config cfg = { @@ -2541,6 +2941,8 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin * .timeout = 120000, .csi = 0, .lbstm = 0, + .nsze_si = NULL, + .ncap_si = NULL, }; OPT_ARGS(opts) = { @@ -2555,6 +2957,8 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin * OPT_UINT("timeout", 't', &cfg.timeout, timeout), OPT_BYTE("csi", 'y', &cfg.csi, csi), OPT_SUFFIX("lbstm", 'l', &cfg.lbstm, lbstm), + OPT_STR("nsze-si", 'S', &cfg.nsze_si, nsze_si), + OPT_STR("ncap-si", 'C', &cfg.ncap_si, ncap_si), OPT_END() }; @@ -2606,6 +3010,14 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin * goto close_dev; } + err = parse_lba_num_si(dev, "nsze", cfg.nsze_si, cfg.flbas, &cfg.nsze); + if (err) + goto close_dev; + + err = parse_lba_num_si(dev, "ncap", cfg.ncap_si, cfg.flbas, &cfg.ncap); + if (err) + goto close_dev; + struct nvme_id_ns ns2 = { .nsze = cpu_to_le64(cfg.nsze), .ncap = cpu_to_le64(cfg.ncap), @@ -2672,7 +3084,6 @@ static int list_subsys(int argc, char **argv, struct command *cmd, nvme_root_t r = NULL; enum nvme_print_flags flags; const char *desc = "Retrieve information for subsystems"; - const char *verbose = "Increase output verbosity"; nvme_scan_filter_t filter = NULL; char *devname; int err; @@ -2753,7 +3164,6 @@ ret: static int list(int argc, char **argv, struct command *cmd, struct plugin *plugin) { const char *desc = "Retrieve basic information for all NVMe namespaces"; - const char *verbose = "Increase output verbosity"; enum nvme_print_flags flags; nvme_root_t r; int err = 0; @@ -2817,8 +3227,6 @@ int __id_ctrl(int argc, char **argv, struct command *cmd, struct plugin *plugin, "binary format. May also return vendor-specific "\ "controller attributes in hex-dump if requested."; const char *vendor_specific = "dump binary vendor field"; - const char *raw = "show identify in binary format"; - const char *human_readable = "show identify in readable format"; enum nvme_print_flags flags; struct nvme_id_ctrl ctrl; struct nvme_dev *dev; @@ -2841,8 +3249,8 @@ int __id_ctrl(int argc, char **argv, struct command *cmd, struct plugin *plugin, OPT_ARGS(opts) = { OPT_FLAG("vendor-specific", 'v', &cfg.vendor_specific, vendor_specific), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), - OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_identify), + OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable_identify), OPT_END() }; @@ -2929,9 +3337,6 @@ static int nvm_id_ns(int argc, char **argv, struct command *cmd, const char *desc = "Send an Identify Namespace NVM Command Set "\ "command to the given device and report information about "\ "the specified namespace in various formats."; - const char *namespace_id = "identifier of desired namespace"; - const char *uuid_index = "UUID index"; - const char *verbose = "Increase output verbosity"; enum nvme_print_flags flags; struct nvme_nvm_id_ns id_ns; struct nvme_id_ns ns; @@ -2953,7 +3358,7 @@ static int nvm_id_ns(int argc, char **argv, struct command *cmd, }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), OPT_BYTE("uuid-index", 'U', &cfg.uuid_index, uuid_index), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), OPT_FLAG("verbose", 'v', &cfg.verbose, verbose), @@ -3006,10 +3411,6 @@ static int nvm_id_ns_lba_format(int argc, char **argv, struct command *cmd, stru "command to the given device, returns capability field properties of " "the specified LBA Format index in the specified namespace in various " "formats."; - const char *lba_format_index = "The index into the LBA Format list "\ - "identifying the LBA Format capabilities that are to be returned"; - const char *uuid_index = "UUID index"; - const char *verbose = "Increase output verbosity"; enum nvme_print_flags flags; struct nvme_id_ns ns; struct nvme_nvm_id_ns nvm_ns; @@ -3076,7 +3477,6 @@ static int ns_descs(int argc, char **argv, struct command *cmd, struct plugin *p "given device, returns the namespace identification descriptors "\ "of the specific namespace in either human-readable or binary format."; const char *raw = "show descriptors in binary format"; - const char *namespace_id = "identifier of desired namespace"; enum nvme_print_flags flags; struct nvme_dev *dev; void *nsdescs; @@ -3095,7 +3495,7 @@ static int ns_descs(int argc, char **argv, struct command *cmd, struct plugin *p }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), OPT_END() @@ -3124,7 +3524,7 @@ static int ns_descs(int argc, char **argv, struct command *cmd, struct plugin *p goto close_dev; } - err = nvme_identify_ns_descs(dev_fd(dev), cfg.namespace_id, nsdescs); + err = nvme_cli_identify_ns_descs(dev, cfg.namespace_id, nsdescs); if (!err) nvme_show_id_ns_descs(nsdescs, cfg.namespace_id, flags); else if (err > 0) @@ -3146,9 +3546,6 @@ static int id_ns(int argc, char **argv, struct command *cmd, struct plugin *plug "binary vendor-specific namespace attributes."; const char *force = "Return this namespace, even if not attached (1.2 devices only)"; const char *vendor_specific = "dump binary vendor fields"; - const char *raw = "show identify in binary format"; - const char *human_readable = "show identify in readable format"; - const char *namespace_id = "identifier of desired namespace"; enum nvme_print_flags flags; struct nvme_id_ns ns; @@ -3174,12 +3571,12 @@ static int id_ns(int argc, char **argv, struct command *cmd, struct plugin *plug }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), OPT_FLAG("force", 0, &cfg.force, force), OPT_FLAG("vendor-specific", 'v', &cfg.vendor_specific, vendor_specific), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_identify), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable), + OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable_identify), OPT_END() }; @@ -3229,9 +3626,6 @@ static int cmd_set_independent_id_ns(int argc, char **argv, const char *desc = "Send an I/O Command Set Independent Identify "\ "Namespace command to the given device, returns properties of the "\ "specified namespace in human-readable or binary or json format."; - const char *raw = "show identify in binary format"; - const char *human_readable = "show identify in readable format"; - const char *namespace_id = "identifier of desired namespace"; enum nvme_print_flags flags; struct nvme_id_independent_id_ns ns; @@ -3253,10 +3647,10 @@ static int cmd_set_independent_id_ns(int argc, char **argv, }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_identify), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable), + OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable_identify), OPT_END() }; @@ -3653,7 +4047,6 @@ static int primary_ctrl_caps(int argc, char **argv, struct command *cmd, struct const char *desc = "Send an Identify Primary Controller Capabilities "\ "command to the given device and report the information in a "\ "decoded format (default), json or binary."; - const char *human_readable = "show info in readable format"; struct nvme_primary_ctrl_cap caps; enum nvme_print_flags flags; struct nvme_dev *dev; @@ -3674,7 +4067,7 @@ static int primary_ctrl_caps(int argc, char **argv, struct command *cmd, struct OPT_ARGS(opts) = { OPT_UINT("cntlid", 'c', &cfg.cntlid, cntlid), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable), + OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable_info), OPT_END() }; @@ -3688,7 +4081,7 @@ static int primary_ctrl_caps(int argc, char **argv, struct command *cmd, struct if (cfg.human_readable) flags |= VERBOSE; - err = nvme_identify_primary_ctrl(dev_fd(dev), cfg.cntlid, &caps); + err = nvme_cli_identify_primary_ctrl(dev, cfg.cntlid, &caps); if (!err) nvme_show_primary_ctrl_cap(&caps, flags); else if (err > 0) @@ -3706,7 +4099,6 @@ static int list_secondary_ctrl(int argc, char **argv, struct command *cmd, struc const char *desc = "Show secondary controller list associated with the primary controller "\ "of the given device."; const char *controller = "lowest controller identifier to display"; - const char *namespace_id = "optional namespace attached to controller"; const char *num_entries = "number of entries to retrieve"; struct nvme_secondary_ctrl_list *sc_list; @@ -3730,7 +4122,7 @@ static int list_secondary_ctrl(int argc, char **argv, struct command *cmd, struc OPT_ARGS(opts) = { OPT_SHRT("cntid", 'c', &cfg.cntid, controller), - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_optional), OPT_UINT("num-entries", 'e', &cfg.num_entries, num_entries), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), OPT_END() @@ -3756,8 +4148,8 @@ static int list_secondary_ctrl(int argc, char **argv, struct command *cmd, struc goto close_err; } - err = nvme_identify_secondary_ctrl_list(dev_fd(dev), cfg.namespace_id, - cfg.cntid, sc_list); + err = nvme_cli_identify_secondary_ctrl_list(dev, cfg.namespace_id, + cfg.cntid, sc_list); if (!err) nvme_show_list_secondary_ctrl(sc_list, cfg.num_entries, flags); else if (err > 0) @@ -3773,33 +4165,132 @@ ret: return err; } +static void intr_self_test(int signum) +{ + printf("\nInterrupted device self-test operation by %s\n", strsignal(signum)); + errno = EINTR; +} + +static int sleep_self_test(unsigned int seconds) +{ + errno = 0; + + sleep(seconds); + + if (errno) + return -errno; + + return 0; +} + +static int wait_self_test(struct nvme_dev *dev) +{ + static const char spin[] = {'-', '\\', '|', '/' }; + struct nvme_self_test_log log; + struct nvme_id_ctrl ctrl; + int err, i = 0, p = 0, cnt = 0; + int wthr; + + signal(SIGINT, intr_self_test); + + err = nvme_cli_identify_ctrl(dev, &ctrl); + if (err) { + fprintf(stderr, "identify-ctrl: %s\n", nvme_strerror(errno)); + return err; + } + + wthr = le16_to_cpu(ctrl.edstt) * 60 / 100 + 60; + + printf("Waiting for self test completion...\n"); + while (true) { + printf("\r[%.*s%c%.*s] %3d%%", p / 2, dash, spin[i % 4], 49 - p / 2, space, p); + fflush(stdout); + err = sleep_self_test(1); + if (err) + return err; + + err = nvme_cli_get_log_device_self_test(dev, &log); + if (err) { + printf("\n"); + if (err < 0) + perror("self test log\n"); + else + nvme_show_status(err); + return err; + } + + if (++cnt > wthr) { + fprintf(stderr, "no progress for %d seconds, stop waiting\n", wthr); + return -EIO; + } + + if (log.completion == 0 && p > 0) { + printf("\r[%.*s] %3d%%\n", 50, dash, 100); + break; + } + + if (log.completion < p) { + printf("\n"); + fprintf(stderr, "progress broken\n"); + return -EIO; + } else if (log.completion != p) { + p = log.completion; + cnt = 0; + } + + i++; + } + + return 0; +} + +static void abort_self_test(struct nvme_dev_self_test_args *args) +{ + int err; + + args->stc = NVME_ST_CODE_ABORT, + + err = nvme_dev_self_test(args); + if (!err) { + printf("Aborting device self-test operation\n"); + } else if (err > 0) { + nvme_show_status(err); + } else + fprintf(stderr, "Device self-test: %s\n", nvme_strerror(errno)); +} + static int device_self_test(int argc, char **argv, struct command *cmd, struct plugin *plugin) { const char *desc = "Implementing the device self-test feature"\ " which provides the necessary log to determine the state of the device"; const char *namespace_id = "Indicate the namespace in which the device self-test"\ " has to be carried out"; - const char * self_test_code = "This field specifies the action taken by the device self-test command : "\ - "\n1h Start a short device self-test operation\n"\ + const char * self_test_code = "This field specifies the action taken by the device self-test command :\n"\ + "0h Show current state of device self-test operation\n"\ + "1h Start a short device self-test operation\n"\ "2h Start a extended device self-test operation\n"\ "eh Start a vendor specific device self-test operation\n"\ - "fh abort the device self-test operation\n"; + "fh Abort the device self-test operation"; + const char *wait = "Wait for the test to finish"; struct nvme_dev *dev; int err; struct config { __u32 namespace_id; __u8 stc; + bool wait; }; struct config cfg = { .namespace_id = NVME_NSID_ALL, - .stc = 0, + .stc = NVME_ST_CODE_RESERVED, + .wait = false, }; OPT_ARGS(opts) = { OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), OPT_BYTE("self-test-code", 's', &cfg.stc, self_test_code), + OPT_FLAG("wait", 'w', &cfg.wait, wait), OPT_END() }; @@ -3807,6 +4298,28 @@ static int device_self_test(int argc, char **argv, struct command *cmd, struct p if (err) goto ret; + if (cfg.stc == NVME_ST_CODE_RESERVED) { + struct nvme_self_test_log log; + err = nvme_cli_get_log_device_self_test(dev, &log); + if (err) { + printf("\n"); + if (err < 0) + perror("self test log\n"); + else + nvme_show_status(err); + } + + if (log.completion == 0) { + printf("no self test running\n"); + } else { + if (cfg.wait) + err = wait_self_test(dev); + else + printf("progress %d%%\n", log.completion); + } + goto close_dev; + } + struct nvme_dev_self_test_args args = { .args_size = sizeof(args), .fd = dev_fd(dev), @@ -3817,17 +4330,24 @@ static int device_self_test(int argc, char **argv, struct command *cmd, struct p }; err = nvme_dev_self_test(&args); if (!err) { - if (cfg.stc == 0xf) + if (cfg.stc == NVME_ST_CODE_ABORT) printf("Aborting device self-test operation\n"); - else if (cfg.stc == 0x2) + else if (cfg.stc == NVME_ST_CODE_EXTENDED) printf("Extended Device self-test started\n"); - else if (cfg.stc == 0x1) + else if (cfg.stc == NVME_ST_CODE_SHORT) printf("Short Device self-test started\n"); + + if (cfg.wait && cfg.stc != NVME_ST_CODE_ABORT) + err = wait_self_test(dev); } else if (err > 0) { nvme_show_status(err); } else fprintf(stderr, "Device self-test: %s\n", nvme_strerror(errno)); +close_dev: + if (err == -EINTR) + abort_self_test(&args); + dev_close(dev); ret: return err; @@ -3840,7 +4360,6 @@ static int self_test_log(int argc, char **argv, struct command *cmd, struct plug "(default) or binary."; const char *dst_entries = "Indicate how many DST log entries to be retrieved, "\ "by default all the 20 entries will be retrieved"; - const char *verbose = "Increase output verbosity"; struct nvme_self_test_log log; enum nvme_print_flags flags; @@ -3901,6 +4420,11 @@ static int get_feature_id(struct nvme_dev *dev, struct feat_cfg *cfg, if (cfg->feature_id == NVME_FEAT_FID_HOST_ID && (cfg->cdw11 & 0x1)) cfg->data_len = 16; + if (cfg->feature_id == NVME_FEAT_FID_FDP_EVENTS) { + cfg->data_len = 0xff * sizeof(__u16); + cfg->cdw11 |= 0xff << 16; + } + if (cfg->sel == 3) cfg->data_len = 0; @@ -4031,12 +4555,9 @@ static int get_feature(int argc, char **argv, struct command *cmd, "change saveable Features."; const char *raw = "show feature in binary format"; const char *feature_id = "feature identifier"; - const char *namespace_id = "identifier of desired namespace"; const char *sel = "[0-3,8]: current/default/saved/supported/changed"; - const char *data_len = "buffer len if data is returned through host memory buffer"; - const char *cdw11 = "dword 11 for interrupt vector config"; + const char *cdw11 = "feature specific dword 11"; const char *human_readable = "show feature in readable format"; - const char *uuid_index = "specify uuid index"; struct nvme_dev *dev; int err; @@ -4053,12 +4574,12 @@ static int get_feature(int argc, char **argv, struct command *cmd, OPT_ARGS(opts) = { OPT_BYTE("feature-id", 'f', &cfg.feature_id, feature_id), - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), OPT_BYTE("sel", 's', &cfg.sel, sel), - OPT_UINT("data-len", 'l', &cfg.data_len, data_len), + OPT_UINT("data-len", 'l', &cfg.data_len, buf_len), OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), OPT_UINT("cdw11", 'c', &cfg.cdw11, cdw11), - OPT_BYTE("uuid-index", 'U', &cfg.uuid_index, uuid_index), + OPT_BYTE("uuid-index", 'U', &cfg.uuid_index, uuid_index_specify), OPT_FLAG("human-readable",'H', &cfg.human_readable, human_readable), OPT_END() }; @@ -4099,6 +4620,95 @@ ret: return err; } +/* Transfers one chunk of firmware to the device, and decodes & reports any + * errors. Returns -1 on (fatal) error; signifying that the transfer should + * be aborted. + */ +static int fw_download_single(struct nvme_dev *dev, void *fw_buf, + unsigned int fw_len, uint32_t offset, + uint32_t len, bool progress, bool ignore_ovr) +{ + const unsigned int max_retries = 3; + bool retryable, ovr; + int err, try; + + if (progress) { + printf("Firmware download: transferring 0x%08x/0x%08x bytes: %03d%%\r", + offset, fw_len, (int)(100 * offset / fw_len)); + } + + struct nvme_fw_download_args args = { + .args_size = sizeof(args), + .offset = offset, + .data_len = len, + .data = fw_buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + + for (try = 0; try < max_retries; try++) { + + if (try > 0) { + fprintf(stderr, "retrying offset %x (%u/%u)\n", + offset, try, max_retries); + } + + err = nvme_cli_fw_download(dev, &args); + if (!err) + return 0; + + /* don't retry if the NVMe-type error indicates Do Not Resend. + */ + retryable = !((err > 0) && + (nvme_status_get_type(err) == NVME_STATUS_TYPE_NVME) && + (nvme_status_get_value(err) & NVME_SC_DNR)); + + /* detect overwrite errors, which are handled differently + * depending on ignore_ovr */ + ovr = (err > 0) && + (nvme_status_get_type(err) == NVME_STATUS_TYPE_NVME) && + (NVME_GET(err, SCT) == NVME_SCT_CMD_SPECIFIC) && + (NVME_GET(err, SC) == NVME_SC_OVERLAPPING_RANGE); + + if (ovr && ignore_ovr) + return 0; + + /* if we're printing progress, we'll need a newline to separate + * error output from the progress data (which doesn't have a + * \n), and flush before we write to stderr. + */ + if (progress) { + printf("\n"); + fflush(stdout); + } + + fprintf(stderr, "fw-download: error on offset 0x%08x/0x%08x\n", + offset, fw_len); + + if (err < 0) { + fprintf(stderr, "fw-download: %s\n", nvme_strerror(errno)); + } else { + nvme_show_status(err); + if (ovr) { + /* non-ignored ovr error: print a little extra info + * about recovering */ + fprintf(stderr, + "Use --ignore-ovr to ignore overwrite errors\n"); + + /* We'll just be attempting more overwrites if + * we retry. DNR will likely be set, but force + * an exit anyway. */ + retryable = false; + } + } + + if (!retryable) + break; + } + + return -1; +} + static int fw_download(int argc, char **argv, struct command *cmd, struct plugin *plugin) { const char *desc = "Copy all or part of a firmware image to "\ @@ -4112,29 +4722,37 @@ static int fw_download(int argc, char **argv, struct command *cmd, struct plugin const char *fw = "firmware file (required)"; const char *xfer = "transfer chunksize limit"; const char *offset = "starting dword offset, default 0"; + const char *progress = "display firmware transfer progress"; + const char *ignore_ovr = "ignore overwrite errors"; unsigned int fw_size; struct nvme_dev *dev; - void *fw_buf, *buf; int err, fw_fd = -1; struct stat sb; + void *fw_buf; bool huge; struct config { char *fw; __u32 xfer; __u32 offset; + bool progress; + bool ignore_ovr; }; struct config cfg = { - .fw = "", - .xfer = 4096, - .offset = 0, + .fw = "", + .xfer = 4096, + .offset = 0, + .progress = false, + .ignore_ovr = false, }; OPT_ARGS(opts) = { - OPT_FILE("fw", 'f', &cfg.fw, fw), - OPT_UINT("xfer", 'x', &cfg.xfer, xfer), - OPT_UINT("offset", 'o', &cfg.offset, offset), + OPT_FILE("fw", 'f', &cfg.fw, fw), + OPT_UINT("xfer", 'x', &cfg.xfer, xfer), + OPT_UINT("offset", 'o', &cfg.offset, offset), + OPT_FLAG("progress", 'p', &cfg.progress, progress), + OPT_FLAG("ignore-ovr", 'i', &cfg.ignore_ovr, ignore_ovr), OPT_END() }; @@ -4177,41 +4795,33 @@ static int fw_download(int argc, char **argv, struct command *cmd, struct plugin goto close_fw_fd; } - buf = fw_buf; if (read(fw_fd, fw_buf, fw_size) != ((ssize_t)(fw_size))) { err = -errno; fprintf(stderr, "read :%s :%s\n", cfg.fw, strerror(errno)); goto free; } - while (fw_size > 0) { + while (cfg.offset < fw_size) { cfg.xfer = min(cfg.xfer, fw_size); - struct nvme_fw_download_args args = { - .args_size = sizeof(args), - .offset = cfg.offset, - .data_len = cfg.xfer, - .data = fw_buf, - .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, - .result = NULL, - }; - err = nvme_cli_fw_download(dev, &args); - if (err < 0) { - fprintf(stderr, "fw-download: %s\n", nvme_strerror(errno)); - break; - } else if (err != 0) { - nvme_show_status(err); + err = fw_download_single(dev, fw_buf + cfg.offset, fw_size, + cfg.offset, cfg.xfer, cfg.progress, + cfg.ignore_ovr); + if (err) break; - } - fw_buf += cfg.xfer; - fw_size -= cfg.xfer; + cfg.offset += cfg.xfer; } - if (!err) + + if (!err) { + /* end the progress output */ + if (cfg.progress) + printf("\n"); printf("Firmware download success\n"); + } free: - nvme_free(buf, huge); + nvme_free(fw_buf, huge); close_fw_fd: close(fw_fd); close_dev: @@ -4416,6 +5026,28 @@ ret: return err; } +static int parse_sanact(char *str, __u8 *val) +{ + int len = strlen(str); + + if (!strncasecmp(str, "exit-failure", len > 1 ? len : 1)) + *val = NVME_SANITIZE_SANACT_EXIT_FAILURE; + + if (!strncasecmp(str, "start-block-erase", len > 7 ? len : 7)) + *val = NVME_SANITIZE_SANACT_START_BLOCK_ERASE; + + if (!strncasecmp(str, "start-overwrite", len > 7 ? len : 7)) + *val = NVME_SANITIZE_SANACT_START_OVERWRITE; + + if (!strncasecmp(str, "start-crypto-erase", len > 7 ? len : 7)) + *val = NVME_SANITIZE_SANACT_START_CRYPTO_ERASE; + + if (*val) + return 0; + + return argconfig_parse_byte("sanact", str, val); +} + static int sanitize(int argc, char **argv, struct command *cmd, struct plugin *plugin) { const char *desc = "Send a sanitize command."; @@ -4423,17 +5055,18 @@ static int sanitize(int argc, char **argv, struct command *cmd, struct plugin *p const char *oipbp_desc = "Overwrite invert pattern between passes."; const char *owpass_desc = "Overwrite pass count."; const char *ause_desc = "Allow unrestricted sanitize exit."; - const char *sanact_desc = "Sanitize action."; + const char *sanact_desc = "Sanitize action: 1 = Exit failure mode, 2 = Start block erase, 3 = Start overwrite, 4 = Start crypto erase"; const char *ovrpat_desc = "Overwrite pattern."; struct nvme_dev *dev; int err; + __u8 sanact = 0; struct config { bool no_dealloc; bool oipbp; __u8 owpass; bool ause; - __u8 sanact; + char *sanact; __u32 ovrpat; }; @@ -4442,7 +5075,7 @@ static int sanitize(int argc, char **argv, struct command *cmd, struct plugin *p .oipbp = false, .owpass = 0, .ause = false, - .sanact = 0, + .sanact = NULL, .ovrpat = 0, }; @@ -4451,7 +5084,7 @@ static int sanitize(int argc, char **argv, struct command *cmd, struct plugin *p OPT_FLAG("oipbp", 'i', &cfg.oipbp, oipbp_desc), OPT_BYTE("owpass", 'n', &cfg.owpass, owpass_desc), OPT_FLAG("ause", 'u', &cfg.ause, ause_desc), - OPT_BYTE("sanact", 'a', &cfg.sanact, sanact_desc), + OPT_STR("sanact", 'a', &cfg.sanact, sanact_desc), OPT_UINT("ovrpat", 'p', &cfg.ovrpat, ovrpat_desc), OPT_END() }; @@ -4460,7 +5093,13 @@ static int sanitize(int argc, char **argv, struct command *cmd, struct plugin *p if (err) goto ret; - switch (cfg.sanact) { + if (cfg.sanact) { + err = parse_sanact(cfg.sanact, &sanact); + if (err) + goto close_dev; + } + + switch (sanact) { case NVME_SANITIZE_SANACT_EXIT_FAILURE: case NVME_SANITIZE_SANACT_START_BLOCK_ERASE: case NVME_SANITIZE_SANACT_START_OVERWRITE: @@ -4472,15 +5111,15 @@ static int sanitize(int argc, char **argv, struct command *cmd, struct plugin *p goto close_dev; } - if (cfg.sanact == NVME_SANITIZE_SANACT_EXIT_FAILURE) { - if (cfg.ause || cfg.no_dealloc) { + if (sanact == NVME_SANITIZE_SANACT_EXIT_FAILURE) { + if (cfg.ause || cfg.no_dealloc) { fprintf(stderr, "SANACT is Exit Failure Mode\n"); err = -EINVAL; goto close_dev; - } + } } - if (cfg.sanact == NVME_SANITIZE_SANACT_START_OVERWRITE) { + if (sanact == NVME_SANITIZE_SANACT_START_OVERWRITE) { if (cfg.owpass > 16) { fprintf(stderr, "OWPASS out of range [0-16]\n"); err = -EINVAL; @@ -4496,7 +5135,7 @@ static int sanitize(int argc, char **argv, struct command *cmd, struct plugin *p struct nvme_sanitize_nvm_args args = { .args_size = sizeof(args), - .sanact = cfg.sanact, + .sanact = sanact, .ause = cfg.ause, .owpass = cfg.owpass, .oipbp = cfg.oipbp, @@ -4543,6 +5182,8 @@ static int nvme_get_properties(int fd, void **pbar) err = 0; value = -1; } else if (err) { + fprintf(stderr, "get-property: %s\n", + nvme_strerror(errno)); free(*pbar); break; } @@ -4585,15 +5226,19 @@ static void *mmap_registers(nvme_root_t r, struct nvme_dev *dev) fd = open(path, O_RDONLY); if (fd < 0) { - fprintf(stderr, "%s did not find a pci resource, open failed %s\n", + if (map_log_level(0, false) >= LOG_DEBUG) + fprintf(stderr, + "%s did not find a pci resource, open failed %s\n", dev->name, strerror(errno)); return NULL; } membase = mmap(NULL, getpagesize(), PROT_READ, MAP_SHARED, fd, 0); if (membase == MAP_FAILED) { - fprintf(stderr, "%s failed to map. ", dev->name); - fprintf(stderr, "Did your kernel enable CONFIG_IO_STRICT_DEVMEM?\n"); + if (map_log_level(0, false) >= LOG_DEBUG) { + fprintf(stderr, "%s failed to map. ", dev->name); + fprintf(stderr, "Did your kernel enable CONFIG_IO_STRICT_DEVMEM?\n"); + } membase = NULL; } @@ -4610,7 +5255,7 @@ static int show_registers(int argc, char **argv, struct command *cmd, struct plu enum nvme_print_flags flags; struct nvme_dev *dev; - bool fabrics = true; + bool fabrics = false; nvme_root_t r; void *bar; int err; @@ -4641,16 +5286,13 @@ static int show_registers(int argc, char **argv, struct command *cmd, struct plu goto close_dev; if (cfg.human_readable) flags |= VERBOSE; - - err = nvme_get_properties(dev_fd(dev), &bar); - if (err) { - bar = mmap_registers(r, dev); - fabrics = false; - if (bar) - err = 0; + bar = mmap_registers(r, dev); + if (!bar) { + err = nvme_get_properties(dev_fd(dev), &bar); + if (!bar) + goto close_dev; + fabrics = true; } - if (!bar) - goto close_dev; nvme_show_ctrl_registers(bar, fabrics, flags); if (fabrics) @@ -4794,14 +5436,12 @@ static int format(int argc, char **argv, struct command *cmd, struct plugin *plu "given device. Can erase all data in namespace (user "\ "data erase) or delete data encryption key if specified. "\ "Can also be used to change LBAF to change the namespaces reported physical block format."; - const char *namespace_id = "identifier of desired namespace"; const char *lbaf = "LBA format to apply (required)"; const char *ses = "[0-2]: secure erase"; const char *pil = "[0-1]: protection info location last/first 8 bytes of metadata"; const char *pi = "[0-3]: protection info off/Type 1/Type 2/Type 3"; const char *ms = "[0-1]: extended format off/on"; const char *reset = "Automatically reset the controller after successful format"; - const char *timeout = "timeout value, in milliseconds"; const char *bs = "target block size"; const char *force = "The \"I know what I'm doing\" flag, skip confirmation before sending command"; struct nvme_id_ns ns; @@ -4838,7 +5478,7 @@ static int format(int argc, char **argv, struct command *cmd, struct plugin *plu }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), OPT_UINT("timeout", 't', &cfg.timeout, timeout), OPT_BYTE("lbaf", 'l', &cfg.lbaf, lbaf), OPT_BYTE("ses", 's', &cfg.ses, ses), @@ -5066,14 +5706,11 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin "for each Feature are vendor-specific and may not be modified."\ "Use get-feature to determine which Features are supported by "\ "the controller and are saveable/changeable."; - const char *namespace_id = "desired namespace"; const char *feature_id = "feature identifier (required)"; - const char *data_len = "buffer length if data required"; const char *data = "optional file for feature data (default stdin)"; const char *value = "new value of feature (required)"; const char *cdw12 = "feature cdw12, if used"; const char *save = "specifies that the controller shall save the attribute"; - const char *uuid_index = "specify uuid index"; struct nvme_dev *dev; int err; __u32 result; @@ -5102,12 +5739,12 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_desired), OPT_BYTE("feature-id", 'f', &cfg.feature_id, feature_id), OPT_SUFFIX("value", 'v', &cfg.value, value), OPT_UINT("cdw12", 'c', &cfg.cdw12, cdw12), - OPT_BYTE("uuid-index", 'U', &cfg.uuid_index, uuid_index), - OPT_UINT("data-len", 'l', &cfg.data_len, data_len), + OPT_BYTE("uuid-index", 'U', &cfg.uuid_index, uuid_index_specify), + OPT_UINT("data-len", 'l', &cfg.data_len, buf_len), OPT_FILE("data", 'd', &cfg.file, data), OPT_FLAG("save", 's', &cfg.save, save), OPT_END() @@ -5242,11 +5879,7 @@ static int sec_send(int argc, char **argv, struct command *cmd, struct plugin *p "associates Security Sends (security-send) and Security Receives "\ "(security-recv)."; const char *file = "transfer payload"; - const char *secp = "security protocol (cf. SPC-4)"; - const char *spsp = "security-protocol-specific (cf. SPC-4)"; const char *tl = "transfer length (cf. SPC-4)"; - const char *namespace_id = "desired namespace"; - const char *nssf = "NVMe Security Specific Field"; int err, sec_fd = STDIN_FILENO; struct nvme_dev *dev; void *sec_buf; @@ -5271,7 +5904,7 @@ static int sec_send(int argc, char **argv, struct command *cmd, struct plugin *p }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_desired), OPT_FILE("file", 'f', &cfg.file, file), OPT_BYTE("nssf", 'N', &cfg.nssf, nssf), OPT_BYTE("secp", 'p', &cfg.secp, secp), @@ -5331,7 +5964,6 @@ static int sec_send(int argc, char **argv, struct command *cmd, struct plugin *p struct nvme_security_send_args args = { .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .nssf = cfg.nssf, .spsp0 = cfg.spsp & 0xff, @@ -5343,7 +5975,9 @@ static int sec_send(int argc, char **argv, struct command *cmd, struct plugin *p .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, .result = NULL, }; - err = nvme_security_send(&args); + + err = nvme_cli_security_send(dev, &args); + if (err < 0) fprintf(stderr, "security-send: %s\n", nvme_strerror(errno)); else if (err != 0) @@ -5365,15 +5999,8 @@ static int dir_send(int argc, char **argv, struct command *cmd, struct plugin *p { const char *desc = "Set directive parameters of the "\ "specified directive type."; - const char *raw = "show directive in binary format"; - const char *namespace_id = "identifier of desired namespace"; - const char *data_len = "buffer len (if) data is returned"; - const char *dtype = "directive type"; - const char *dspec = "directive specification associated with directive type"; - const char *doper = "directive operation"; const char *endir = "directive enable"; const char *ttype = "target directive type to be enabled/disabled"; - const char *human_readable = "show directive in readable format"; const char *input = "write/send file (default stdin)"; struct nvme_dev *dev; __u32 result; @@ -5409,15 +6036,15 @@ static int dir_send(int argc, char **argv, struct command *cmd, struct plugin *p }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), - OPT_UINT("data-len", 'l', &cfg.data_len, data_len), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), + OPT_UINT("data-len", 'l', &cfg.data_len, buf_len), OPT_BYTE("dir-type", 'D', &cfg.dtype, dtype), OPT_BYTE("target-dir", 'T', &cfg.ttype, ttype), - OPT_SHRT("dir-spec", 'S', &cfg.dspec, dspec), + OPT_SHRT("dir-spec", 'S', &cfg.dspec, dspec_w_dtype), OPT_BYTE("dir-oper", 'O', &cfg.doper, doper), OPT_SHRT("endir", 'e', &cfg.endir, endir), - OPT_FLAG("human-readable",'H', &cfg.human_readable, human_readable), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("human-readable",'H', &cfg.human_readable, human_readable_directive), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_directive), OPT_FILE("input-file", 'i', &cfg.file, input), OPT_END() }; @@ -5532,9 +6159,6 @@ static int write_uncor(int argc, char **argv, struct command *cmd, struct plugin { const char *desc = "The Write Uncorrectable command is used to set a "\ "range of logical blocks to invalid."; - const char *namespace_id = "desired namespace"; - const char *start_block = "64-bit LBA of first block to access"; - const char *block_count = "number of blocks (zeroes based) on device to access"; struct nvme_dev *dev; int err; @@ -5551,7 +6175,7 @@ static int write_uncor(int argc, char **argv, struct command *cmd, struct plugin }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_desired), OPT_SUFFIX("start-block", 's', &cfg.start_block, start_block), OPT_SHRT("block-count", 'c', &cfg.block_count, block_count), OPT_END() @@ -5621,7 +6245,7 @@ static int invalid_tags(__u64 storage_tag, __u64 ref_tag, __u8 sts, __u8 pif) if (result) fprintf(stderr, "Reference tag larger than allowed by PIF\n"); - + return result; } @@ -5636,16 +6260,6 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi const char *desc = "The Write Zeroes command is used to set a "\ "range of logical blocks to zero."; - const char *namespace_id = "desired namespace"; - const char *start_block = "64-bit LBA of first block to access"; - const char *block_count = "number of blocks (zeroes based) on device to access"; - const char *limited_retry = "limit media access attempts"; - const char *force_unit_access = "force device to commit data before command completes"; - const char *prinfo = "PI and check field"; - const char *ref_tag = "reference tag for end-to-end PI"; - const char *app_tag_mask = "app tag mask for end-to-end PI"; - const char *app_tag = "app tag for end-to-end PI"; - const char *storage_tag = "storage tag for end-to-end PI"; const char *deac = "Set DEAC bit, requesting controller to deallocate specified logical blocks"; const char *storage_tag_check = "This bit specifies the Storage Tag field shall be checked as "\ "part of end-to-end data protection processing"; @@ -5681,7 +6295,7 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_desired), OPT_SUFFIX("start-block", 's', &cfg.start_block, start_block), OPT_SHRT("block-count", 'c', &cfg.block_count, block_count), OPT_FLAG("deac", 'd', &cfg.deac, deac), @@ -5723,12 +6337,12 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi } err = nvme_cli_identify_ns(dev, cfg.namespace_id, &ns); - if (err) { - nvme_show_status(err); - goto close_dev; - } else if (err < 0) { + if (err < 0) { fprintf(stderr, "identify namespace: %s\n", nvme_strerror(errno)); goto close_dev; + } else if (err) { + nvme_show_status(err); + goto close_dev; } err = nvme_identify_ns_csi(dev_fd(dev), cfg.namespace_id, 0, @@ -5736,7 +6350,7 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi if (!err) { nvme_id_ns_flbas_to_lbaf_inuse(ns.flbas, &lba_index); sts = nvm_ns.elbaf[lba_index] & NVME_NVM_ELBAF_STS_MASK; - pif = (nvm_ns.elbaf[lba_index] & NVME_NVM_ELBAF_PIF_MASK) >> 7; + pif = (nvm_ns.elbaf[lba_index] & NVME_NVM_ELBAF_PIF_MASK) >> 7; } if (invalid_tags(cfg.storage_tag, cfg.ref_tag, sts, pif)) { @@ -5780,7 +6394,6 @@ static int dsm(int argc, char **argv, struct command *cmd, struct plugin *plugin "indicate attributes for ranges of logical blocks. This includes attributes "\ "for discarding unused blocks, data read and write frequency, access size, and other "\ "information that may be used to optimize performance and reliability."; - const char *namespace_id = "identifier of desired namespace"; const char *blocks = "Comma separated list of the number of blocks in each range"; const char *starting_blocks = "Comma separated list of the starting block in each range"; const char *context_attrs = "Comma separated list of the context attributes in each range"; @@ -5820,7 +6433,7 @@ static int dsm(int argc, char **argv, struct command *cmd, struct plugin *plugin }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), OPT_LIST("ctx-attrs", 'a', &cfg.ctx_attrs, context_attrs), OPT_LIST("blocks", 'b', &cfg.blocks, blocks), OPT_LIST("slbs", 's', &cfg.slbas, starting_blocks), @@ -5887,7 +6500,6 @@ static int copy(int argc, char **argv, struct command *cmd, struct plugin *plugi "single consecutive destination logical block " "range."; - const char *d_nsid = "identifier of desired namespace"; const char *d_sdlba = "64-bit addr of first destination logical block"; const char *d_slbas = "64-bit addr of first block per range (comma-separated list)"; const char *d_nlbs = "number of blocks per range (comma-separated list, zeroes-based values)"; @@ -5965,7 +6577,7 @@ static int copy(int argc, char **argv, struct command *cmd, struct plugin *plugi }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, d_nsid), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), OPT_SUFFIX("sdlba", 'd', &cfg.sdlba, d_sdlba), OPT_LIST("slbs", 's', &cfg.slbas, d_slbas), OPT_LIST("blocks", 'b', &cfg.nlbs, d_nlbs), @@ -5991,7 +6603,7 @@ static int copy(int argc, char **argv, struct command *cmd, struct plugin *plugi nb = argconfig_parse_comma_sep_array_short(cfg.nlbs, nlbs, ARRAY_SIZE(nlbs)); ns = argconfig_parse_comma_sep_array_long(cfg.slbas, slbas, ARRAY_SIZE(slbas)); - + if (cfg.format == 0) nrts = argconfig_parse_comma_sep_array(cfg.eilbrts, (int *)eilbrts.f0, ARRAY_SIZE(eilbrts.f0)); else if (cfg.format == 1) @@ -6068,7 +6680,6 @@ static int flush(int argc, char **argv, struct command *cmd, struct plugin *plug "finished before the flush was submitted. Additional data may also be "\ "flushed by the controller, from any namespace, depending on controller and "\ "associated namespace status."; - const char *namespace_id = "identifier of desired namespace"; struct nvme_dev *dev; int err; @@ -6081,7 +6692,7 @@ static int flush(int argc, char **argv, struct command *cmd, struct plugin *plug }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), OPT_END() }; @@ -6118,12 +6729,8 @@ static int resv_acquire(int argc, char **argv, struct command *cmd, struct plugi "with that namespace. Namespace reservation will abort with "\ "status Reservation Conflict if the given namespace is "\ "already reserved."; - const char *namespace_id = "identifier of desired namespace"; - const char *crkey = "current reservation key"; const char *prkey = "pre-empt reservation key"; - const char *rtype = "reservation type"; const char *racqa = "reservation acquire action"; - const char *iekey = "ignore existing res. key"; struct nvme_dev *dev; int err; @@ -6146,7 +6753,7 @@ static int resv_acquire(int argc, char **argv, struct command *cmd, struct plugi }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), OPT_SUFFIX("crkey", 'c', &cfg.crkey, crkey), OPT_SUFFIX("prkey", 'p', &cfg.prkey, prkey), OPT_BYTE("rtype", 't', &cfg.rtype, rtype), @@ -6203,9 +6810,6 @@ static int resv_register(int argc, char **argv, struct command *cmd, struct plug const char *desc = "Register, de-register, or "\ "replace a controller's reservation on a given namespace. "\ "Only one reservation at a time is allowed on any namespace."; - const char *namespace_id = "identifier of desired namespace"; - const char *crkey = "current reservation key"; - const char *iekey = "ignore existing res. key"; const char *nrkey = "new reservation key"; const char *rrega = "reservation registration action"; const char *cptpl = "change persistence through power loss setting"; @@ -6230,7 +6834,7 @@ static int resv_register(int argc, char **argv, struct command *cmd, struct plug }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), OPT_SUFFIX("crkey", 'c', &cfg.crkey, crkey), OPT_SUFFIX("nrkey", 'k', &cfg.nrkey, nrkey), OPT_BYTE("rrega", 'r', &cfg.rrega, rrega), @@ -6298,10 +6902,6 @@ static int resv_release(int argc, char **argv, struct command *cmd, struct plugi "effect. If the reservation type is not Write Exclusive or "\ "Exclusive Access, all registrants on the namespace except "\ "the issuing controller are notified."; - const char *namespace_id = "desired namespace"; - const char *crkey = "current reservation key"; - const char *iekey = "ignore existing res. key"; - const char *rtype = "reservation type"; const char *rrela = "reservation release action"; struct nvme_dev *dev; int err; @@ -6323,7 +6923,7 @@ static int resv_release(int argc, char **argv, struct command *cmd, struct plugi }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_desired), OPT_SUFFIX("crkey", 'c', &cfg.crkey, crkey), OPT_BYTE("rtype", 't', &cfg.rtype, rtype), OPT_BYTE("rrela", 'a', &cfg.rrela, rrela), @@ -6380,10 +6980,8 @@ static int resv_report(int argc, char **argv, struct command *cmd, struct plugin "status of a given namespace. Namespace Reservation Status "\ "depends on the number of controllers registered for that "\ "namespace."; - const char *namespace_id = "identifier of desired namespace"; const char *numd = "number of dwords to transfer"; const char *eds = "request extended data structure"; - const char *raw = "dump output in binary format"; struct nvme_resv_status *status; enum nvme_print_flags flags; @@ -6407,11 +7005,11 @@ static int resv_report(int argc, char **argv, struct command *cmd, struct plugin }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), OPT_UINT("numd", 'd', &cfg.numd, numd), OPT_FLAG("eds", 'e', &cfg.eds, eds), OPT_FMT("output-format", 'o', &cfg.output_format, output_format), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_dump), OPT_END() }; @@ -6498,28 +7096,18 @@ static int submit_io(int opcode, char *command, const char *desc, __u8 lba_index, ms = 0, sts = 0, pif = 0; struct nvme_dev *dev; - const char *namespace_id = "Identifier of desired namespace"; - const char *start_block = "64-bit addr of first block to access"; - const char *block_count = "number of blocks (zeroes based) on device to access"; + const char *start_block_addr = "64-bit addr of first block to access"; const char *data_size = "size of data in bytes"; const char *metadata_size = "size of metadata in bytes"; - const char *ref_tag = "reference tag for end-to-end PI"; const char *data = "data file"; const char *metadata = "metadata file"; - const char *prinfo = "PI and check field"; - const char *app_tag_mask = "app tag mask (for end to end PI)"; - const char *app_tag = "app tag (for end to end PI)"; - const char *limited_retry = "limit num. media access attempts"; - const char *latency = "output latency statistics"; - const char *force_unit_access = "force device to commit data before command completes"; + const char *limited_retry_num = "limit num. media access attempts"; const char *show = "show command before sending"; - const char *dry = "show command instead of sending"; - const char *dtype = "directive type (for write-only)"; + const char *dtype_for_write = "directive type (for write-only)"; const char *dspec = "directive specific (for write-only)"; const char *dsm = "dataset management attributes (lower 8 bits)"; const char *storage_tag_check = "This bit specifies the Storage Tag field shall be " \ "checked as part of end-to-end data protection processing"; - const char *storage_tag = "storage tag for end-to-end PI"; const char *force = "The \"I know what I'm doing\" flag, do not enforce exclusive access for write"; struct config { @@ -6573,8 +7161,8 @@ static int submit_io(int opcode, char *command, const char *desc, }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), - OPT_SUFFIX("start-block", 's', &cfg.start_block, start_block), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), + OPT_SUFFIX("start-block", 's', &cfg.start_block, start_block_addr), OPT_SHRT("block-count", 'c', &cfg.block_count, block_count), OPT_SUFFIX("data-size", 'z', &cfg.data_size, data_size), OPT_SUFFIX("metadata-size", 'y', &cfg.metadata_size, metadata_size), @@ -6585,10 +7173,10 @@ static int submit_io(int opcode, char *command, const char *desc, OPT_SHRT("app-tag-mask", 'm', &cfg.app_tag_mask, app_tag_mask), OPT_SHRT("app-tag", 'a', &cfg.app_tag, app_tag), OPT_SUFFIX("storage-tag", 'g', &cfg.storage_tag, storage_tag), - OPT_FLAG("limited-retry", 'l', &cfg.limited_retry, limited_retry), + OPT_FLAG("limited-retry", 'l', &cfg.limited_retry, limited_retry_num), OPT_FLAG("force-unit-access", 'f', &cfg.force_unit_access, force_unit_access), OPT_FLAG("storage-tag-check", 'C', &cfg.storage_tag_check, storage_tag_check), - OPT_BYTE("dir-type", 'T', &cfg.dtype, dtype), + OPT_BYTE("dir-type", 'T', &cfg.dtype, dtype_for_write), OPT_SHRT("dir-spec", 'S', &cfg.dspec, dspec), OPT_BYTE("dsm", 'D', &cfg.dsmgmt, dsm), OPT_FLAG("show-command", 'v', &cfg.show, show), @@ -6715,7 +7303,7 @@ static int submit_io(int opcode, char *command, const char *desc, &nvm_ns); if (!err) { sts = nvm_ns.elbaf[lba_index] & NVME_NVM_ELBAF_STS_MASK; - pif = (nvm_ns.elbaf[lba_index] & NVME_NVM_ELBAF_PIF_MASK) >> 7; + pif = (nvm_ns.elbaf[lba_index] & NVME_NVM_ELBAF_PIF_MASK) >> 7; } mbuffer_size = ((unsigned long long)cfg.block_count + 1) * ms; @@ -6873,16 +7461,7 @@ static int verify_cmd(int argc, char **argv, struct command *cmd, struct plugin int err; const char *desc = "Verify specified logical blocks on the given device."; - const char *namespace_id = "desired namespace"; - const char *start_block = "64-bit LBA of first block to access"; - const char *block_count = "number of blocks (zeroes based) on device to access"; - const char *limited_retry = "limit media access attempts"; - const char *force_unit_access = "force device to commit cached data before performing the verify operation"; - const char *prinfo = "PI and check field"; - const char *ref_tag = "reference tag for end-to-end PI"; - const char *app_tag_mask = "app tag mask for end-to-end PI"; - const char *app_tag = "app tag for end-to-end PI"; - const char *storage_tag = "storage tag for end-to-end PI"; + const char *force_unit_access_verify = "force device to commit cached data before performing the verify operation"; const char *storage_tag_check = "This bit specifies the Storage Tag field shall "\ "be checked as part of Verify operation"; @@ -6915,11 +7494,11 @@ static int verify_cmd(int argc, char **argv, struct command *cmd, struct plugin }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_desired), OPT_SUFFIX("start-block", 's', &cfg.start_block, start_block), OPT_SHRT("block-count", 'c', &cfg.block_count, block_count), OPT_FLAG("limited-retry", 'l', &cfg.limited_retry, limited_retry), - OPT_FLAG("force-unit-access", 'f', &cfg.force_unit_access, force_unit_access), + OPT_FLAG("force-unit-access", 'f', &cfg.force_unit_access, force_unit_access_verify), OPT_BYTE("prinfo", 'p', &cfg.prinfo, prinfo), OPT_SUFFIX("ref-tag", 'r', &cfg.ref_tag, ref_tag), OPT_SHRT("app-tag", 'a', &cfg.app_tag, app_tag), @@ -6955,12 +7534,12 @@ static int verify_cmd(int argc, char **argv, struct command *cmd, struct plugin } err = nvme_cli_identify_ns(dev, cfg.namespace_id, &ns); - if (err) { - nvme_show_status(err); - goto close_dev; - } else if (err < 0) { + if (err < 0) { fprintf(stderr, "identify namespace: %s\n", nvme_strerror(errno)); goto close_dev; + } else if (err) { + nvme_show_status(err); + goto close_dev; } err = nvme_identify_ns_csi(dev_fd(dev), cfg.namespace_id, 0, @@ -7015,12 +7594,7 @@ static int sec_recv(int argc, char **argv, struct command *cmd, struct plugin *p "used. A Security Receive must follow a Security Send made with "\ "the same security protocol."; const char *size = "size of buffer (prints to stdout on success)"; - const char *secp = "security protocol (cf. SPC-4)"; - const char *spsp = "security-protocol-specific (cf. SPC-4)"; const char *al = "allocation length (cf. SPC-4)"; - const char *raw = "dump output in binary format"; - const char *namespace_id = "desired namespace"; - const char *nssf = "NVMe Security Specific Field"; struct nvme_dev *dev; void *sec_buf = NULL; int err; @@ -7046,13 +7620,13 @@ static int sec_recv(int argc, char **argv, struct command *cmd, struct plugin *p }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_desired), OPT_UINT("size", 'x', &cfg.size, size), OPT_BYTE("nssf", 'N', &cfg.nssf, nssf), OPT_BYTE("secp", 'p', &cfg.secp, secp), OPT_SHRT("spsp", 's', &cfg.spsp, spsp), OPT_UINT("al", 't', &cfg.al, al), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_dump), OPT_END() }; @@ -7071,7 +7645,6 @@ static int sec_recv(int argc, char **argv, struct command *cmd, struct plugin *p struct nvme_security_receive_args args = { .args_size = sizeof(args), - .fd = dev_fd(dev), .nsid = cfg.namespace_id, .nssf = cfg.nssf, .spsp0 = cfg.spsp & 0xff, @@ -7083,7 +7656,9 @@ static int sec_recv(int argc, char **argv, struct command *cmd, struct plugin *p .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, .result = NULL, }; - err = nvme_security_receive(&args); + + err = nvme_cli_security_receive(dev, &args); + if (err < 0) fprintf(stderr, "security receive: %s\n", nvme_strerror(errno)); else if (err != 0) @@ -7108,7 +7683,6 @@ static int get_lba_status(int argc, char **argv, struct command *cmd, struct plugin *plugin) { const char *desc = "Information about potentially unrecoverable LBAs."; - const char *namespace_id = "Desired Namespace"; const char *slba = "Starting LBA(SLBA) in 64-bit address of the first"\ " logical block addressed by this command"; const char *mndw = "Maximum Number of Dwords(MNDW) specifies maximum"\ @@ -7118,7 +7692,6 @@ static int get_lba_status(int argc, char **argv, struct command *cmd, " Status Descriptors to return."; const char *rl = "Range Length(RL) specifies the length of the range"\ " of contiguous LBAs beginning at SLBA"; - const char *timeout = "timeout value, in milliseconds"; enum nvme_print_flags flags; unsigned long buf_len; @@ -7147,7 +7720,7 @@ static int get_lba_status(int argc, char **argv, struct command *cmd, }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_desired), OPT_SUFFIX("start-lba", 's', &cfg.slba, slba), OPT_UINT("max-dw", 'm', &cfg.mndw, mndw), OPT_BYTE("action", 'a', &cfg.atype, atype), @@ -7286,14 +7859,7 @@ static int dir_receive(int argc, char **argv, struct command *cmd, struct plugin { const char *desc = "Read directive parameters of the "\ "specified directive type."; - const char *raw = "show directive in binary format"; - const char *namespace_id = "identifier of desired namespace"; - const char *data_len = "buffer len (if) data is returned"; - const char *dtype = "directive type"; - const char *dspec = "directive specification associated with directive type"; - const char *doper = "directive operation"; const char *nsr = "namespace stream requested"; - const char *human_readable = "show directive in readable format"; enum nvme_print_flags flags = NORMAL; struct nvme_dev *dev; @@ -7325,14 +7891,14 @@ static int dir_receive(int argc, char **argv, struct command *cmd, struct plugin }; OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), - OPT_UINT("data-len", 'l', &cfg.data_len, data_len), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired), + OPT_UINT("data-len", 'l', &cfg.data_len, buf_len), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_directive), OPT_BYTE("dir-type", 'D', &cfg.dtype, dtype), - OPT_SHRT("dir-spec", 'S', &cfg.dspec, dspec), + OPT_SHRT("dir-spec", 'S', &cfg.dspec, dspec_w_dtype), OPT_BYTE("dir-oper", 'O', &cfg.doper, doper), OPT_SHRT("req-resource", 'r', &cfg.nsr, nsr), - OPT_FLAG("human-readable",'H', &cfg.human_readable, human_readable), + OPT_FLAG("human-readable",'H', &cfg.human_readable, human_readable_directive), OPT_END() }; @@ -7534,11 +8100,9 @@ static int passthru(int argc, char **argv, bool admin, const char *opcode = "opcode (required)"; const char *cflags = "command flags"; const char *rsvd = "value for reserved field"; - const char *namespace_id = "desired namespace"; const char *data_len = "data I/O length (bytes)"; const char *metadata_len = "metadata seg. length (bytes)"; const char *metadata = "metadata input or output file"; - const char *timeout = "timeout value, in milliseconds"; const char *cdw2 = "command dword 2 value"; const char *cdw3 = "command dword 3 value"; const char *cdw10 = "command dword 10 value"; @@ -7548,13 +8112,10 @@ static int passthru(int argc, char **argv, bool admin, const char *cdw14 = "command dword 14 value"; const char *cdw15 = "command dword 15 value"; const char *input = "data input or output file"; - const char *raw_binary = "dump output in binary format"; const char *show = "print command before sending"; - const char *dry = "show command instead of sending"; const char *re = "set dataflow direction to receive"; const char *wr = "set dataflow direction to send"; const char *prefill = "prefill buffers with known byte-value, default 0"; - const char *latency = "output latency statistics"; int flags; int mode = S_IRUSR | S_IWUSR |S_IRGRP | S_IWGRP| S_IROTH; @@ -7625,7 +8186,7 @@ static int passthru(int argc, char **argv, bool admin, OPT_BYTE("flags", 'f', &cfg.flags, cflags), OPT_BYTE("prefill", 'p', &cfg.prefill, prefill), OPT_SHRT("rsvd", 'R', &cfg.rsvd, rsvd), - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_desired), OPT_UINT("data-len", 'l', &cfg.data_len, data_len), OPT_UINT("metadata-len", 'm', &cfg.metadata_len, metadata_len), OPT_UINT("timeout", 't', &cfg.timeout, timeout), @@ -7639,7 +8200,7 @@ static int passthru(int argc, char **argv, bool admin, OPT_UINT("cdw15", '9', &cfg.cdw15, cdw15), OPT_FILE("input-file", 'i', &cfg.input_file, input), OPT_FILE("metadata", 'M', &cfg.metadata, metadata), - OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_binary), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_dump), OPT_FLAG("show-command", 's', &cfg.show_command, show), OPT_FLAG("dry-run", 'd', &cfg.dry_run, dry), OPT_FLAG("read", 'r', &cfg.read, re), @@ -7750,7 +8311,7 @@ static int passthru(int argc, char **argv, bool admin, gettimeofday(&start_time, NULL); if (admin) - err = nvme_admin_passthru(dev_fd(dev), cfg.opcode, cfg.flags, + err = nvme_cli_admin_passthru(dev, cfg.opcode, cfg.flags, cfg.rsvd, cfg.namespace_id, cfg.cdw2, cfg.cdw3, cfg.cdw10, @@ -8271,8 +8832,7 @@ static int check_tls_key(int argc, char **argv, struct command *command, struct static int show_topology_cmd(int argc, char **argv, struct command *command, struct plugin *plugin) { - const char *desc = "Show the topolog\n"; - const char *verbose = "Increase output verbosity"; + const char *desc = "Show the topology\n"; const char *ranking = "Ranking order: namespace|ctrl"; enum nvme_print_flags flags; nvme_root_t r; diff --git a/nvme.h b/nvme.h index c13ca8e..1938afb 100644 --- a/nvme.h +++ b/nvme.h @@ -114,12 +114,6 @@ const char *nvme_strerror(int errnum); 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'; -} - /* nvme-print.c */ const char *nvme_select_to_string(int sel); diff --git a/plugin.c b/plugin.c index c05bb72..440054b 100644 --- a/plugin.c +++ b/plugin.c @@ -77,12 +77,12 @@ void general_help(struct plugin *plugin) usage(plugin); printf("\n"); - print_word_wrapped(prog->desc, 0, 0); + print_word_wrapped(prog->desc, 0, 0, stdout); printf("\n"); if (plugin->desc) { printf("\n"); - print_word_wrapped(plugin->desc, 0, 0); + print_word_wrapped(plugin->desc, 0, 0, stdout); printf("\n"); } diff --git a/plugins/fdp/fdp.c b/plugins/fdp/fdp.c new file mode 100644 index 0000000..9fef271 --- /dev/null +++ b/plugins/fdp/fdp.c @@ -0,0 +1,537 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "nvme.h" +#include "libnvme.h" +#include "nvme-print.h" + +#define CREATE_CMD +#include "fdp.h" + +static int fdp_configs(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + const char *desc = "Get Flexible Data Placement Configurations"; + const char *egid = "Endurance group identifier"; + const char *human_readable = "show log in readable format"; + const char *raw = "use binary output"; + + enum nvme_print_flags flags; + struct nvme_dev *dev; + struct nvme_fdp_config_log hdr; + void *log = NULL; + int err; + + struct config { + __u16 egid; + char *output_format; + bool human_readable; + bool raw_binary; + }; + + struct config cfg = { + .egid = 0, + .output_format = "normal", + .raw_binary = false, + }; + + OPT_ARGS(opts) = { + OPT_UINT("endgrp-id", 'e', &cfg.egid, egid), + OPT_FMT("output-format", 'o', &cfg.output_format, output_format), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = flags = validate_output_format(cfg.output_format); + if (flags < 0) + goto out; + + if (cfg.raw_binary) + flags = BINARY; + + if (cfg.human_readable) + flags |= VERBOSE; + + if (!cfg.egid) { + fprintf(stderr, "endurance group identifier required\n"); + err = -EINVAL; + goto out; + } + + err = nvme_get_log_fdp_configurations(dev->direct.fd, cfg.egid, 0, + sizeof(hdr), &hdr); + if (err) { + nvme_show_status(errno); + goto out; + } + + log = malloc(hdr.size); + if (!log) { + err = -ENOMEM; + goto out; + } + + err = nvme_get_log_fdp_configurations(dev->direct.fd, cfg.egid, 0, + hdr.size, log); + if (err) { + nvme_show_status(errno); + goto out; + } + + nvme_show_fdp_configs(log, hdr.size, flags); + +out: + dev_close(dev); + free(log); + + return err; +} + +static int fdp_usage(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "Get Flexible Data Placement Reclaim Unit Handle Usage"; + const char *egid = "Endurance group identifier"; + const char *raw = "use binary output"; + + enum nvme_print_flags flags; + struct nvme_dev *dev; + struct nvme_fdp_ruhu_log hdr; + size_t len; + void *log = NULL; + int err; + + struct config { + __u16 egid; + char *output_format; + bool raw_binary; + }; + + struct config cfg = { + .egid = 0, + .output_format = "normal", + .raw_binary = false, + }; + + OPT_ARGS(opts) = { + OPT_UINT("endgrp-id", 'e', &cfg.egid, egid), + OPT_FMT("output-format", 'o', &cfg.output_format, output_format), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = flags = validate_output_format(cfg.output_format); + if (flags < 0) + goto out; + + if (cfg.raw_binary) + flags = BINARY; + + err = nvme_get_log_reclaim_unit_handle_usage(dev->direct.fd, cfg.egid, + 0, sizeof(hdr), &hdr); + if (err) { + nvme_show_status(err); + goto out; + } + + len = sizeof(hdr) + le16_to_cpu(hdr.nruh) * sizeof(struct nvme_fdp_ruhu_desc); + log = malloc(len); + if (!log) { + err = -ENOMEM; + goto out; + } + + err = nvme_get_log_reclaim_unit_handle_usage(dev->direct.fd, cfg.egid, + 0, len, log); + if (err) { + nvme_show_status(err); + goto out; + } + + nvme_show_fdp_usage(log, len, flags); + +out: + dev_close(dev); + free(log); + + return err; +} + +static int fdp_stats(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "Get Flexible Data Placement Statistics"; + const char *egid = "Endurance group identifier"; + const char *raw = "use binary output"; + + enum nvme_print_flags flags; + struct nvme_dev *dev; + struct nvme_fdp_stats_log stats; + int err; + + struct config { + __u16 egid; + char *output_format; + bool raw_binary; + }; + + struct config cfg = { + .egid = 0, + .output_format = "normal", + .raw_binary = false, + }; + + OPT_ARGS(opts) = { + OPT_UINT("endgrp-id", 'e', &cfg.egid, egid), + OPT_FMT("output-format", 'o', &cfg.output_format, output_format), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = flags = validate_output_format(cfg.output_format); + if (flags < 0) + goto out; + + if (cfg.raw_binary) + flags = BINARY; + + memset(&stats, 0x0, sizeof(stats)); + + err = nvme_get_log_fdp_stats(dev->direct.fd, cfg.egid, 0, sizeof(stats), &stats); + if (err) { + nvme_show_status(err); + goto out; + } + + nvme_show_fdp_stats(&stats, flags); + +out: + dev_close(dev); + + return err; +} + +static int fdp_events(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "Get Flexible Data Placement Events"; + const char *egid = "Endurance group identifier"; + const char *host_events = "Get host events"; + const char *raw = "use binary output"; + + enum nvme_print_flags flags; + struct nvme_dev *dev; + struct nvme_fdp_events_log events; + int err; + + struct config { + __u16 egid; + bool host_events; + char *output_format; + bool raw_binary; + }; + + struct config cfg = { + .egid = 0, + .host_events = false, + .output_format = "normal", + .raw_binary = false, + }; + + OPT_ARGS(opts) = { + OPT_UINT("endgrp-id", 'e', &cfg.egid, egid), + OPT_FLAG("host-events", 'E', &cfg.host_events, host_events), + OPT_FMT("output-format", 'o', &cfg.output_format, output_format), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = flags = validate_output_format(cfg.output_format); + if (flags < 0) + goto out; + + if (cfg.raw_binary) + flags = BINARY; + + memset(&events, 0x0, sizeof(events)); + + err = nvme_get_log_fdp_events(dev->direct.fd, cfg.egid, + cfg.host_events, 0, sizeof(events), &events); + if (err) { + nvme_show_status(err); + goto out; + } + + nvme_show_fdp_events(&events, flags); + +out: + dev_close(dev); + + return err; +} + +static int fdp_status(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "Reclaim Unit Handle Status"; + const char *namespace_id = "Namespace identifier"; + const char *raw = "use binary output"; + + enum nvme_print_flags flags; + struct nvme_dev *dev; + struct nvme_fdp_ruh_status hdr; + size_t len; + void *buf = NULL; + int err = -1; + + struct config { + __u32 namespace_id; + char *output_format; + bool raw_binary; + }; + + struct config cfg = { + .output_format = "normal", + .raw_binary = false, + }; + + OPT_ARGS(opts) = { + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_FMT("output-format", 'o', &cfg.output_format, output_format), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = flags = validate_output_format(cfg.output_format); + if (flags < 0) + goto out; + + if (cfg.raw_binary) + flags = BINARY; + + if (!cfg.namespace_id) { + err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id); + if (err < 0) { + perror("get-namespace-id"); + goto out; + } + } + + err = nvme_fdp_reclaim_unit_handle_status(dev_fd(dev), + cfg.namespace_id, sizeof(hdr), &hdr); + if (err) { + nvme_show_status(err); + goto out; + } + + len = le16_to_cpu(hdr.nruhsd) * sizeof(struct nvme_fdp_ruh_status_desc); + buf = malloc(len); + if (!buf) { + err = -ENOMEM; + goto out; + } + + err = nvme_fdp_reclaim_unit_handle_status(dev_fd(dev), + cfg.namespace_id, len, buf); + if (err) { + nvme_show_status(err); + goto out; + } + + nvme_show_fdp_ruh_status(buf, len, flags); + +out: + free(buf); + dev_close(dev); + + return err; +} + +static int fdp_update(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "Reclaim Unit Handle Update"; + const char *namespace_id = "Namespace identifier"; + const char *_pids = "Comma-separated list of placement identifiers to update"; + + struct nvme_dev *dev; + unsigned short pids[256]; + __u16 buf[256]; + int npids; + int err = -1; + + struct config { + __u32 namespace_id; + char *pids; + }; + + struct config cfg = { + .pids = "", + }; + + OPT_ARGS(opts) = { + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_LIST("pids", 'p', &cfg.pids, _pids), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + npids = argconfig_parse_comma_sep_array_short(cfg.pids, pids, ARRAY_SIZE(pids)); + if (npids < 0) { + perror("could not parse pids"); + err = -EINVAL; + goto out; + } else if (npids == 0) { + fprintf(stderr, "no placement identifiers set\n"); + err = -EINVAL; + goto out; + } + + if (!cfg.namespace_id) { + err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id); + if (err < 0) { + perror("get-namespace-id"); + goto out; + } + } + + for (unsigned int i = 0; i < npids; i++) { + buf[i] = cpu_to_le16(pids[i]); + } + + err = nvme_fdp_reclaim_unit_handle_update(dev_fd(dev), cfg.namespace_id, npids, buf); + if (err) { + nvme_show_status(err); + goto out; + } + + printf("update: Success\n"); + +out: + dev_close(dev); + + return err; +} + +static int fdp_set_events(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "Enable or disable FDP events"; + const char *namespace_id = "Namespace identifier"; + const char *enable = "Enable/disable event"; + const char *event_types = "Comma-separated list of event types"; + const char *ph = "Placement Handle"; + + struct nvme_dev *dev; + int err = -1; + unsigned short evts[255]; + int nev; + __u8 buf[255]; + + struct config { + __u32 namespace_id; + __u16 ph; + char *event_types; + bool enable; + }; + + struct config cfg = { + .enable = false, + }; + + OPT_ARGS(opts) = { + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id), + OPT_SHRT("placement-handle", 'p', &cfg.ph, ph), + OPT_FLAG("enable", 'e', &cfg.enable, enable), + OPT_LIST("event-types", 't', &cfg.event_types, event_types), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + nev = argconfig_parse_comma_sep_array_short(cfg.event_types, evts, ARRAY_SIZE(evts)); + if (nev < 0) { + perror("could not parse event types"); + err = -EINVAL; + goto out; + } else if (nev == 0) { + fprintf(stderr, "no event types set\n"); + err = -EINVAL; + goto out; + } else if (nev > 255) { + fprintf(stderr, "too many event types (max 255)\n"); + err = -EINVAL; + goto out; + } + + if (!cfg.namespace_id) { + err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id); + if (err < 0) { + if (errno != ENOTTY) { + fprintf(stderr, "get-namespace-id: %s\n", nvme_strerror(errno)); + goto out; + } + + cfg.namespace_id = NVME_NSID_ALL; + } + } + + for (unsigned int i = 0; i < nev; i++) { + buf[i] = (__u8)evts[i]; + } + + struct nvme_set_features_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .fid = NVME_FEAT_FID_FDP_EVENTS, + .nsid = cfg.namespace_id, + .cdw11 = (nev << 16) | cfg.ph, + .cdw12 = cfg.enable ? 0x1 : 0x0, + .data_len = sizeof(buf), + .data = buf, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + + err = nvme_set_features(&args); + if (err) { + nvme_show_status(err); + goto out; + } + + printf("set-events: Success\n"); + +out: + dev_close(dev); + + return err; +} diff --git a/plugins/fdp/fdp.h b/plugins/fdp/fdp.h new file mode 100644 index 0000000..f162b32 --- /dev/null +++ b/plugins/fdp/fdp.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#undef CMD_INC_FILE +#define CMD_INC_FILE plugins/fdp/fdp + +#if !defined(FDP_NVME) || defined(CMD_HEADER_MULTI_READ) +#define FDP_NVME + +#include "cmd.h" + +PLUGIN(NAME("fdp", "Manage Flexible Data Placement enabled devices", NVME_VERSION), + COMMAND_LIST( + ENTRY("configs", "List configurations", fdp_configs) + ENTRY("usage", "Show reclaim unit handle usage", fdp_usage) + ENTRY("stats", "Show statistics", fdp_stats) + ENTRY("events", "List events affecting reclaim units and media usage", fdp_events) + ENTRY("status", "Show reclaim unit handle status", fdp_status) + ENTRY("update", "Update a reclaim unit handle", fdp_update) + ENTRY("set-events", "Enabled or disable events", fdp_set_events) + ) +); + +#endif + +#include "define_cmd.h" diff --git a/plugins/inspur/inspur-nvme.c b/plugins/inspur/inspur-nvme.c new file mode 100644 index 0000000..9d7bb4d --- /dev/null +++ b/plugins/inspur/inspur-nvme.c @@ -0,0 +1,235 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "nvme.h" +#include "libnvme.h" +#include "plugin.h" +#include "nvme-print.h" +#include "util/suffix.h" + +#define CREATE_CMD +#include "inspur-nvme.h" +#include "inspur-utils.h" + +void show_r1_vendor_log(r1_cli_vendor_log_t *vendorlog) +{ + int i = 0; + + if (vendorlog->device_state == 0) { + printf("device_state : [healthy]\n"); + } else { + printf("device_state : [warning]\n"); + } + + printf("commit id : %s\n", vendorlog->commit_id); + printf("mcu data id(mcu) : 0x%x\n", le32_to_cpu(vendorlog->mcu_data_id)); + printf("power_info(mcu) : %u mW\n", le32_to_cpu(vendorlog->power_info)); + printf("voltage_info(mcu) : %u mV\n", le32_to_cpu(vendorlog->voltage_info)); + printf("current_info(mcu) : %u mA\n", le32_to_cpu(vendorlog->current_info)); + printf("history max_power(mcu) : %u mW\n", le32_to_cpu(vendorlog->max_power)); + printf("disk_max_temper(mcu) : %d C\n", le32_to_cpu(vendorlog->disk_max_temper) - 273); + printf("disk_overtemper_cout(mcu) : %u\n", le32_to_cpu(vendorlog->disk_overtemper_cout)); + printf("ctrl_max_temper(mcu) : %d C\n", le32_to_cpu(vendorlog->ctrl_max_temper) - 273); + printf("ctrl_overtemper_cout(mcu) : %u\n", le32_to_cpu(vendorlog->ctrl_overtemper_cout)); + printf("nand_max_temper(mcu) : %d C\n", le32_to_cpu(vendorlog->nand_max_temper) - 273); + printf("nand_overtemper_cout(mcu) : %u\n", le32_to_cpu(vendorlog->nand_overtemper_cout)); + + for (i = 0; i < 4; i++) { + printf("temperature[%d](mcu) : %d C\n", i, le32_to_cpu(vendorlog->current_temp[i]) - 273); + } + + printf("CAP Time from 32v to 27v(mcu) : %u ms\n", le32_to_cpu(vendorlog->cap_transtime.cap_trans_time1)); + printf("CAP Time from 27v to 10v(mcu) : %u ms\n", le32_to_cpu(vendorlog->cap_transtime.cap_trans_time2)); + printf("cap_health_state(mcu) : %u\n", le32_to_cpu(vendorlog->cap_health_state)); + printf("warning bit(mcu) : 0x%x%08x\n", le32_to_cpu(vendorlog->detail_warning[1]), + le32_to_cpu(vendorlog->detail_warning[0])); + printf("-->high_format_fail : %x\n", vendorlog->detail_warning_bit.high_format_fail); + printf("-->low_format_fail : %x\n", vendorlog->detail_warning_bit.low_format_fail); + printf("-->current sensor : %x\n", vendorlog->detail_warning_bit.self_test_fail1); + printf("-->nand temp sensor : %x\n", vendorlog->detail_warning_bit.self_test_fail2); + printf("-->board temp sensor : %x\n", vendorlog->detail_warning_bit.self_test_fail3); + printf("-->cntl temp sensor : %x\n", vendorlog->detail_warning_bit.self_test_fail4); + printf("-->cap_timer_test_fail : %x\n", vendorlog->detail_warning_bit.capacitance_test_fail); + printf("-->readOnly_after_rebuild : %x\n", vendorlog->detail_warning_bit.readOnly_after_rebuild); + printf("-->firmware_loss : %x\n", vendorlog->detail_warning_bit.firmware_loss); + printf("-->cap_self_test : %x\n", vendorlog->detail_warning_bit.cap_unsupply); + printf("-->spare_space_warning : %x\n", vendorlog->detail_warning_bit.spare_space_warning); + printf("-->lifetime_warning : %x\n", vendorlog->detail_warning_bit.lifetime_warning); + printf("-->temp_high_warning : %x\n", vendorlog->detail_warning_bit.temp_high_warning); + printf("-->temp_low_warning : %x\n", vendorlog->detail_warning_bit.temp_low_warning); + printf("-->mcu_disable(mcu) : %x\n", vendorlog->detail_warning_bit.mcu_disable); + printf("warning history bit(mcu) : 0x%x%08x\n", le32_to_cpu(vendorlog->detail_warning_his[1]), + le32_to_cpu(vendorlog->detail_warning_his[0])); + printf("-->high_format_fail : %x\n", vendorlog->detail_warning_his_bit.high_format_fail); + printf("-->low_format_fail : %x\n", vendorlog->detail_warning_his_bit.low_format_fail); + printf("-->current sensor : %x\n", vendorlog->detail_warning_his_bit.self_test_fail1); + printf("-->nand temp sensor : %x\n", vendorlog->detail_warning_his_bit.self_test_fail2); + printf("-->board temp sensor : %x\n", vendorlog->detail_warning_his_bit.self_test_fail3); + printf("-->cntl temp sensor : %x\n", vendorlog->detail_warning_his_bit.self_test_fail4); + printf("-->cap_timer_test_fail : %x\n", vendorlog->detail_warning_his_bit.capacitance_test_fail); + printf("-->readOnly_after_rebuild : %x\n", vendorlog->detail_warning_his_bit.readOnly_after_rebuild); + printf("-->firmware_loss : %x\n", vendorlog->detail_warning_his_bit.firmware_loss); + printf("-->cap_self_test : %x\n", vendorlog->detail_warning_his_bit.cap_unsupply); + printf("-->spare_space_warning : %x\n", vendorlog->detail_warning_his_bit.spare_space_warning); + printf("-->lifetime_warning : %x\n", vendorlog->detail_warning_his_bit.lifetime_warning); + printf("-->temp_high_warning : %x\n", vendorlog->detail_warning_his_bit.temp_high_warning); + printf("-->temp_low_warning : %x\n", vendorlog->detail_warning_his_bit.temp_low_warning); + printf("-->mcu_disable(mcu) : %x\n", vendorlog->detail_warning_his_bit.mcu_disable); + + for (i = 0; i < 4; i++) { + printf("[%d]nand_bytes_written : %" PRIu64 " GB\n", i, le64_to_cpu(vendorlog->nand_bytes_written[i])); + } + + for (i = 0; i < 4; i++) { + printf("[%d]io_apptag_err : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_apptag_err)); + printf("[%d]io_guard_err : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_guard_err)); + printf("[%d]io_reftag_err : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_reftag_err)); + printf("[%d]io_read_fail_cout : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_read_fail_cout)); + printf("[%d]io_write_fail_cout : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_write_fail_cout)); + printf("[%d]io_dma_disable_err : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_dma_disable_err)); + printf("[%d]io_dma_fatal_err : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_dma_fatal_err)); + printf("[%d]io_dma_linkdown_err : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_dma_linkdown_err)); + printf("[%d]io_dma_timeout_err : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_dma_timeout_err)); + printf("[%d]lba_err[0] : %u\n", i, le32_to_cpu(vendorlog->io_err[i].lba_err[0])); + printf("[%d]lba_err[1] : %u\n", i, le32_to_cpu(vendorlog->io_err[i].lba_err[1])); + printf("[%d]lba_err[2] : %u\n", i, le32_to_cpu(vendorlog->io_err[i].lba_err[2])); + printf("[%d]lba_err[3] : %u\n", i, le32_to_cpu(vendorlog->io_err[i].lba_err[3])); + printf("[%d]lba_err[4] : %u\n", i, le32_to_cpu(vendorlog->io_err[i].lba_err[4])); + printf("[%d]lba_err[5] : %u\n", i, le32_to_cpu(vendorlog->io_err[i].lba_err[5])); + } + + printf("temp_throttle_per : %u\n", le32_to_cpu(vendorlog->temp_throttle_per)); + printf("port0_flreset_cnt : %" PRIu64 "\n", le64_to_cpu(vendorlog->port0_fundamental_reset_cnt)); + printf("port0_hot_reset_cnt : %" PRIu64 "\n", le64_to_cpu(vendorlog->port0_hot_reset_cnt)); + printf("port0_func_reset_cnt : %" PRIu64 "\n", le64_to_cpu(vendorlog->port0_func_reset_cnt)); + printf("port0_linkdown_cnt : %" PRIu64 "\n", le64_to_cpu(vendorlog->port0_linkdown_cnt)); + printf("port0_ctrl_reset_cnt : %" PRIu64 "\n", le64_to_cpu(vendorlog->port0_ctrl_reset_cnt)); + printf("ces_RcvErr_cnt : %u\n", le32_to_cpu(vendorlog->ces_RcvErr_cnt)); + printf("ces_BadTlp_cnt : %u\n", le32_to_cpu(vendorlog->ces_BadTlp_cnt)); + printf("ces_BadDllp_cnt : %u\n", le32_to_cpu(vendorlog->ces_BadDllp_cnt)); + printf("ces_Rplyover_cnt : %u\n", le32_to_cpu(vendorlog->ces_Rplyover_cnt)); + printf("ces_RplyTo_cnt : %u\n", le32_to_cpu(vendorlog->ces_RplyTo_cnt)); + printf("ces_Hlo_cnt : %u\n", le32_to_cpu(vendorlog->ces_Hlo_cnt)); + printf("scan doorbell err cnt : %u\n", le32_to_cpu(vendorlog->scan_db_err_cnt)); + printf("doorbell interrupt err cnt : %u\n", le32_to_cpu(vendorlog->db_int_err_cnt)); + + printf("------------ncm-----------------------\n"); + for (i = 0; i < 4; i++) { + printf("------------part%d-----------------------\n", i); + printf("[%d]nand_rd_unc_count : %u\n", i, + le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_rd_unc_cnt)); + printf("[%d]nand_rd_srr_count : %u\n", i, + le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_rd_srr_cnt)); + printf("[%d]nand_rd_sdecode_count : %u\n", i, + le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_rd_soft_decode_cnt)); + printf("[%d]nand_rd_rb_fail_count : %u\n", i, + le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_rd_rebuild_fail_cnt)); + printf("[%d]nand_prg_fail_count : %u\n", i, + le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_prg_fail_cnt)); + printf("[%d]nand_eras_fail_count : %u\n", i, + le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_eras_fail_cnt)); + printf("[%d]nand_rd_count : %" PRIu64 "\n", i, + le64_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_rd_cnt)); + printf("[%d]nand_prg_count : %" PRIu64 "\n", i, + le64_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_prg_cnt)); + printf("[%d]nand_eras_count : %" PRIu64 "\n", i, + le64_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_eras_cnt)); + printf("[%d]BE_scan_unc_count : %u\n", i, + le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].BE_scan_unc_cnt)); + printf("[%d]rebuild_req_cnt : %u\n", i, + le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].rebuild_req_cnt)); + printf("[%d]retry_req_cnt : %u\n", i, + le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].retry_req_cnt)); + printf("[%d]retry_success_cnt : %u\n", i, + le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].retry_success_cnt)); + printf("[%d]prg_badblk_num : %u\n", i, + le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].prg_badblk_num)); + printf("[%d]eras_badblk_num : %u\n", i, + le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].eras_badblk_num)); + printf("[%d]read_badblk_num : %u\n", i, + le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].unc_badblk_num)); + } + + printf("[%d]temp_ctrl_limit_count : %u\n", i, le32_to_cpu(vendorlog->temp_ctrl_limit_cnt)); + printf("[%d]temp_ctrl_stop_count : %u\n", i, le32_to_cpu(vendorlog->temp_ctrl_stop_cnt)); + printf("------------wlm-----------------------\n"); + for (i = 0; i < 4; i++) { + printf("------------part%d-----------------------\n", i); + printf("[%d]fbb_count : %u\n", i, + le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].fbb_count)); + printf("[%d]ebb_count : %u\n", i, + le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].ebb_count)); + printf("[%d]lbb_count : %u\n", i, + le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].lbb_count)); + printf("[%d]gc_read_count : %u\n", i, + le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].gc_read_count)); + printf("[%d]gc_write_count : %u\n", i, + le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].gc_write_count)); + printf("[%d]gc_write_fail_count : %u\n", i, + le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].gc_write_fail_count)); + printf("[%d]force_gc_count : %u\n", i, + le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].force_gc_count)); + printf("[%d]avg_pe_count : %u\n", i, + le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].avg_pe_count)); + printf("[%d]max_pe_count : %u\n", i, + le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].max_pe_count)); + printf("[%d]free_blk_num1 : %u\n", i, + le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].free_blk_num1)); + printf("[%d]free_blk_num2 : %u\n", i, + le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].free_blk_num2)); + } + + printf("------------lkm-----------------------\n"); + printf("[%d]e2e_check_err_count1 : %u\n", i, le32_to_cpu(vendorlog->e2e_check_err_cnt1)); + printf("[%d]e2e_check_err_count2 : %u\n", i, le32_to_cpu(vendorlog->e2e_check_err_cnt2)); + printf("[%d]e2e_check_err_count3 : %u\n", i, le32_to_cpu(vendorlog->e2e_check_err_cnt3)); + printf("[%d]e2e_check_err_count4 : %u\n", i, le32_to_cpu(vendorlog->e2e_check_err_cnt4)); +} + +void show_r1_media_err_log(r1_cli_vendor_log_t *vendorlog) +{ + int i, j; + + for (i = 0; i < 4; i++) { + printf("DM%d read err lba:\n", i); + for (j = 0; j < 10; j++) { + printf("[%d]lba : %" PRIu64 "\n", j, le64_to_cpu(vendorlog->media_err[i].lba_err[j])); + } + } +} + +static int nvme_get_vendor_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + __u8 local_mem[BYTE_OF_4K]; + char *desc = "Get the Inspur vendor log"; + struct nvme_dev *dev; + int err; + + OPT_ARGS(opts) = { OPT_END() }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + memset(local_mem, 0, BYTE_OF_4K); + err = nvme_get_log_simple(dev_fd(dev), VENDOR_SMART_LOG_PAGE, sizeof(r1_cli_vendor_log_t), local_mem); + if (!err) { + show_r1_vendor_log((r1_cli_vendor_log_t *)local_mem); + show_r1_media_err_log((r1_cli_vendor_log_t *)local_mem); + } else { + nvme_show_status(err); + } + + dev_close(dev); + return err; +} diff --git a/plugins/inspur/inspur-nvme.h b/plugins/inspur/inspur-nvme.h new file mode 100644 index 0000000..14a5e76 --- /dev/null +++ b/plugins/inspur/inspur-nvme.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#undef CMD_INC_FILE +#define CMD_INC_FILE plugins/inspur/inspur-nvme + +#if !defined(INSPUR_NVME) || defined(CMD_HEADER_MULTI_READ) +#define INSPUR_NVME + +#include "cmd.h" + +PLUGIN(NAME("inspur", "Inspur vendor specific extensions", NVME_VERSION), + COMMAND_LIST( + ENTRY("nvme-vendor-log", "Retrieve Inspur Vendor Log, show it", nvme_get_vendor_log) + ) +); + +#endif + +#include "define_cmd.h" diff --git a/plugins/inspur/inspur-utils.h b/plugins/inspur/inspur-utils.h new file mode 100644 index 0000000..d411bf0 --- /dev/null +++ b/plugins/inspur/inspur-utils.h @@ -0,0 +1,175 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef __INSPUR_UTILS_H__ +#define __INSPUR_UTILS_H__ + +#define BYTE_OF_64K 65536UL +#define BYTE_OF_32K 32768UL +#define BYTE_OF_16K 16384UL +#define BYTE_OF_4K 4096UL +#define BYTE_OF_512 512UL +#define BYTE_OF_256 256UL +#define BYTE_OF_128 128UL + +/* Inspur specific LOG_PAGE_ID */ +typedef enum { + VENDOR_SMART_LOG_PAGE = 0xc0, +} vendor_sepc_log_page_id_e; + +#pragma pack(push, 1) +typedef struct r1_am_cap_transtime { + __u32 cap_trans_time1 : 16; + __u32 cap_trans_time2 : 16; +} r1_cap_transtime_t; + +typedef struct vendor_warning_bit { + __u32 high_format_fail : 1; + __u32 low_format_fail : 1; + __u32 rebuild_fail1 : 1; + __u32 rebuild_fail2 : 1; + __u32 rebuild_fail3 : 1; + __u32 rebuild_fail4 : 1; + __u32 rebuild_fail5 : 1; + __u32 rebuild_fail6 : 1; + __u32 self_test_fail1 : 1; + __u32 self_test_fail2 : 1; + __u32 self_test_fail3 : 1; + __u32 self_test_fail4 : 1; + __u32 internal_err1 : 1; + __u32 internal_err2 : 1; + __u32 internal_err3 : 1; + __u32 internal_err4 : 1; + __u32 internal_err5 : 1; + __u32 internal_err6 : 1; + __u32 internal_err7 : 1; + __u32 internal_err8 : 1; + __u32 internal_err9 : 1; + __u32 internal_err10 : 1; + __u32 internal_err11 : 1; + __u32 internal_err12 : 1; + __u32 internal_err13 : 1; + __u32 internal_err14 : 1; + __u32 internal_err15 : 1; + __u32 internal_err16 : 1; + __u32 capacitance_test_fail : 1; + __u32 IO_read_fail : 1; + __u32 IO_write_fail : 1; + __u32 readOnly_after_rebuild : 1; + __u32 firmware_loss : 1; + __u32 cap_unsupply : 1; + __u32 spare_space_warning : 1; + __u32 lifetime_warning : 1; + __u32 temp_high_warning : 1; + __u32 temp_low_warning : 1; + __u32 mcu_disable : 1; + __u32 rsv : 25; +} vendor_warning_str; + +typedef struct r1_vendor_log_ncm_cout { + __u32 nand_rd_unc_cnt; + __u32 nand_rd_srr_cnt; + __u32 nand_rd_soft_decode_cnt; + __u32 nand_rd_rebuild_fail_cnt; + __u32 nand_prg_fail_cnt; + __u32 nand_eras_fail_cnt; + __u64 nand_rd_cnt; + __u64 nand_prg_cnt; + __u64 nand_eras_cnt; + __u32 BE_scan_unc_cnt; + __u32 rebuild_req_cnt; + __u16 retry_req_cnt; + __u16 retry_success_cnt; + __u32 prg_badblk_num; + __u32 eras_badblk_num; + __u32 unc_badblk_num; +} r1_vendor_log_nandctl_count_t; + +typedef struct r1_wearlvl_vendor_log_count { + __u32 fbb_count; + __u32 ebb_count; + __u32 lbb_count; + __u32 gc_read_count; + __u32 gc_write_count; + __u32 gc_write_fail_count; + __u32 force_gc_count; + __u32 avg_pe_count; + __u32 max_pe_count; + __u32 free_blk_num1; + __u32 free_blk_num2; +} r1_wearlvl_vendor_log_count_t; + +typedef struct vendor_media_err { + __u64 lba_err[10]; +} vendor_media_err_t; + +typedef struct r1_vendor_log_io_err { + __u32 io_guard_err; + __u32 io_apptag_err; + __u32 io_reftag_err; + __u32 io_dma_linkdown_err; + __u32 io_dma_disable_err; + __u32 io_dma_timeout_err; + __u32 io_dma_fatal_err; + __u32 io_write_fail_cout; + __u32 io_read_fail_cout; + __u32 lba_err[6]; +} r1_vendor_log_io_err_t; + +typedef struct r1_vendor_log_s { + __u32 max_power; + __u32 disk_max_temper; + __u32 disk_overtemper_cout; + __u32 ctrl_max_temper; + __u32 ctrl_overtemper_cout; + r1_cap_transtime_t cap_transtime; + __u32 cap_health_state; + __u32 device_state; + r1_vendor_log_io_err_t io_err[4]; + union { + vendor_warning_str detail_warning_bit; + __u32 detail_warning[2]; + }; + union { + vendor_warning_str detail_warning_his_bit; + __u32 detail_warning_his[2]; + }; + __u32 ddr_bit_err_cout; + __u32 temp_throttle_per; + __u64 port0_fundamental_reset_cnt; + __u64 port0_hot_reset_cnt; + __u64 port0_func_reset_cnt; + __u64 port0_linkdown_cnt; + __u64 port0_ctrl_reset_cnt; + __u64 nand_bytes_written[4]; + __u32 power_info; + __u32 voltage_info; + __u32 current_info; + __u32 current_temp[4]; + __u32 nand_max_temper; + __u32 nand_overtemper_cout; + __u32 mcu_data_id; + __u8 commit_id[16]; + __u32 ces_RcvErr_cnt; + __u32 ces_BadTlp_cnt; + __u32 ces_BadDllp_cnt; + __u32 ces_Rplyover_cnt; + __u32 ces_RplyTo_cnt; + __u32 ces_Hlo_cnt; + __u32 scan_db_err_cnt; + __u32 db_int_err_cnt; + __u8 rsvFE[56]; + r1_vendor_log_nandctl_count_t vendor_log_nandctl_cnt[4]; + __u32 temp_ctrl_limit_cnt; + __u32 temp_ctrl_stop_cnt; + __u8 rsvncm[216]; + r1_wearlvl_vendor_log_count_t wearlvl_vendor_log_count[4]; + __u8 rsvwlm[512 - sizeof(r1_wearlvl_vendor_log_count_t) * 4 % 512]; + __u32 e2e_check_err_cnt1; + __u32 e2e_check_err_cnt2; + __u32 e2e_check_err_cnt3; + __u32 e2e_check_err_cnt4; + vendor_media_err_t media_err[4]; + __u8 rsvlkm[176]; +} r1_cli_vendor_log_t; +#pragma pack(pop) + +#endif // __INSPUR_UTILS_H__ diff --git a/plugins/memblaze/memblaze-nvme.c b/plugins/memblaze/memblaze-nvme.c index 6fdd675..fb46841 100644 --- a/plugins/memblaze/memblaze-nvme.c +++ b/plugins/memblaze/memblaze-nvme.c @@ -3,10 +3,12 @@ #include #include #include +#include #include #include #include "nvme.h" +#include "common.h" #include "libnvme.h" #include "plugin.h" #include "linux/types.h" @@ -105,51 +107,7 @@ static __u64 raw_2_u64(const __u8 *buf, size_t len) return le64_to_cpu(val); } -#define STRN2_01 "Additional Smart Log for NVME device" -#define STRN2_02 "namespace-id" -#define STRN1_01 "key" -#define STRN1_02 "normalized" -#define STRN1_03 "raw" -#define STR00_01 "program_fail_count" -#define STR01_01 "erase_fail_count" -#define STR02_01 "wear_leveling" -#define STR02_03 "min: " -#define STR02_04 ", max: " -#define STR02_05 ", avg: " -#define STR03_01 "end_to_end_error_detection_count" -#define STR04_01 "crc_error_count" -#define STR05_01 "timed_workload_media_wear" -#define STR06_01 "timed_workload_host_reads" -#define STR07_01 "timed_workload_timer" -#define STR07_02 " min" -#define STR08_01 "thermal_throttle_status" -#define STR08_02 ", cnt: " -#define STR09_01 "retry_buffer_overflow_count" -#define STR10_01 "pll_lock_loss_count" -#define STR11_01 "nand_bytes_written" -#define STR11_03 "sectors: " -#define STR12_01 "host_bytes_written" -#define STR12_03 "sectors: " -#define STR13_01 "system_area_life_left" -#define STR14_01 "total_read" -#define STR15_01 "tempt_since_born" -#define STR15_03 "max: " -#define STR15_04 ", min: " -#define STR15_05 ", curr: " -#define STR16_01 "power_consumption" -#define STR16_03 "max: " -#define STR16_04 ", min: " -#define STR16_05 ", curr: " -#define STR17_01 "tempt_since_bootup" -#define STR17_03 "max: " -#define STR17_04 ", min: " -#define STR17_05 ", curr: " -#define STR18_01 "power_loss_protection" -#define STR19_01 "read_fail_count" -#define STR20_01 "thermal_throttle_time" -#define STR21_01 "flash_media_error" - -static void get_memblaze_new_smart_info(struct nvme_p4_smart_log *smart, int index, u8 *nm_val, u8 *raw_val) +static void get_memblaze_new_smart_info(struct nvme_p4_smart_log *smart, int index, __u8 *nm_val, __u8 *raw_val) { memcpy(nm_val, smart->itemArr[index].nmVal, NM_SIZE); memcpy(raw_val, smart->itemArr[index].rawVal, RAW_SIZE); @@ -159,8 +117,8 @@ static void show_memblaze_smart_log_new(struct nvme_memblaze_smart_log *s, unsigned int nsid, const char *devname) { struct nvme_p4_smart_log *smart = (struct nvme_p4_smart_log *)s; - u8 *nm = malloc(NM_SIZE * sizeof(u8)); - u8 *raw = malloc(RAW_SIZE * sizeof(u8)); + __u8 *nm = malloc(NM_SIZE * sizeof(__u8)); + __u8 *raw = malloc(RAW_SIZE * sizeof(__u8)); if (!nm) { if (raw) @@ -171,79 +129,77 @@ static void show_memblaze_smart_log_new(struct nvme_memblaze_smart_log *s, free(nm); return; } - /* Table Title */ - printf("%s:%s %s:%x\n", STRN2_01, devname, STRN2_02, nsid); - /* Clumn Name*/ - printf("%-34s%-11s%s\n", STRN1_01, STRN1_02, STRN1_03); - /* 00 RAISIN_SI_VD_PROGRAM_FAIL */ + + printf("%s:%s %s:%x\n", "Additional Smart Log for NVME device", devname, "namespace-id", nsid); + printf("%-34s%-11s%s\n", "key", "normalized", "raw"); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_PROGRAM_FAIL, nm, raw); - printf("%-32s: %3d%% %"PRIu64"\n", STR00_01, *nm, int48_to_long(raw)); - /* 01 RAISIN_SI_VD_ERASE_FAIL */ + printf("%-32s: %3d%% %"PRIu64"\n", "program_fail_count", *nm, int48_to_long(raw)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_ERASE_FAIL, nm, raw); - printf("%-32s: %3d%% %"PRIu64"\n", STR01_01, *nm, int48_to_long(raw)); - /* 02 RAISIN_SI_VD_WEARLEVELING_COUNT */ + printf("%-32s: %3d%% %"PRIu64"\n", "erase_fail_count", *nm, int48_to_long(raw)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_WEARLEVELING_COUNT, nm, raw); - printf("%-31s : %3d%% %s%u%s%u%s%u\n", STR02_01, *nm, - STR02_03, *raw, STR02_04, *(raw+2), STR02_05, *(raw+4)); - /* 03 RAISIN_SI_VD_E2E_DECTECTION_COUNT */ + printf("%-31s : %3d%% %s%u%s%u%s%u\n", "wear_leveling", *nm, + "min: ", *(__u16 *)raw, ", max: ", *(__u16 *)(raw+2), ", avg: ", *(__u16 *)(raw+4)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_E2E_DECTECTION_COUNT, nm, raw); - printf("%-31s: %3d%% %"PRIu64"\n", STR03_01, *nm, int48_to_long(raw)); - /* 04 RAISIN_SI_VD_PCIE_CRC_ERR_COUNT */ + printf("%-31s: %3d%% %"PRIu64"\n", "end_to_end_error_detection_count", *nm, int48_to_long(raw)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_PCIE_CRC_ERR_COUNT, nm, raw); - printf("%-32s: %3d%% %"PRIu64"\n", STR04_01, *nm, int48_to_long(raw)); - /* 05 RAISIN_SI_VD_TIMED_WORKLOAD_MEDIA_WEAR */ + printf("%-32s: %3d%% %"PRIu64"\n", "crc_error_count", *nm, int48_to_long(raw)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_TIMED_WORKLOAD_MEDIA_WEAR, nm, raw); - printf("%-32s: %3d%% %.3f%%\n", STR05_01, *nm, ((float)int48_to_long(raw))/1000); - /* 06 RAISIN_SI_VD_TIMED_WORKLOAD_HOST_READ */ + printf("%-32s: %3d%% %.3f%%\n", "timed_workload_media_wear", *nm, ((float)int48_to_long(raw))/1000); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_TIMED_WORKLOAD_HOST_READ, nm, raw); - printf("%-32s: %3d%% %"PRIu64"%%\n", STR06_01, *nm, int48_to_long(raw)); - /* 07 RAISIN_SI_VD_TIMED_WORKLOAD_TIMER */ + printf("%-32s: %3d%% %"PRIu64"%%\n", "timed_workload_host_reads", *nm, int48_to_long(raw)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_TIMED_WORKLOAD_TIMER, nm, raw); - printf("%-32s: %3d%% %"PRIu64"%s\n", STR07_01, *nm, int48_to_long(raw), STR07_02); - /* 08 RAISIN_SI_VD_THERMAL_THROTTLE_STATUS */ + printf("%-32s: %3d%% %"PRIu64"%s\n", "timed_workload_timer", *nm, int48_to_long(raw), " min"); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_THERMAL_THROTTLE_STATUS, nm, raw); - printf("%-32s: %3d%% %"PRIu64"%%%s%"PRIu64"\n", STR08_01, *nm, - int48_to_long(raw), STR08_02, int48_to_long(raw+1)); - /* 09 RAISIN_SI_VD_RETRY_BUFF_OVERFLOW_COUNT */ + printf("%-32s: %3d%% %u%%%s%"PRIu64"\n", "thermal_throttle_status", *nm, + *raw, ", cnt: ", int48_to_long(raw+1)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_RETRY_BUFF_OVERFLOW_COUNT, nm, raw); - printf("%-32s: %3d%% %"PRIu64"\n", STR09_01, *nm, int48_to_long(raw)); - /* 10 RAISIN_SI_VD_PLL_LOCK_LOSS_COUNT */ + printf("%-32s: %3d%% %"PRIu64"\n", "retry_buffer_overflow_count", *nm, int48_to_long(raw)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_PLL_LOCK_LOSS_COUNT, nm, raw); - printf("%-32s: %3d%% %"PRIu64"\n", STR10_01, *nm, int48_to_long(raw)); - /* 11 RAISIN_SI_VD_TOTAL_WRITE */ + printf("%-32s: %3d%% %"PRIu64"\n", "pll_lock_loss_count", *nm, int48_to_long(raw)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_TOTAL_WRITE, nm, raw); - printf("%-32s: %3d%% %s%"PRIu64"\n", STR11_01, *nm, STR11_03, int48_to_long(raw)); - /* 12 RAISIN_SI_VD_HOST_WRITE */ + printf("%-32s: %3d%% %s%"PRIu64"\n", "nand_bytes_written", *nm, "sectors: ", int48_to_long(raw)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_HOST_WRITE, nm, raw); - printf("%-32s: %3d%% %s%"PRIu64"\n", STR12_01, *nm, STR12_03, int48_to_long(raw)); - /* 13 RAISIN_SI_VD_SYSTEM_AREA_LIFE_LEFT */ + printf("%-32s: %3d%% %s%"PRIu64"\n", "host_bytes_written", *nm, "sectors: ", int48_to_long(raw)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_SYSTEM_AREA_LIFE_LEFT, nm, raw); - printf("%-32s: %3d%% %"PRIu64"\n", STR13_01, *nm, int48_to_long(raw)); - /* 14 RAISIN_SI_VD_TOTAL_READ */ + printf("%-32s: %3d%% %"PRIu64"\n", "system_area_life_left", *nm, int48_to_long(raw)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_TOTAL_READ, nm, raw); - printf("%-32s: %3d%% %"PRIu64"\n", STR14_01, *nm, int48_to_long(raw)); - /* 15 RAISIN_SI_VD_TEMPT_SINCE_BORN */ + printf("%-32s: %3d%% %"PRIu64"\n", "total_read", *nm, int48_to_long(raw)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_TEMPT_SINCE_BORN, nm, raw); - printf("%-32s: %3d%% %s%u%s%u%s%u\n", STR15_01, *nm, - STR15_03, *raw, STR15_04, *(raw+2), STR15_05, *(raw+4)); - /* 16 RAISIN_SI_VD_POWER_CONSUMPTION */ + printf("%-32s: %3d%% %s%u%s%u%s%u\n", "tempt_since_born", *nm, + "max: ", *(__u16 *)raw, ", min: ", *(__u16 *)(raw+2), ", curr: ", *(__u16 *)(raw+4)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_POWER_CONSUMPTION, nm, raw); - printf("%-32s: %3d%% %s%u%s%u%s%u\n", STR16_01, *nm, - STR16_03, *raw, STR16_04, *(raw+2), STR16_05, *(raw+4)); - /* 17 RAISIN_SI_VD_TEMPT_SINCE_BOOTUP */ + printf("%-32s: %3d%% %s%u%s%u%s%u\n", "power_consumption", *nm, + "max: ", *(__u16 *)raw, ", min: ", *(__u16 *)(raw+2), ", curr: ", *(__u16 *)(raw+4)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_TEMPT_SINCE_BOOTUP, nm, raw); - printf("%-32s: %3d%% %s%u%s%u%s%u\n", STR17_01, *nm, STR17_03, *raw, - STR17_04, *(raw+2), STR17_05, *(raw+4)); - /* 18 RAISIN_SI_VD_POWER_LOSS_PROTECTION */ - /* 19 RAISIN_SI_VD_READ_FAIL */ + printf("%-32s: %3d%% %s%u%s%u%s%u\n", "tempt_since_bootup", *nm, "max: ", *(__u16 *)raw, + ", min: ", *(__u16 *)(raw+2), ", curr: ", *(__u16 *)(raw+4)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_READ_FAIL, nm, raw); - printf("%-32s: %3d%% %"PRIu64"\n", STR19_01, *nm, int48_to_long(raw)); - /* 20 RAISIN_SI_VD_THERMAL_THROTTLE_TIME */ + printf("%-32s: %3d%% %"PRIu64"\n", "read_fail_count", *nm, int48_to_long(raw)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_THERMAL_THROTTLE_TIME, nm, raw); - printf("%-32s: %3d%% %"PRIu64"\n", STR20_01, *nm, int48_to_long(raw)); - /* 21 RAISIN_SI_VD_FLASH_MEDIA_ERROR */ + printf("%-32s: %3d%% %"PRIu64"\n", "thermal_throttle_time", *nm, int48_to_long(raw)); + get_memblaze_new_smart_info(smart, RAISIN_SI_VD_FLASH_MEDIA_ERROR, nm, raw); - printf("%-32s: %3d%% %"PRIu64"\n", STR21_01, *nm, int48_to_long(raw)); + printf("%-32s: %3d%% %"PRIu64"\n", "flash_media_error", *nm, int48_to_long(raw)); free(nm); free(raw); @@ -349,8 +305,8 @@ static void show_memblaze_smart_log_old(struct nvme_memblaze_smart_log *smart, if ( IS_PAPAYA(fw_ver_local) ) { struct nvme_p4_smart_log *s = (struct nvme_p4_smart_log *)smart; - u8 *nm = malloc(NM_SIZE * sizeof(u8)); - u8 *raw = malloc(RAW_SIZE * sizeof(u8)); + __u8 *nm = malloc(NM_SIZE * sizeof(__u8)); + __u8 *raw = malloc(RAW_SIZE * sizeof(__u8)); if (!nm) { if (raw) @@ -361,26 +317,25 @@ static void show_memblaze_smart_log_old(struct nvme_memblaze_smart_log *smart, free(nm); return; } - /* 00 RAISIN_SI_VD_PROGRAM_FAIL */ get_memblaze_new_smart_info(s, PROGRAM_FAIL, nm, raw); printf("%-32s : %3d%% %"PRIu64"\n", - STR00_01, *nm, int48_to_long(raw)); - /* 01 RAISIN_SI_VD_ERASE_FAIL */ + "program_fail_count", *nm, int48_to_long(raw)); + get_memblaze_new_smart_info(s, ERASE_FAIL, nm, raw); printf("%-32s : %3d%% %"PRIu64"\n", - STR01_01, *nm, int48_to_long(raw)); - /* 02 RAISIN_SI_VD_WEARLEVELING_COUNT */ + "erase_fail_count", *nm, int48_to_long(raw)); + get_memblaze_new_smart_info(s, WEARLEVELING_COUNT, nm, raw); printf("%-31s : %3d%% %s%u%s%u%s%u\n", - STR02_01, *nm, STR02_03, *raw, STR02_04, *(raw+2), STR02_05, *(raw+4)); - /* 11 RAISIN_SI_VD_TOTAL_WRITE */ + "wear_leveling", *nm, "min: ", *(__u16 *)raw, ", max: ", *(__u16 *)(raw+2), ", avg: ", *(__u16 *)(raw+4)); + get_memblaze_new_smart_info(s, TOTAL_WRITE, nm, raw); printf("%-32s : %3d%% %"PRIu64"\n", - STR11_01, *nm, 32*int48_to_long(raw)); - /* 12 RAISIN_SI_VD_HOST_WRITE */ + "nand_bytes_written", *nm, 32*int48_to_long(raw)); + get_memblaze_new_smart_info(s, HOST_WRITE, nm, raw); printf("%-32s : %3d%% %"PRIu64"\n", - STR12_01, *nm, 32*int48_to_long(raw)); + "host_bytes_written", *nm, 32*int48_to_long(raw)); free(nm); free(raw); @@ -602,7 +557,7 @@ static int mb_set_powermanager_status(int argc, char **argv, struct command *cmd printf("set-feature:%02x (%s), value:%#08x\n", cfg.feature_id, mb_feature_to_string(cfg.feature_id), cfg.value); } else if (err > 0) - nvme_show_status(err); + nvme_show_status(err); dev_close(dev); return err; @@ -679,7 +634,7 @@ static int mb_set_high_latency_log(int argc, char **argv, struct command *cmd, s printf("set-feature:0x%02X (%s), value:%#08x\n", cfg.feature_id, mb_feature_to_string(cfg.feature_id), cfg.value); } else if (err > 0) - nvme_show_status(err); + nvme_show_status(err); dev_close(dev); return err; @@ -817,7 +772,6 @@ static int mb_high_latency_log_print(int argc, char **argv, struct command *cmd, return err; } - static int memblaze_fw_commit(int fd, int select) { struct nvme_passthru_cmd cmd = { @@ -1095,22 +1049,18 @@ static int mb_lat_stats_log_print(int argc, char **argv, struct command *cmd, st io_latency_histogram(cfg.write ? f2 : f1, stats, DO_PRINT_FLAG, cfg.write ? GLP_ID_VU_GET_WRITE_LATENCY_HISTOGRAM : GLP_ID_VU_GET_READ_LATENCY_HISTOGRAM); else - nvme_show_status(err); + nvme_show_status(err); dev_close(dev); return err; } -#define OP 0xFC -#define FID 0x68 static int memblaze_clear_error_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { char *desc = "Clear Memblaze devices error log."; struct nvme_dev *dev; int err; - //const char *value = "new value of feature (required)"; - //const char *save = "specifies that the controller shall save the attribute"; __u32 result; struct config { @@ -1157,20 +1107,6 @@ static int memblaze_clear_error_log(int argc, char **argv, struct command *cmd, } else if (err > 0) nvme_show_status(err); -/* - struct nvme_admin_cmd admin_cmd = { - .opcode = OP, - .cdw10 = FID, - }; - - err = nvme_submit_admin_passthru(fd, &admin_cmd); - - if (!err) { - printf("OP(0x%2X) FID(0x%2X) Clear error log success.\n", OP, FID); - } else { - printf("NVMe Status:%s(%x)\n", nvme_status_to_string(err), err); - }; -*/ dev_close(dev); return err; } @@ -1289,4 +1225,3 @@ static int mb_set_lat_stats(int argc, char **argv, dev_close(dev); return err; } - diff --git a/plugins/memblaze/memblaze-nvme.h b/plugins/memblaze/memblaze-nvme.h index 87314c6..e214ca6 100644 --- a/plugins/memblaze/memblaze-nvme.h +++ b/plugins/memblaze/memblaze-nvme.h @@ -6,12 +6,6 @@ #define MEMBLAZE_NVME #include "cmd.h" -#include "common.h" - -#include -#include -#include -#include PLUGIN(NAME("memblaze", "Memblaze vendor specific extensions", NVME_VERSION), COMMAND_LIST( @@ -30,4 +24,3 @@ PLUGIN(NAME("memblaze", "Memblaze vendor specific extensions", NVME_VERSION), #endif #include "define_cmd.h" - diff --git a/plugins/memblaze/memblaze-utils.h b/plugins/memblaze/memblaze-utils.h index 84263f3..f64a115 100644 --- a/plugins/memblaze/memblaze-utils.h +++ b/plugins/memblaze/memblaze-utils.h @@ -9,8 +9,6 @@ #define NM_SIZE 2 #define RAW_SIZE 7 -typedef unsigned char u8; - // Intel Format & new format /* Raisin Additional smart external ID */ #define RAISIN_SI_VD_PROGRAM_FAIL_ID 0xAB @@ -135,18 +133,18 @@ struct nvme_memblaze_smart_log_item { struct nvme_memblaze_smart_log { struct nvme_memblaze_smart_log_item items[NR_SMART_ITEMS]; - u8 resv[SMART_INFO_OLD_SIZE - sizeof(struct nvme_memblaze_smart_log_item) * NR_SMART_ITEMS]; + __u8 resv[SMART_INFO_OLD_SIZE - sizeof(struct nvme_memblaze_smart_log_item) * NR_SMART_ITEMS]; }; // Intel Format & new format struct nvme_p4_smart_log_item { /* Item identifier */ - u8 id[ID_SIZE]; + __u8 id[ID_SIZE]; /* Normalized value or percentage. In the range from 0 to 100. */ - u8 nmVal[NM_SIZE]; + __u8 nmVal[NM_SIZE]; /* raw value */ - u8 rawVal[RAW_SIZE]; + __u8 rawVal[RAW_SIZE]; }; struct nvme_p4_smart_log @@ -158,7 +156,7 @@ struct nvme_p4_smart_log * because micron's getlogpage request,the size of many commands have changed to 4k. * request size > user malloc size,casuing parameters that are closed in momery are dirty. */ - u8 resv[SMART_INFO_NEW_SIZE - sizeof(struct nvme_p4_smart_log_item) * NR_SMART_ITEMS]; + __u8 resv[SMART_INFO_NEW_SIZE - sizeof(struct nvme_p4_smart_log_item) * NR_SMART_ITEMS]; }; // base @@ -221,4 +219,3 @@ struct nvme_p4_smart_log } #endif // __MEMBLAZE_UTILS_H__ - diff --git a/plugins/meson.build b/plugins/meson.build index b3af39b..c92b208 100644 --- a/plugins/meson.build +++ b/plugins/meson.build @@ -22,6 +22,8 @@ sources += [ 'plugins/wdc/wdc-nvme.c', 'plugins/ymtc/ymtc-nvme.c', 'plugins/zns/zns.c', - 'plugins/ocp/ocp-nvme.c', + 'plugins/inspur/inspur-nvme.c', + 'plugins/fdp/fdp.c', ] subdir('solidigm') +subdir('ocp') diff --git a/plugins/micron/micron-nvme.c b/plugins/micron/micron-nvme.c index e6f3a8c..3c0904c 100644 --- a/plugins/micron/micron-nvme.c +++ b/plugins/micron/micron-nvme.c @@ -3168,7 +3168,6 @@ static int micron_internal_logs(int argc, char **argv, struct command *cmd, if (telemetry_option) { if ((ctrl.lpa & 0x8) != 0x8) { printf("telemetry option is not supported for specified drive\n"); - dev_close(dev); goto out; } int logSize = 0; __u8 *buffer = NULL; const char *dir = "."; diff --git a/plugins/ocp/meson.build b/plugins/ocp/meson.build new file mode 100644 index 0000000..a4e5d20 --- /dev/null +++ b/plugins/ocp/meson.build @@ -0,0 +1,6 @@ +sources += [ + 'plugins/ocp/ocp-utils.c', + 'plugins/ocp/ocp-nvme.c', + 'plugins/ocp/ocp-clear-fw-update-history.c', +] + diff --git a/plugins/ocp/ocp-clear-fw-update-history.c b/plugins/ocp/ocp-clear-fw-update-history.c new file mode 100644 index 0000000..fef09cf --- /dev/null +++ b/plugins/ocp/ocp-clear-fw-update-history.c @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2022 Solidigm. + * + * Authors: haro.panosyan@solidigm.com + * leonardo.da.cunha@solidigm.com + */ + +#include +#include "ocp-utils.h" +#include "nvme-print.h" + +static const __u8 OCP_FID_CLEAR_FW_ACTIVATION_HISTORY = 0xC1; + +int ocp_clear_fw_update_history(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "OCP Clear Firmware Update History"; + __u32 result = 0; + __u32 clear_fw_history = 1 << 31; + struct nvme_dev *dev; + int uuid_index = 0; + bool no_uuid = false; + int err; + + OPT_ARGS(opts) = { + OPT_FLAG("no-uuid", 'n', &no_uuid, + "Skip UUID index search (UUID index not required for OCP 1.0)"), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + if (no_uuid == false) { + // OCP 2.0 requires UUID index support + err = ocp_get_uuid_index(dev, &uuid_index); + if (err || uuid_index == 0) { + fprintf(stderr, "ERROR: No OCP UUID index found\n"); + goto close_dev; + } + } + + struct nvme_set_features_args args = { + .result = &result, + .data = NULL, + .args_size = sizeof(args), + .fd = dev_fd(dev), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .nsid = 0, + .cdw11 = clear_fw_history, + .cdw12 = 0, + .cdw13 = 0, + .cdw15 = 0, + .data_len = 0, + .save = 0, + .uuidx = uuid_index, + .fid = OCP_FID_CLEAR_FW_ACTIVATION_HISTORY, + }; + + err = nvme_set_features(&args); + + if (err == 0) + printf("Success : %s\n", desc); + else if (err > 0) + nvme_show_status(err); + else + printf("Fail : %s\n", desc); +close_dev: + /* Redundant close() to make static code analysis happy */ + close(dev->direct.fd); + dev_close(dev); + return err; +} diff --git a/plugins/ocp/ocp-clear-fw-update-history.h b/plugins/ocp/ocp-clear-fw-update-history.h new file mode 100644 index 0000000..25fb6b1 --- /dev/null +++ b/plugins/ocp/ocp-clear-fw-update-history.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2022 Solidigm. + * + * Authors: haro.panosyan@solidigm.com + * leonardo.da.cunha@solidigm.com + */ + +int ocp_clear_fw_update_history(int argc, char **argv, struct command *cmd, struct plugin *plugin); diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 5cbf6cb..14a5f30 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -22,6 +22,7 @@ #include "linux/types.h" #include "util/types.h" #include "nvme-print.h" +#include "ocp-clear-fw-update-history.h" #define CREATE_CMD #include "ocp-nvme.h" @@ -765,3 +766,9 @@ static int ocp_latency_monitor_log(int argc, char **argv, struct command *comman dev_close(dev); return ret; } + +static int clear_fw_update_history(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + return ocp_clear_fw_update_history(argc, argv, cmd, plugin); +} diff --git a/plugins/ocp/ocp-nvme.h b/plugins/ocp/ocp-nvme.h index 3e3f437..c20646a 100644 --- a/plugins/ocp/ocp-nvme.h +++ b/plugins/ocp/ocp-nvme.h @@ -14,10 +14,13 @@ #include "cmd.h" PLUGIN(NAME("ocp", "OCP cloud SSD extensions", NVME_VERSION), - COMMAND_LIST( - ENTRY("smart-add-log", "Retrieve extended SMART Information", ocp_smart_add_log) - ENTRY("latency-monitor-log", "Get Latency Monitor Log Page", ocp_latency_monitor_log) - ) + COMMAND_LIST( + ENTRY("smart-add-log", "Retrieve extended SMART Information", ocp_smart_add_log) + ENTRY("latency-monitor-log", "Get Latency Monitor Log Page", + ocp_latency_monitor_log) + ENTRY("clear-fw-activate-history", "Clear firmware update history log", + clear_fw_update_history) + ) ); #endif diff --git a/plugins/ocp/ocp-utils.c b/plugins/ocp/ocp-utils.c new file mode 100644 index 0000000..9294c05 --- /dev/null +++ b/plugins/ocp/ocp-utils.c @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2022 Solidigm. + * + * Author: leonardo.da.cunha@solidigm.com + */ + +#include "ocp-utils.h" + +const unsigned char ocp_uuid[NVME_UUID_LEN] = { + 0x6f, 0xbe, 0x56, 0x8f, 0x99, 0x29, 0x1d, 0xa2, 0x94, 0x47, + 0x94, 0xe0, 0x5b, 0xd5, 0x94, 0xc1 }; + +int ocp_get_uuid_index(struct nvme_dev *dev, int *index) +{ + struct nvme_id_uuid_list uuid_list; + int err = nvme_identify_uuid(dev_fd(dev), &uuid_list); + + *index = 0; + if (err) + return err; + + for (int i = 0; i < NVME_ID_UUID_LIST_MAX; i++) { + if (memcmp(ocp_uuid, &uuid_list.entry[i].uuid, NVME_UUID_LEN) == 0) { + *index = i + 1; + break; + } + } + return err; +} diff --git a/plugins/ocp/ocp-utils.h b/plugins/ocp/ocp-utils.h new file mode 100644 index 0000000..44d0af4 --- /dev/null +++ b/plugins/ocp/ocp-utils.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2022 Solidigm. + * + * Author: leonardo.da.cunha@solidigm.com + */ + +#include "nvme.h" + +/** + * ocp_get_uuid_index() - Get OCP UUID index + * @dev: nvme device + * @index: integer ponter to here to save the index + * @result: The command completion result from CQE dword0 + * + * Return: Zero if nvme device has UUID list log page, or result of get uuid list otherwise. + */ +int ocp_get_uuid_index(struct nvme_dev *dev, int *index); diff --git a/plugins/scaleflux/sfx-nvme.c b/plugins/scaleflux/sfx-nvme.c index a776664..4bcfbf6 100644 --- a/plugins/scaleflux/sfx-nvme.c +++ b/plugins/scaleflux/sfx-nvme.c @@ -659,7 +659,7 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct } } else { printf("ScaleFlux IO %s Command Latency Statistics Invalid Version Maj %d Min %d\n", - write ? "Write" : "Read", stats.ver.maj, stats.ver.min); + cfg.write ? "Write" : "Read", stats.ver.maj, stats.ver.min); } } else if (err > 0) nvme_show_status(err); diff --git a/plugins/solidigm/solidigm-nvme.c b/plugins/solidigm/solidigm-nvme.c index 684648a..b547035 100644 --- a/plugins/solidigm/solidigm-nvme.c +++ b/plugins/solidigm/solidigm-nvme.c @@ -14,6 +14,7 @@ #include "solidigm-garbage-collection.h" #include "solidigm-latency-tracking.h" #include "solidigm-telemetry.h" +#include "plugins/ocp/ocp-clear-fw-update-history.h" static int get_additional_smart_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { @@ -33,4 +34,10 @@ static int get_latency_tracking_log(int argc, char **argv, struct command *cmd, static int get_telemetry_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { return solidigm_get_telemetry_log(argc, argv, cmd, plugin); -} \ No newline at end of file +} + +static int clear_fw_update_history(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + return ocp_clear_fw_update_history(argc, argv, cmd, plugin); +} diff --git a/plugins/solidigm/solidigm-nvme.h b/plugins/solidigm/solidigm-nvme.h index ed48400..778dbf9 100644 --- a/plugins/solidigm/solidigm-nvme.h +++ b/plugins/solidigm/solidigm-nvme.h @@ -13,7 +13,7 @@ #include "cmd.h" -#define SOLIDIGM_PLUGIN_VERSION "0.6" +#define SOLIDIGM_PLUGIN_VERSION "0.7" PLUGIN(NAME("solidigm", "Solidigm vendor specific extensions", SOLIDIGM_PLUGIN_VERSION), COMMAND_LIST( @@ -21,6 +21,9 @@ PLUGIN(NAME("solidigm", "Solidigm vendor specific extensions", SOLIDIGM_PLUGIN_V ENTRY("garbage-collect-log", "Retrieve Garbage Collection Log", get_garbage_collection_log) ENTRY("latency-tracking-log", "Enable/Retrieve Latency tracking Log", get_latency_tracking_log) ENTRY("parse-telemetry-log", "Parse Telemetry Log binary", get_telemetry_log) + ENTRY("clear-fw-activate-history", + "Clear firmware update history log (redirects to ocp plug-in)", + clear_fw_update_history) ) ); diff --git a/release.sh b/release.sh index 320da46..b4ae81c 100755 --- a/release.sh +++ b/release.sh @@ -6,6 +6,7 @@ usage() { echo "The script does all necessary steps to create a new release." echo "" echo " -d: no documentation update" + echo " -n: dry run" echo "" echo "Note: The version number needs to be exactly" echo " '^v[\d]+.[\d]+(.[\d\]+(-rc[0-9]+)?$'" @@ -16,12 +17,16 @@ usage() { } build_doc=true +dry_run=false -while getopts "d" o; do +while getopts "dn" o; do case "${o}" in d) build_doc=false ;; + n) + dry_run=true + ;; *) usage ;; @@ -36,23 +41,41 @@ if [ -z "$VERSION" ] ; then exit 1 fi -ver="" - +# expected version regex re='^v([0-9]+\.[0-9]+(\.[0-9]+)?)(-rc[0-9]+)?$' -if [[ "$VERSION" =~ $re ]]; then - echo "Valid version $VERSION string" + +# use the version string provided from the command line for nvme-cli +if [[ "$VERSION" =~ ${re} ]]; then + echo "nvme-cli: valid version $VERSION string" + # remove the leading 'v' - ver=${VERSION#v} + ver="${VERSION#v}" else - echo "Invalid version string $VERSION" + echo "nvme-cli: invalid version string ${VERSION}" exit 1 fi -if [[ -n $(git status -s) ]]; then - echo "tree is dirty. abort." +# extract the vesion string from libnvme by using the ref +# defined in libnvme.wrap. +libnvme_ref=$(sed -n "s/revision = \([0-9a-z]\+\)/\1/p" subprojects/libnvme.wrap) +libnvme_VERSION=$(git -C subprojects/libnvme describe "${libnvme_ref}") +if [[ "${libnvme_VERSION}" =~ ${re} ]]; then + echo "libnvme: valid version ${libnvme_VERSION} string" + + # remove the leading 'v' + libnvme_ver="${libnvme_VERSION#v}" +else + echo "libnvme: invalid version string ${libnvme_VERSION}" exit 1 fi +if [[ -n $(git status -s) ]]; then + echo "tree is dirty." + if [[ "${dry_run}" = false ]]; then + exit 1 + fi +fi + if [ "$(git rev-parse --abbrev-ref HEAD)" != "master" ] ; then echo "currently not on master branch. abort." exit 1 @@ -71,14 +94,23 @@ fi # update meson.build sed -i -e "0,/[ \t]version: /s/\([ \t]version: \).*/\1\'$ver\',/" meson.build -git add meson.build -git commit -s -m "build: Update version to $VERSION" +sed -i -e "s/\(dependency('libnvme', version: '>=\)\([\.1-9]\+\)/\1$libnvme_ver/" meson.build +if [[ "${dry_run}" = false ]]; then + git add meson.build + git commit -s -m "build: Update version to $VERSION" +fi if [ "$build_doc" = true ]; then # update documentation ./$doc_dir/update-docs.sh - git add $doc_dir - git commit -s -m "doc: Regenerate all docs for $VERSION" + if [[ "${dry_run}" = false ]]; then + git add $doc_dir + git commit -s -m "doc: Regenerate all docs for $VERSION" + fi +fi + +if [[ "${dry_run}" = true ]]; then + exit 0 fi git tag -s -m "Release $VERSION" "$VERSION" diff --git a/subprojects/libnvme.wrap b/subprojects/libnvme.wrap index a4f55dc..368774a 100644 --- a/subprojects/libnvme.wrap +++ b/subprojects/libnvme.wrap @@ -1,6 +1,6 @@ [wrap-git] url = https://github.com/linux-nvme/libnvme.git -revision = b25dc6102bc000ff4c8061e6448cfb4c034eaed6 +revision = 94dd6d027e482749d8a915aae5fd52ef7323c054 [provide] libnvme = libnvme_dep diff --git a/tests/README b/tests/README index 14b24e5..a5fa708 100644 --- a/tests/README +++ b/tests/README @@ -1,13 +1,20 @@ nvmetests ========= - This contains NVMe unit tests framework. The purpose of this framework + This contains a NVMe tests framework. The purpose of this framework to use nvme cli and test various supported commands and scenarios for NVMe device. - In current implementation this framework uses nvme cli to + In current implementation this framework uses nvme-cli to interact with underlying controller/namespace. + Note these tests expect to run against real hardware and will + read and write data to /dev/nvme0! + + DO NOT RUN THEM IF YOU DO NOT KNOW WHAT YOU ARE DOING! + + You have been warned. + 1. Common Package Dependencies ------------------------------ diff --git a/tests/meson.build b/tests/meson.build index 6f17137..630f35d 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -55,15 +55,6 @@ if runtests.found() endforeach endif -test_uint128 = executable( - 'test-uint128', - ['test-uint128.c', '../util/types.c'], - include_directories: [incdir, '..'], - dependencies: [libnvme_dep], -) - -test('uint128', test_uint128) - python_module = import('python') python = python_module.find_installation('python3') diff --git a/tests/test-uint128.c b/tests/test-uint128.c deleted file mode 100644 index 6301a38..0000000 --- a/tests/test-uint128.c +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -#include -#include -#include - -#include "../util/types.h" - -#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) - -/* create a uint128_t from four uint32_ts. w0 is the most significant value, - * w2 the least */ -#define U128(w0, w1, w2, w3) { .words = { w0, w1, w2, w3 } } - -static int test_rc; - -static void check_str(nvme_uint128_t val, const char *exp, const char *res) -{ - if (!strcmp(res, exp)) - return; - - printf("ERROR: printing {%08x.%08x.%08x.%08x}, got '%s', expected '%s'\n", - val.words[3], val.words[2], val.words[1], val.words[0], - res, exp); - - test_rc = 1; -} - -struct tostr_test { - nvme_uint128_t val; - const char *exp; -}; - -static struct tostr_test tostr_tests[] = { - { U128(0, 0, 0, 0), "0" }, - { U128(0, 0, 0, 1), "1" }, - { U128(0, 0, 0, 10), "10" }, - { U128(4, 3, 2, 1), "316912650112397582603894390785" }, - { - U128(0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff), - "340282366920938463463374607431768211455" - }, -}; - -void tostr_test(struct tostr_test *test) -{ - char *str; - str = uint128_t_to_string(test->val); - check_str(test->val, test->exp, str); -} - -int main(void) -{ - unsigned int i; - - test_rc = 0; - - for (i = 0; i < ARRAY_SIZE(tostr_tests); i++) - tostr_test(&tostr_tests[i]); - - return test_rc ? EXIT_FAILURE : EXIT_SUCCESS; -} diff --git a/unit/meson.build b/unit/meson.build new file mode 100644 index 0000000..d4ff925 --- /dev/null +++ b/unit/meson.build @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +test_uint128 = executable( + 'test-uint128', + ['test-uint128.c', '../util/types.c', '../util/suffix.c'], + include_directories: [incdir, '..'], + dependencies: [libnvme_dep], +) + +test('uint128', test_uint128) + +test_suffix_si_parse = executable( + 'test-suffix-si-parse', + ['test-suffix-si-parse.c', '../util/suffix.c'], + include_directories: [incdir, '..'], + dependencies: [libnvme_dep], +) + +test('suffix_si_parse', test_suffix_si_parse) + +test_uint128_si = executable( + 'test-uint128-si', + ['test-uint128-si.c', '../util/types.c', '../util/suffix.c'], + include_directories: [incdir, '..'], + dependencies: [libnvme_dep], +) + +test('uint128-si', test_uint128_si) diff --git a/unit/test-suffix-si-parse.c b/unit/test-suffix-si-parse.c new file mode 100644 index 0000000..879518b --- /dev/null +++ b/unit/test-suffix-si-parse.c @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include + +#include "../util/suffix.h" +#include "../util/types.h" + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) + +static int test_rc; + +static void check_num(const char *val, int lbas, __u64 exp, __u64 num) +{ + if (exp == num) + return; + + printf("ERROR: printing {%s} (lbas %d), got '%llu', expected '%llu'\n", + val, lbas, (unsigned long long)num, (unsigned long long)exp); + + test_rc = 1; +} + +struct tonum_test { + const char *val; + int lbas; + const __u64 exp; +}; + +static struct tonum_test tonum_tests[] = { + { "11995709440", 512, 11995709440 }, + { "1199570940", 512, 1199570940 }, + { "6.14T", 512, 11992187500 }, + { "6.14T", 520, 11807692307 }, + { "6.14T", 4096, 1499023437 }, + { "6.14", 512, 0 }, + { "6.14#", 512, 0 }, +}; + +void tonum_test(struct tonum_test *test) +{ + __u64 num; + bool suffixed; + + num = suffix_si_parse(test->val, &suffixed); + + if (suffixed) + num /= test->lbas; + + check_num(test->val, test->lbas, test->exp, num); +} + +int main(void) +{ + unsigned int i; + + test_rc = 0; + + for (i = 0; i < ARRAY_SIZE(tonum_tests); i++) + tonum_test(&tonum_tests[i]); + + return test_rc ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/unit/test-uint128-si.c b/unit/test-uint128-si.c new file mode 100644 index 0000000..cc13450 --- /dev/null +++ b/unit/test-uint128-si.c @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include + +#include "../util/types.h" + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) + +/* create a uint128_t from four uint32_ts. w0 is the most significant value, + * w2 the least */ +#define U128(w0, w1, w2, w3) { .words = { w0, w1, w2, w3 } } + +static int test_rc; + +static void check_str(nvme_uint128_t val, __u32 bytes_per_unit, const char *exp, + const char *res) +{ + if (!strcmp(res, exp)) + return; + + printf("ERROR: printing {%08x.%08x.%08x.%08x} (bytes per unit %u), got '%s', expected '%s'\n", + val.words[3], val.words[2], val.words[1], val.words[0], + bytes_per_unit, res, exp); + + test_rc = 1; +} + +struct tostr_test { + nvme_uint128_t val; + __u32 bytes_per_unit; + const char *exp; +}; + +static struct tostr_test tostr_tests[] = { + { U128(0, 0, 0, 0), 1, "0.00 B" }, + { U128(0, 0, 0, 1), 1, "1.00 B" }, + { U128(0, 0, 0, 10), 1, "10.00 B" }, + { U128(4, 3, 2, 1), 1, "316.91 RB" }, + { U128(0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff), 1, + "340282366.92 QB" }, + { U128(0, 0, 0, 0xae0dc2), 1000 * 512, "5.84 TB" }, + { U128(0, 0, 0, 0xf9c546), 1000 * 512, "8.38 TB" }, + { U128(0, 0, 0, 0x4c2aa594), 1000 * 512, "654.27 TB" }, + { U128(0, 0, 0, 0x5b013de8), 1000 * 512, "781.73 TB" }, +}; + +void tostr_test(struct tostr_test *test) +{ + char *str; + str = uint128_t_to_si_string(test->val, test->bytes_per_unit); + check_str(test->val, test->bytes_per_unit, test->exp, str); +} + +int main(void) +{ + unsigned int i; + + test_rc = 0; + + for (i = 0; i < ARRAY_SIZE(tostr_tests); i++) + tostr_test(&tostr_tests[i]); + + return test_rc ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/unit/test-uint128.c b/unit/test-uint128.c new file mode 100644 index 0000000..6301a38 --- /dev/null +++ b/unit/test-uint128.c @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include + +#include "../util/types.h" + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) + +/* create a uint128_t from four uint32_ts. w0 is the most significant value, + * w2 the least */ +#define U128(w0, w1, w2, w3) { .words = { w0, w1, w2, w3 } } + +static int test_rc; + +static void check_str(nvme_uint128_t val, const char *exp, const char *res) +{ + if (!strcmp(res, exp)) + return; + + printf("ERROR: printing {%08x.%08x.%08x.%08x}, got '%s', expected '%s'\n", + val.words[3], val.words[2], val.words[1], val.words[0], + res, exp); + + test_rc = 1; +} + +struct tostr_test { + nvme_uint128_t val; + const char *exp; +}; + +static struct tostr_test tostr_tests[] = { + { U128(0, 0, 0, 0), "0" }, + { U128(0, 0, 0, 1), "1" }, + { U128(0, 0, 0, 10), "10" }, + { U128(4, 3, 2, 1), "316912650112397582603894390785" }, + { + U128(0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff), + "340282366920938463463374607431768211455" + }, +}; + +void tostr_test(struct tostr_test *test) +{ + char *str; + str = uint128_t_to_string(test->val); + check_str(test->val, test->exp, str); +} + +int main(void) +{ + unsigned int i; + + test_rc = 0; + + for (i = 0; i < ARRAY_SIZE(tostr_tests); i++) + tostr_test(&tostr_tests[i]); + + return test_rc ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/util/argconfig.c b/util/argconfig.c index 2c328ff..231a704 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -53,7 +53,7 @@ void argconfig_append_usage(const char *str) append_usage_str = str; } -void print_word_wrapped(const char *s, int indent, int start) +void print_word_wrapped(const char *s, int indent, int start, FILE *stream) { const int width = 76; const char *c, *t; @@ -61,7 +61,7 @@ void print_word_wrapped(const char *s, int indent, int start) int last_line = indent; while (start < indent) { - putc(' ', stderr); + putc(' ', stream); start++; } @@ -78,14 +78,14 @@ void print_word_wrapped(const char *s, int indent, int start) int i; new_line: last_line = (int) (c-s) + start; - putc('\n', stderr); + putc('\n', stream); for (i = 0; i < indent; i++) - putc(' ', stderr); + putc(' ', stream); start = indent; continue; } } - putc(*c, stderr); + putc(*c, stream); } } @@ -115,8 +115,8 @@ static void show_option(const struct argconfig_commandline_options *option) fprintf(stderr, "%s", buffer); if (option->help) { - print_word_wrapped("--- ", 40, b - buffer); - print_word_wrapped(option->help, 44, 44); + print_word_wrapped("--- ", 40, b - buffer, stderr); + print_word_wrapped(option->help, 44, 44, stderr); } fprintf(stderr, "\n"); } @@ -126,20 +126,37 @@ void argconfig_print_help(const char *program_desc, { const struct argconfig_commandline_options *s; - printf("\033[1mUsage: %s\033[0m\n\n", - append_usage_str); + fprintf(stderr, "\033[1mUsage: %s\033[0m\n\n", + append_usage_str); - print_word_wrapped(program_desc, 0, 0); - printf("\n"); + print_word_wrapped(program_desc, 0, 0, stderr); + fprintf(stderr, "\n"); if (!options || !options->option) return; - printf("\n\033[1mOptions:\033[0m\n"); + fprintf(stderr, "\n\033[1mOptions:\033[0m\n"); for (s = options; (s != NULL) && (s->option != NULL); s++) show_option(s); } +int argconfig_parse_byte(const char *opt, const char *str, unsigned char *val) +{ + char *endptr; + unsigned long tmp = strtoul(str, &endptr, 0); + + if (errno || tmp >= 1 << 8 || str == endptr) { + fprintf(stderr, + "Expected byte argument for '%s' but got '%s'!\n", opt, + str); + return -EINVAL; + } + + *val = tmp; + + return 0; +} + int argconfig_parse(int argc, char *argv[], const char *program_desc, const struct argconfig_commandline_options *options) { @@ -244,14 +261,9 @@ int argconfig_parse(int argc, char *argv[], const char *program_desc, } *((int *)value_addr) = tmp; } else if (s->config_type == CFG_BYTE) { - unsigned long tmp = strtoul(optarg, &endptr, 0); - if (errno || tmp >= (1 << 8) || optarg == endptr) { - fprintf(stderr, - "Expected byte argument for '%s' but got '%s'!\n", - long_opts[option_index].name, optarg); + if (argconfig_parse_byte(long_opts[option_index].name, + optarg, (uint8_t *)value_addr)) goto out; - } - *((uint8_t *) value_addr) = tmp; } else if (s->config_type == CFG_SHORT) { unsigned long tmp = strtoul(optarg, &endptr, 0); if (errno || tmp >= (1 << 16) || optarg == endptr) { diff --git a/util/argconfig.h b/util/argconfig.h index b66706a..6ef3b6a 100644 --- a/util/argconfig.h +++ b/util/argconfig.h @@ -37,6 +37,7 @@ #include #include #include +#include enum argconfig_types { CFG_FLAG, @@ -71,9 +72,6 @@ enum argconfig_types { #define OPT_SUFFIX(l, s, v, d) \ {l, s, "IONUM", CFG_LONG_SUFFIX, v, required_argument, d} -#define OPT_LONG(l, s, v, d) \ - {l, s, "NUM", CFG_LONG, v, required_argument, d} - #define OPT_UINT(l, s, v, d) \ {l, s, "NUM", CFG_POSITIVE, v, required_argument, d} @@ -131,7 +129,8 @@ int argconfig_parse_comma_sep_array_short(char *string, unsigned short *ret, int argconfig_parse_comma_sep_array_long(char *string, unsigned long long *ret, unsigned max_length); +int argconfig_parse_byte(const char *opt, const char *str, unsigned char *val); void argconfig_register_help_func(argconfig_help_func * f); -void print_word_wrapped(const char *s, int indent, int start); +void print_word_wrapped(const char *s, int indent, int start, FILE *stream); #endif diff --git a/util/suffix.c b/util/suffix.c index 6cd4f0b..4106958 100644 --- a/util/suffix.c +++ b/util/suffix.c @@ -38,24 +38,59 @@ #include static struct si_suffix { - double magnitude; + long double magnitude; const char *suffix; } si_suffixes[] = { + {1e30, "Q"}, + {1e27, "R"}, + {1e24, "Y"}, + {1e21, "Z"}, + {1e18, "E"}, {1e15, "P"}, {1e12, "T"}, {1e9, "G"}, {1e6, "M"}, {1e3, "k"}, {1e0, ""}, - {1e-3, "m"}, - {1e-6, "u"}, - {1e-9, "n"}, - {1e-12, "p"}, - {1e-15, "f"}, {0} }; const char *suffix_si_get(double *value) +{ + long double value_ld = *value; + const char *suffix = suffix_si_get_ld(&value_ld); + + *value = value_ld; + + return suffix; +} + +uint64_t suffix_si_parse(const char *value, bool *suffixed) +{ + char *suffix; + double ret; + struct si_suffix *s; + + errno = 0; + ret = strtod(value, &suffix); + if (errno) + return 0; + + for (s = si_suffixes; s->magnitude != 0; s++) { + if (suffix[0] == s->suffix[0]) { + if (suffixed && suffix[0] != '\0') + *suffixed = true; + return ret *= s->magnitude; + } + } + + if (suffix[0] != '\0') + errno = EINVAL; + + return (uint64_t)ret; +} + +const char *suffix_si_get_ld(long double *value) { struct si_suffix *s; @@ -114,7 +149,7 @@ uint64_t suffix_binary_parse(const char *value) { char *suffix; errno = 0; - uint64_t ret = strtoll(value, &suffix, 0); + uint64_t ret = strtoull(value, &suffix, 0); if (errno) return 0; diff --git a/util/suffix.h b/util/suffix.h index 4f8e041..b367ce4 100644 --- a/util/suffix.h +++ b/util/suffix.h @@ -33,8 +33,11 @@ #ifndef __ARGCONFIG_SUFFIX_H__ #include +#include const char *suffix_si_get(double *value); +uint64_t suffix_si_parse(const char *value, bool *suffixed); +const char *suffix_si_get_ld(long double *value); const char *suffix_binary_get(long long *value); const char *suffix_dbinary_get(double *value); uint64_t suffix_binary_parse(const char *value); diff --git a/util/types.c b/util/types.c index 06bb8d4..18ced77 100644 --- a/util/types.c +++ b/util/types.c @@ -3,10 +3,12 @@ #include #include #include +#include #include #include "types.h" +#include "util/suffix.h" nvme_uint128_t le128_to_cpu(__u8 *data) { @@ -46,14 +48,22 @@ uint64_t int48_to_long(__u8 *data) char *uint128_t_to_string(nvme_uint128_t val) { - static char str[40]; - int idx = 40; + static char str[60]; + int idx = 60; __u64 div, rem; + char *sep = localeconv()->thousands_sep; + int len = sep ? strlen(sep) : 0; + int i; /* terminate at the end, and build up from the ones */ str[--idx] = '\0'; do { + if (len && !((sizeof(str) - idx) % (3 + len))) { + for (i = 0; i < len; i++) + str[--idx] = sep[i]; + } + rem = val.words[0]; div = rem / 10; @@ -78,6 +88,35 @@ char *uint128_t_to_string(nvme_uint128_t val) return str + idx; } +static long double uint128_t_to_double(nvme_uint128_t data) +{ + int i; + long double result = 0; + + for (i = 0; i < sizeof(data.words) / sizeof(*data.words); i++) { + result *= 4294967296; + result += data.words[i]; + } + + return result; +} + +char *uint128_t_to_si_string(nvme_uint128_t val, __u32 bytes_per_unit) +{ + static char str[40]; + long double bytes = uint128_t_to_double(val) * bytes_per_unit; + const char *suffix = suffix_si_get_ld(&bytes); + int n = snprintf(str, sizeof(str), "%.2Lf %sB", bytes, suffix); + + if (n <= 0) + return ""; + + if (n >= sizeof(str)) + str[sizeof(str) - 1] = '\0'; + + return str; +} + const char *util_uuid_to_string(unsigned char uuid[NVME_UUID_LEN]) { static char uuid_str[NVME_UUID_LEN_STRING]; diff --git a/util/types.h b/util/types.h index 6d45108..2e88717 100644 --- a/util/types.h +++ b/util/types.h @@ -29,6 +29,7 @@ long double int128_to_double(__u8 *data); uint64_t int48_to_long(__u8 *data); char *uint128_t_to_string(nvme_uint128_t val); +char *uint128_t_to_si_string(nvme_uint128_t val, __u32 bytes_per_unit); const char *util_uuid_to_string(unsigned char uuid[NVME_UUID_LEN]); const char *util_fw_to_string(char *c); -- cgit v1.2.3