summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2023-01-31 04:13:00 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2023-01-31 04:13:00 +0000
commitdc3f3471f8a00ce0c8fb4cbf2a31e299696f3bbc (patch)
treee97b4f25c511372d73bdd96c389c5f468d99138a
parentAdding upstream version 2.2.1. (diff)
downloadnvme-cli-dc3f3471f8a00ce0c8fb4cbf2a31e299696f3bbc.tar.xz
nvme-cli-dc3f3471f8a00ce0c8fb4cbf2a31e299696f3bbc.zip
Adding upstream version 2.3.upstream/2.3
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--.github/AppImageBuilder.yml60
-rw-r--r--.github/azure-pipelines.yml35
-rw-r--r--.github/workflows/appimage.yml33
-rw-r--r--.github/workflows/build.yml (renamed from .github/workflows/meson.yml)31
-rw-r--r--.github/workflows/release.yml4
-rw-r--r--.gitignore4
-rw-r--r--Documentation/cmd-plugins.txt3
-rw-r--r--Documentation/meson.build11
-rw-r--r--Documentation/nvme-admin-passthru.14
-rw-r--r--Documentation/nvme-admin-passthru.html2
-rw-r--r--Documentation/nvme-ana-log.14
-rw-r--r--Documentation/nvme-ana-log.html2
-rw-r--r--Documentation/nvme-attach-ns.14
-rw-r--r--Documentation/nvme-attach-ns.html2
-rw-r--r--Documentation/nvme-boot-part-log.14
-rw-r--r--Documentation/nvme-boot-part-log.html2
-rw-r--r--Documentation/nvme-capacity-mgmt.14
-rw-r--r--Documentation/nvme-capacity-mgmt.html2
-rw-r--r--Documentation/nvme-changed-ns-list-log.14
-rw-r--r--Documentation/nvme-changed-ns-list-log.html2
-rw-r--r--Documentation/nvme-cmdset-ind-id-ns.14
-rw-r--r--Documentation/nvme-cmdset-ind-id-ns.html2
-rw-r--r--Documentation/nvme-compare.110
-rw-r--r--Documentation/nvme-compare.html14
-rw-r--r--Documentation/nvme-compare.txt5
-rw-r--r--Documentation/nvme-connect-all.112
-rw-r--r--Documentation/nvme-connect-all.html12
-rw-r--r--Documentation/nvme-connect.110
-rw-r--r--Documentation/nvme-connect.html8
-rw-r--r--Documentation/nvme-copy.14
-rw-r--r--Documentation/nvme-copy.html2
-rw-r--r--Documentation/nvme-create-ns.154
-rw-r--r--Documentation/nvme-create-ns.html68
-rw-r--r--Documentation/nvme-create-ns.txt21
-rw-r--r--Documentation/nvme-delete-ns.14
-rw-r--r--Documentation/nvme-delete-ns.html2
-rw-r--r--Documentation/nvme-dera-stat.14
-rw-r--r--Documentation/nvme-dera-stat.html2
-rw-r--r--Documentation/nvme-detach-ns.14
-rw-r--r--Documentation/nvme-detach-ns.html2
-rw-r--r--Documentation/nvme-device-self-test.113
-rw-r--r--Documentation/nvme-device-self-test.html21
-rw-r--r--Documentation/nvme-device-self-test.txt15
-rw-r--r--Documentation/nvme-dim.14
-rw-r--r--Documentation/nvme-dim.html2
-rw-r--r--Documentation/nvme-dir-receive.14
-rw-r--r--Documentation/nvme-dir-receive.html2
-rw-r--r--Documentation/nvme-dir-send.14
-rw-r--r--Documentation/nvme-dir-send.html2
-rw-r--r--Documentation/nvme-disconnect-all.14
-rw-r--r--Documentation/nvme-disconnect-all.html2
-rw-r--r--Documentation/nvme-disconnect.14
-rw-r--r--Documentation/nvme-disconnect.html2
-rw-r--r--Documentation/nvme-discover.112
-rw-r--r--Documentation/nvme-discover.html12
-rw-r--r--Documentation/nvme-dsm.14
-rw-r--r--Documentation/nvme-dsm.html2
-rw-r--r--Documentation/nvme-effects-log.14
-rw-r--r--Documentation/nvme-effects-log.html2
-rw-r--r--Documentation/nvme-endurance-event-agg-log.14
-rw-r--r--Documentation/nvme-endurance-event-agg-log.html2
-rw-r--r--Documentation/nvme-endurance-log.14
-rw-r--r--Documentation/nvme-endurance-log.html2
-rw-r--r--Documentation/nvme-error-log.14
-rw-r--r--Documentation/nvme-error-log.html2
-rw-r--r--Documentation/nvme-fdp-configs.169
-rw-r--r--Documentation/nvme-fdp-configs.html834
-rw-r--r--Documentation/nvme-fdp-configs.txt42
-rw-r--r--Documentation/nvme-fdp-events.169
-rw-r--r--Documentation/nvme-fdp-events.html834
-rw-r--r--Documentation/nvme-fdp-events.txt42
-rw-r--r--Documentation/nvme-fdp-set-events.164
-rw-r--r--Documentation/nvme-fdp-set-events.html824
-rw-r--r--Documentation/nvme-fdp-set-events.txt39
-rw-r--r--Documentation/nvme-fdp-stats.163
-rw-r--r--Documentation/nvme-fdp-stats.html822
-rw-r--r--Documentation/nvme-fdp-stats.txt37
-rw-r--r--Documentation/nvme-fdp-status.163
-rw-r--r--Documentation/nvme-fdp-status.html822
-rw-r--r--Documentation/nvme-fdp-status.txt37
-rw-r--r--Documentation/nvme-fdp-update.154
-rw-r--r--Documentation/nvme-fdp-update.html809
-rw-r--r--Documentation/nvme-fdp-update.txt31
-rw-r--r--Documentation/nvme-fdp-usage.163
-rw-r--r--Documentation/nvme-fdp-usage.html823
-rw-r--r--Documentation/nvme-fdp-usage.txt38
-rw-r--r--Documentation/nvme-fid-support-effects-log.14
-rw-r--r--Documentation/nvme-fid-support-effects-log.html2
-rw-r--r--Documentation/nvme-flush.14
-rw-r--r--Documentation/nvme-flush.html2
-rw-r--r--Documentation/nvme-format.14
-rw-r--r--Documentation/nvme-format.html2
-rw-r--r--Documentation/nvme-fw-commit.14
-rw-r--r--Documentation/nvme-fw-commit.html2
-rw-r--r--Documentation/nvme-fw-download.14
-rw-r--r--Documentation/nvme-fw-download.html2
-rw-r--r--Documentation/nvme-fw-log.14
-rw-r--r--Documentation/nvme-fw-log.html2
-rw-r--r--Documentation/nvme-gen-hostnqn.14
-rw-r--r--Documentation/nvme-gen-hostnqn.html2
-rw-r--r--Documentation/nvme-get-feature.14
-rw-r--r--Documentation/nvme-get-feature.html2
-rw-r--r--Documentation/nvme-get-lba-status.14
-rw-r--r--Documentation/nvme-get-lba-status.html2
-rw-r--r--Documentation/nvme-get-log.14
-rw-r--r--Documentation/nvme-get-log.html2
-rw-r--r--Documentation/nvme-get-ns-id.14
-rw-r--r--Documentation/nvme-get-ns-id.html2
-rw-r--r--Documentation/nvme-get-property.14
-rw-r--r--Documentation/nvme-get-property.html2
-rw-r--r--Documentation/nvme-help.14
-rw-r--r--Documentation/nvme-help.html2
-rw-r--r--Documentation/nvme-huawei-id-ctrl.14
-rw-r--r--Documentation/nvme-huawei-id-ctrl.html2
-rw-r--r--Documentation/nvme-huawei-list.14
-rw-r--r--Documentation/nvme-huawei-list.html2
-rw-r--r--Documentation/nvme-id-ctrl.14
-rw-r--r--Documentation/nvme-id-ctrl.html2
-rw-r--r--Documentation/nvme-id-domain.14
-rw-r--r--Documentation/nvme-id-domain.html2
-rw-r--r--Documentation/nvme-id-iocs.14
-rw-r--r--Documentation/nvme-id-iocs.html2
-rw-r--r--Documentation/nvme-id-ns.14
-rw-r--r--Documentation/nvme-id-ns.html2
-rw-r--r--Documentation/nvme-id-nvmset.14
-rw-r--r--Documentation/nvme-id-nvmset.html2
-rw-r--r--Documentation/nvme-inspur-nvme-vendor-log.171
-rw-r--r--Documentation/nvme-inspur-nvme-vendor-log.html803
-rw-r--r--Documentation/nvme-inspur-nvme-vendor-log.txt37
-rw-r--r--Documentation/nvme-intel-id-ctrl.14
-rw-r--r--Documentation/nvme-intel-id-ctrl.html2
-rw-r--r--Documentation/nvme-intel-internal-log.14
-rw-r--r--Documentation/nvme-intel-internal-log.html2
-rw-r--r--Documentation/nvme-intel-lat-stats.14
-rw-r--r--Documentation/nvme-intel-lat-stats.html2
-rw-r--r--Documentation/nvme-intel-market-name.14
-rw-r--r--Documentation/nvme-intel-market-name.html2
-rw-r--r--Documentation/nvme-intel-smart-log-add.14
-rw-r--r--Documentation/nvme-intel-smart-log-add.html2
-rw-r--r--Documentation/nvme-intel-temp-stats.14
-rw-r--r--Documentation/nvme-intel-temp-stats.html2
-rw-r--r--Documentation/nvme-io-mgmt-recv.172
-rw-r--r--Documentation/nvme-io-mgmt-recv.html853
-rw-r--r--Documentation/nvme-io-mgmt-recv.txt55
-rw-r--r--Documentation/nvme-io-mgmt-send.172
-rw-r--r--Documentation/nvme-io-mgmt-send.html852
-rw-r--r--Documentation/nvme-io-mgmt-send.txt54
-rw-r--r--Documentation/nvme-io-passthru.14
-rw-r--r--Documentation/nvme-io-passthru.html2
-rw-r--r--Documentation/nvme-lba-status-log.14
-rw-r--r--Documentation/nvme-lba-status-log.html2
-rw-r--r--Documentation/nvme-list-ctrl.14
-rw-r--r--Documentation/nvme-list-ctrl.html2
-rw-r--r--Documentation/nvme-list-endgrp.14
-rw-r--r--Documentation/nvme-list-endgrp.html2
-rw-r--r--Documentation/nvme-list-ns.14
-rw-r--r--Documentation/nvme-list-ns.html2
-rw-r--r--Documentation/nvme-list-subsys.14
-rw-r--r--Documentation/nvme-list-subsys.html2
-rw-r--r--Documentation/nvme-list.14
-rw-r--r--Documentation/nvme-list.html2
-rw-r--r--Documentation/nvme-lockdown.14
-rw-r--r--Documentation/nvme-lockdown.html2
-rw-r--r--Documentation/nvme-mi-cmd-support-effects-log.14
-rw-r--r--Documentation/nvme-mi-cmd-support-effects-log.html2
-rw-r--r--Documentation/nvme-micron-clear-pcie-errors.14
-rw-r--r--Documentation/nvme-micron-clear-pcie-errors.html2
-rw-r--r--Documentation/nvme-micron-internal-log.14
-rw-r--r--Documentation/nvme-micron-internal-log.html2
-rw-r--r--Documentation/nvme-micron-nand-stats.14
-rw-r--r--Documentation/nvme-micron-nand-stats.html2
-rw-r--r--Documentation/nvme-micron-pcie-stats.14
-rw-r--r--Documentation/nvme-micron-pcie-stats.html2
-rw-r--r--Documentation/nvme-micron-selective-download.14
-rw-r--r--Documentation/nvme-micron-selective-download.html2
-rw-r--r--Documentation/nvme-micron-smart-add-log.14
-rw-r--r--Documentation/nvme-micron-smart-add-log.html2
-rw-r--r--Documentation/nvme-micron-temperature-stats.14
-rw-r--r--Documentation/nvme-micron-temperature-stats.html2
-rw-r--r--Documentation/nvme-netapp-ontapdevices.14
-rw-r--r--Documentation/nvme-netapp-ontapdevices.html2
-rw-r--r--Documentation/nvme-netapp-smdevices.14
-rw-r--r--Documentation/nvme-netapp-smdevices.html2
-rw-r--r--Documentation/nvme-ns-descs.14
-rw-r--r--Documentation/nvme-ns-descs.html2
-rw-r--r--Documentation/nvme-ns-rescan.14
-rw-r--r--Documentation/nvme-ns-rescan.html2
-rw-r--r--Documentation/nvme-nvm-id-ctrl.14
-rw-r--r--Documentation/nvme-nvm-id-ctrl.html2
-rw-r--r--Documentation/nvme-ocp-clear-fw-activate-history.178
-rw-r--r--Documentation/nvme-ocp-clear-fw-activate-history.html824
-rw-r--r--Documentation/nvme-ocp-clear-fw-activate-history.txt49
-rw-r--r--Documentation/nvme-ocp-latency-monitor-log.14
-rw-r--r--Documentation/nvme-ocp-latency-monitor-log.html2
-rw-r--r--Documentation/nvme-ocp-smart-add-log.14
-rw-r--r--Documentation/nvme-ocp-smart-add-log.html2
-rw-r--r--Documentation/nvme-persistent-event-log.14
-rw-r--r--Documentation/nvme-persistent-event-log.html2
-rw-r--r--Documentation/nvme-pred-lat-event-agg-log.14
-rw-r--r--Documentation/nvme-pred-lat-event-agg-log.html2
-rw-r--r--Documentation/nvme-predictable-lat-log.14
-rw-r--r--Documentation/nvme-predictable-lat-log.html2
-rw-r--r--Documentation/nvme-primary-ctrl-caps.14
-rw-r--r--Documentation/nvme-primary-ctrl-caps.html2
-rw-r--r--Documentation/nvme-read.110
-rw-r--r--Documentation/nvme-read.html14
-rw-r--r--Documentation/nvme-read.txt5
-rw-r--r--Documentation/nvme-reset.14
-rw-r--r--Documentation/nvme-reset.html2
-rw-r--r--Documentation/nvme-resv-acquire.14
-rw-r--r--Documentation/nvme-resv-acquire.html2
-rw-r--r--Documentation/nvme-resv-notif-log.14
-rw-r--r--Documentation/nvme-resv-notif-log.html2
-rw-r--r--Documentation/nvme-resv-register.14
-rw-r--r--Documentation/nvme-resv-register.html2
-rw-r--r--Documentation/nvme-resv-release.14
-rw-r--r--Documentation/nvme-resv-release.html2
-rw-r--r--Documentation/nvme-resv-report.14
-rw-r--r--Documentation/nvme-resv-report.html2
-rw-r--r--Documentation/nvme-rpmb.14
-rw-r--r--Documentation/nvme-rpmb.html2
-rw-r--r--Documentation/nvme-sanitize-log.14
-rw-r--r--Documentation/nvme-sanitize-log.html2
-rw-r--r--Documentation/nvme-sanitize.121
-rw-r--r--Documentation/nvme-sanitize.html15
-rw-r--r--Documentation/nvme-sanitize.txt13
-rw-r--r--Documentation/nvme-seagate-clear-fw-activate-history.14
-rw-r--r--Documentation/nvme-seagate-clear-fw-activate-history.html2
-rw-r--r--Documentation/nvme-seagate-clear-pcie-correctable-errors.14
-rw-r--r--Documentation/nvme-seagate-clear-pcie-correctable-errors.html2
-rw-r--r--Documentation/nvme-seagate-cloud-SSD-plugin-version.14
-rw-r--r--Documentation/nvme-seagate-cloud-SSD-plugin-version.html2
-rw-r--r--Documentation/nvme-seagate-get-ctrl-tele.14
-rw-r--r--Documentation/nvme-seagate-get-ctrl-tele.html2
-rw-r--r--Documentation/nvme-seagate-get-host-tele.14
-rw-r--r--Documentation/nvme-seagate-get-host-tele.html2
-rw-r--r--Documentation/nvme-seagate-help.14
-rw-r--r--Documentation/nvme-seagate-help.html2
-rw-r--r--Documentation/nvme-seagate-plugin-version.14
-rw-r--r--Documentation/nvme-seagate-plugin-version.html2
-rw-r--r--Documentation/nvme-seagate-version.14
-rw-r--r--Documentation/nvme-seagate-version.html2
-rw-r--r--Documentation/nvme-seagate-vs-fw-activate-history.14
-rw-r--r--Documentation/nvme-seagate-vs-fw-activate-history.html2
-rw-r--r--Documentation/nvme-seagate-vs-internal-log.14
-rw-r--r--Documentation/nvme-seagate-vs-internal-log.html2
-rw-r--r--Documentation/nvme-seagate-vs-log-page-sup.14
-rw-r--r--Documentation/nvme-seagate-vs-log-page-sup.html2
-rw-r--r--Documentation/nvme-seagate-vs-pcie-stats.14
-rw-r--r--Documentation/nvme-seagate-vs-pcie-stats.html2
-rw-r--r--Documentation/nvme-seagate-vs-smart-add-log.14
-rw-r--r--Documentation/nvme-seagate-vs-smart-add-log.html2
-rw-r--r--Documentation/nvme-seagate-vs-temperature-stats.14
-rw-r--r--Documentation/nvme-seagate-vs-temperature-stats.html2
-rw-r--r--Documentation/nvme-security-recv.14
-rw-r--r--Documentation/nvme-security-recv.html2
-rw-r--r--Documentation/nvme-security-send.14
-rw-r--r--Documentation/nvme-security-send.html2
-rw-r--r--Documentation/nvme-self-test-log.14
-rw-r--r--Documentation/nvme-self-test-log.html2
-rw-r--r--Documentation/nvme-set-feature.14
-rw-r--r--Documentation/nvme-set-feature.html2
-rw-r--r--Documentation/nvme-set-property.14
-rw-r--r--Documentation/nvme-set-property.html2
-rw-r--r--Documentation/nvme-show-hostnqn.16
-rw-r--r--Documentation/nvme-show-hostnqn.html4
-rw-r--r--Documentation/nvme-show-regs.14
-rw-r--r--Documentation/nvme-show-regs.html2
-rw-r--r--Documentation/nvme-show-topology.14
-rw-r--r--Documentation/nvme-show-topology.html2
-rw-r--r--Documentation/nvme-smart-log.14
-rw-r--r--Documentation/nvme-smart-log.html2
-rw-r--r--Documentation/nvme-subsystem-reset.14
-rw-r--r--Documentation/nvme-subsystem-reset.html2
-rw-r--r--Documentation/nvme-supported-log-pages.14
-rw-r--r--Documentation/nvme-supported-log-pages.html2
-rw-r--r--Documentation/nvme-telemetry-log.14
-rw-r--r--Documentation/nvme-telemetry-log.html2
-rw-r--r--Documentation/nvme-toshiba-clear-pcie-correctable-errors.14
-rw-r--r--Documentation/nvme-toshiba-clear-pcie-correctable-errors.html2
-rw-r--r--Documentation/nvme-toshiba-vs-internal-log.14
-rw-r--r--Documentation/nvme-toshiba-vs-internal-log.html2
-rw-r--r--Documentation/nvme-toshiba-vs-smart-add-log.14
-rw-r--r--Documentation/nvme-toshiba-vs-smart-add-log.html2
-rw-r--r--Documentation/nvme-transcend-badblock.14
-rw-r--r--Documentation/nvme-transcend-badblock.html2
-rw-r--r--Documentation/nvme-transcend-healthvalue.14
-rw-r--r--Documentation/nvme-transcend-healthvalue.html2
-rw-r--r--Documentation/nvme-verify.14
-rw-r--r--Documentation/nvme-verify.html2
-rw-r--r--Documentation/nvme-virtium-save-smart-to-vtview-log.14
-rw-r--r--Documentation/nvme-virtium-save-smart-to-vtview-log.html2
-rw-r--r--Documentation/nvme-virtium-show-identify.14
-rw-r--r--Documentation/nvme-virtium-show-identify.html2
-rw-r--r--Documentation/nvme-wdc-cap-diag.14
-rw-r--r--Documentation/nvme-wdc-cap-diag.html2
-rw-r--r--Documentation/nvme-wdc-capabilities.14
-rw-r--r--Documentation/nvme-wdc-capabilities.html2
-rw-r--r--Documentation/nvme-wdc-clear-assert-dump.14
-rw-r--r--Documentation/nvme-wdc-clear-assert-dump.html2
-rw-r--r--Documentation/nvme-wdc-clear-fw-activate-history.14
-rw-r--r--Documentation/nvme-wdc-clear-fw-activate-history.html2
-rw-r--r--Documentation/nvme-wdc-clear-pcie-correctable-errors.14
-rw-r--r--Documentation/nvme-wdc-clear-pcie-correctable-errors.html2
-rw-r--r--Documentation/nvme-wdc-cloud-SSD-plugin-version.14
-rw-r--r--Documentation/nvme-wdc-cloud-SSD-plugin-version.html2
-rw-r--r--Documentation/nvme-wdc-cloud-boot-SSD-version.14
-rw-r--r--Documentation/nvme-wdc-cloud-boot-SSD-version.html2
-rw-r--r--Documentation/nvme-wdc-drive-essentials.14
-rw-r--r--Documentation/nvme-wdc-drive-essentials.html2
-rw-r--r--Documentation/nvme-wdc-drive-log.14
-rw-r--r--Documentation/nvme-wdc-drive-log.html2
-rw-r--r--Documentation/nvme-wdc-drive-resize.14
-rw-r--r--Documentation/nvme-wdc-drive-resize.html2
-rw-r--r--Documentation/nvme-wdc-enc-get-log.14
-rw-r--r--Documentation/nvme-wdc-enc-get-log.html2
-rw-r--r--Documentation/nvme-wdc-get-crash-dump.14
-rw-r--r--Documentation/nvme-wdc-get-crash-dump.html2
-rw-r--r--Documentation/nvme-wdc-get-dev-capabilities-log.14
-rw-r--r--Documentation/nvme-wdc-get-dev-capabilities-log.html2
-rw-r--r--Documentation/nvme-wdc-get-drive-status.14
-rw-r--r--Documentation/nvme-wdc-get-drive-status.html2
-rw-r--r--Documentation/nvme-wdc-get-error-recovery-log.14
-rw-r--r--Documentation/nvme-wdc-get-error-recovery-log.html2
-rw-r--r--Documentation/nvme-wdc-get-latency-monitor-log.14
-rw-r--r--Documentation/nvme-wdc-get-latency-monitor-log.html2
-rw-r--r--Documentation/nvme-wdc-get-pfail-dump.14
-rw-r--r--Documentation/nvme-wdc-get-pfail-dump.html2
-rw-r--r--Documentation/nvme-wdc-get-unsupported-reqs-log.14
-rw-r--r--Documentation/nvme-wdc-get-unsupported-reqs-log.html2
-rw-r--r--Documentation/nvme-wdc-id-ctrl.14
-rw-r--r--Documentation/nvme-wdc-id-ctrl.html2
-rw-r--r--Documentation/nvme-wdc-log-page-directory.14
-rw-r--r--Documentation/nvme-wdc-log-page-directory.html2
-rw-r--r--Documentation/nvme-wdc-namespace-resize.14
-rw-r--r--Documentation/nvme-wdc-namespace-resize.html2
-rw-r--r--Documentation/nvme-wdc-purge-monitor.14
-rw-r--r--Documentation/nvme-wdc-purge-monitor.html2
-rw-r--r--Documentation/nvme-wdc-purge.14
-rw-r--r--Documentation/nvme-wdc-purge.html2
-rw-r--r--Documentation/nvme-wdc-vs-cloud-log.14
-rw-r--r--Documentation/nvme-wdc-vs-cloud-log.html2
-rw-r--r--Documentation/nvme-wdc-vs-device-waf.14
-rw-r--r--Documentation/nvme-wdc-vs-device-waf.html2
-rw-r--r--Documentation/nvme-wdc-vs-drive-info.14
-rw-r--r--Documentation/nvme-wdc-vs-drive-info.html2
-rw-r--r--Documentation/nvme-wdc-vs-error-reason-identifier.14
-rw-r--r--Documentation/nvme-wdc-vs-error-reason-identifier.html2
-rw-r--r--Documentation/nvme-wdc-vs-fw-activate-history.14
-rw-r--r--Documentation/nvme-wdc-vs-fw-activate-history.html2
-rw-r--r--Documentation/nvme-wdc-vs-hw-rev-log.14
-rw-r--r--Documentation/nvme-wdc-vs-hw-rev-log.html2
-rw-r--r--Documentation/nvme-wdc-vs-internal-log.14
-rw-r--r--Documentation/nvme-wdc-vs-internal-log.html2
-rw-r--r--Documentation/nvme-wdc-vs-nand-stats.14
-rw-r--r--Documentation/nvme-wdc-vs-nand-stats.html2
-rw-r--r--Documentation/nvme-wdc-vs-smart-add-log.14
-rw-r--r--Documentation/nvme-wdc-vs-smart-add-log.html2
-rw-r--r--Documentation/nvme-wdc-vs-telemetry-controller-option.14
-rw-r--r--Documentation/nvme-wdc-vs-telemetry-controller-option.html2
-rw-r--r--Documentation/nvme-wdc-vs-temperature-stats.14
-rw-r--r--Documentation/nvme-wdc-vs-temperature-stats.html2
-rw-r--r--Documentation/nvme-write-uncor.14
-rw-r--r--Documentation/nvme-write-uncor.html2
-rw-r--r--Documentation/nvme-write-zeroes.14
-rw-r--r--Documentation/nvme-write-zeroes.html2
-rw-r--r--Documentation/nvme-write.110
-rw-r--r--Documentation/nvme-write.html14
-rw-r--r--Documentation/nvme-write.txt5
-rw-r--r--Documentation/nvme-zns-changed-zone-list.14
-rw-r--r--Documentation/nvme-zns-changed-zone-list.html2
-rw-r--r--Documentation/nvme-zns-close-zone.14
-rw-r--r--Documentation/nvme-zns-close-zone.html2
-rw-r--r--Documentation/nvme-zns-finish-zone.14
-rw-r--r--Documentation/nvme-zns-finish-zone.html2
-rw-r--r--Documentation/nvme-zns-id-ctrl.14
-rw-r--r--Documentation/nvme-zns-id-ctrl.html2
-rw-r--r--Documentation/nvme-zns-id-ns.14
-rw-r--r--Documentation/nvme-zns-id-ns.html2
-rw-r--r--Documentation/nvme-zns-offline-zone.14
-rw-r--r--Documentation/nvme-zns-offline-zone.html2
-rw-r--r--Documentation/nvme-zns-open-zone.14
-rw-r--r--Documentation/nvme-zns-open-zone.html2
-rw-r--r--Documentation/nvme-zns-report-zones.14
-rw-r--r--Documentation/nvme-zns-report-zones.html2
-rw-r--r--Documentation/nvme-zns-reset-zone.14
-rw-r--r--Documentation/nvme-zns-reset-zone.html2
-rw-r--r--Documentation/nvme-zns-set-zone-desc.14
-rw-r--r--Documentation/nvme-zns-set-zone-desc.html2
-rw-r--r--Documentation/nvme-zns-zone-append.14
-rw-r--r--Documentation/nvme-zns-zone-append.html2
-rw-r--r--Documentation/nvme-zns-zone-mgmt-recv.14
-rw-r--r--Documentation/nvme-zns-zone-mgmt-recv.html2
-rw-r--r--Documentation/nvme-zns-zone-mgmt-send.14
-rw-r--r--Documentation/nvme-zns-zone-mgmt-send.html2
-rw-r--r--Documentation/nvme.19
-rw-r--r--Documentation/nvme.html10
-rw-r--r--completions/_nvme3
-rw-r--r--completions/bash-nvme-completion.sh248
-rw-r--r--fabrics.c294
-rw-r--r--meson.build17
-rw-r--r--meson_options.txt5
-rw-r--r--nvme-builtin.h2
-rw-r--r--nvme-print.c529
-rw-r--r--nvme-print.h11
-rw-r--r--nvme-wrap.c56
-rw-r--r--nvme-wrap.h21
-rw-r--r--nvme.c1168
-rw-r--r--nvme.h6
-rw-r--r--plugin.c4
-rw-r--r--plugins/fdp/fdp.c537
-rw-r--r--plugins/fdp/fdp.h24
-rw-r--r--plugins/inspur/inspur-nvme.c235
-rw-r--r--plugins/inspur/inspur-nvme.h18
-rw-r--r--plugins/inspur/inspur-utils.h175
-rw-r--r--plugins/memblaze/memblaze-nvme.c203
-rw-r--r--plugins/memblaze/memblaze-nvme.h7
-rw-r--r--plugins/memblaze/memblaze-utils.h13
-rw-r--r--plugins/meson.build4
-rw-r--r--plugins/micron/micron-nvme.c1
-rw-r--r--plugins/ocp/meson.build6
-rw-r--r--plugins/ocp/ocp-clear-fw-update-history.c73
-rw-r--r--plugins/ocp/ocp-clear-fw-update-history.h9
-rw-r--r--plugins/ocp/ocp-nvme.c7
-rw-r--r--plugins/ocp/ocp-nvme.h11
-rw-r--r--plugins/ocp/ocp-utils.c30
-rw-r--r--plugins/ocp/ocp-utils.h18
-rw-r--r--plugins/scaleflux/sfx-nvme.c2
-rw-r--r--plugins/solidigm/solidigm-nvme.c9
-rw-r--r--plugins/solidigm/solidigm-nvme.h5
-rwxr-xr-xrelease.sh58
-rw-r--r--subprojects/libnvme.wrap2
-rw-r--r--tests/README11
-rw-r--r--tests/meson.build9
-rw-r--r--unit/meson.build28
-rw-r--r--unit/test-suffix-si-parse.c64
-rw-r--r--unit/test-uint128-si.c66
-rw-r--r--unit/test-uint128.c (renamed from tests/test-uint128.c)0
-rw-r--r--util/argconfig.c50
-rw-r--r--util/argconfig.h7
-rw-r--r--util/suffix.c49
-rw-r--r--util/suffix.h3
-rw-r--r--util/types.c43
-rw-r--r--util/types.h1
444 files changed, 14594 insertions, 1435 deletions
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/meson.yml b/.github/workflows/build.yml
index ee80af3..805a962 100644
--- a/.github/workflows/meson.yml
+++ b/.github/workflows/build.yml
@@ -1,4 +1,5 @@
-name: nvme-cli meson CI
+---
+name: build
on:
push:
@@ -9,24 +10,20 @@ on:
workflow_dispatch:
jobs:
- build-disto:
+ build-distro:
runs-on: ubuntu-latest
steps:
- - name: install libraries
- run: sudo apt-get install libjson-c-dev libhugetlbfs-dev
+ - 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'
- # - name: install python dependencies
- # run: |
- # python -m pip install --upgrade pip
- # pip install nose nose2
- uses: BSFishy/meson-build@v1.0.3
with:
setup-options: --werror
- action: build
+ action: test
build-cross-armhf:
runs-on: ubuntu-latest
@@ -44,7 +41,7 @@ jobs:
- name: install armhf compiler
run: sudo apt install gcc-arm-linux-gnueabihf pkg-config
- name: install libraries
- run: sudo apt install uuid-dev:armhf libjson-c-dev:armhf
+ run: sudo apt install uuid-dev:armhf libjson-c-dev:armhf libdbus-1-dev:armhf
- uses: actions/checkout@v3
- uses: BSFishy/meson-build@v1.0.3
with:
@@ -74,7 +71,7 @@ jobs:
- name: install powerpc64le compiler
run: sudo apt install gcc-powerpc64le-linux-gnu pkg-config
- name: install libraries
- run: sudo apt install uuid-dev:ppc64el libjson-c-dev:ppc64el
+ run: sudo apt install uuid-dev:ppc64el libjson-c-dev:ppc64el libdbus-1-dev:ppc64el
- uses: actions/checkout@v3
- uses: BSFishy/meson-build@v1.0.3
with:
@@ -91,7 +88,7 @@ jobs:
build-fallback:
runs-on: ubuntu-latest
steps:
- - name: install libraries
+ - name: install dependencies
run: sudo apt-get install -y libpam-dev libcap-ng-dev
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
@@ -99,15 +96,15 @@ jobs:
python-version: '3.x'
- uses: BSFishy/meson-build@v1.0.3
with:
- setup-options: --werror -Duuid:werror=false --wrap-mode=forcefallback
+ setup-options: --werror -Dopenssl:werror=false -Ddbus:werror=false --wrap-mode=forcefallback
options: --verbose
- action: build
+ action: test
meson-version: 0.61.2
build-static:
runs-on: ubuntu-latest
steps:
- - name: install libraries
+ - name: install dependencies
run: sudo apt-get install -y libpam-dev libcap-ng-dev
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
@@ -115,7 +112,7 @@ jobs:
python-version: '3.x'
- uses: BSFishy/meson-build@v1.0.3
with:
- setup-options: --werror -Duuid:werror=false --wrap-mode=forcefallback --default-library=static
+ setup-options: --werror -Dopenssl:werror=false -Ddbus:werror=false --wrap-mode=forcefallback --default-library=static
options: --verbose
- action: build
+ action: test
meson-version: 0.61.2
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index e0255a8..e4ccb70 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,11 +1,11 @@
-name: Releases
+---
+name: releases
on:
push:
branches: [ master ]
tags:
- '**'
-
jobs:
build:
runs-on: ubuntu-latest
diff --git a/.gitignore b/.gitignore
index 0745eff..da4804c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,9 +10,11 @@ subprojects/*
!subprojects/*.wrap
cscope.*
+compile_commands.json
tests/__pycache__
tests/nvmetests
tests/*.pyc
-.build \ No newline at end of file
+.build
+.cache
diff --git a/Documentation/cmd-plugins.txt b/Documentation/cmd-plugins.txt
index 2ab6c68..f767603 100644
--- a/Documentation/cmd-plugins.txt
+++ b/Documentation/cmd-plugins.txt
@@ -198,3 +198,6 @@ linknvme:nvme-zns-zone-mgmt-send[1]::
linknvme:nvme-zns-zrwa-flush-zone[1]::
Flush LBAs associated with a ZRWA to a zone
+
+linknvme:nvme-inspur-nvme-vendor-log[1]::
+ NVMe Inspur Device Vendor log page request
diff --git a/Documentation/meson.build b/Documentation/meson.build
index bb0c972..a526b99 100644
--- a/Documentation/meson.build
+++ b/Documentation/meson.build
@@ -31,6 +31,13 @@ adoc_sources = [
'nvme-error-log',
'nvme-fid-support-effects-log',
'nvme-mi-cmd-support-effects-log',
+ 'nvme-fdp-configs',
+ 'nvme-fdp-usage',
+ 'nvme-fdp-stats',
+ 'nvme-fdp-events',
+ 'nvme-fdp-status',
+ 'nvme-fdp-update',
+ 'nvme-fdp-set-events',
'nvme-flush',
'nvme-format',
'nvme-fw-commit',
@@ -56,6 +63,8 @@ adoc_sources = [
'nvme-intel-market-name',
'nvme-intel-smart-log-add',
'nvme-intel-temp-stats',
+ 'nvme-io-mgmt-recv',
+ 'nvme-io-mgmt-send',
'nvme-io-passthru',
'nvme-lba-status-log',
'nvme-list',
@@ -78,6 +87,7 @@ adoc_sources = [
'nvme-nvm-id-ctrl',
'nvme-ocp-latency-monitor-log',
'nvme-ocp-smart-add-log',
+ 'nvme-ocp-clear-fw-activate-history',
'nvme-persistent-event-log',
'nvme-pred-lat-event-agg-log',
'nvme-predictable-lat-log',
@@ -176,6 +186,7 @@ adoc_sources = [
'nvme-zns-zone-append',
'nvme-zns-zone-mgmt-recv',
'nvme-zns-zone-mgmt-send',
+ 'nvme-inspur-nvme-vendor-log',
]
adoc_includes = [
diff --git a/Documentation/nvme-admin-passthru.1 b/Documentation/nvme-admin-passthru.1
index eabf8da..b5f1847 100644
--- a/Documentation/nvme-admin-passthru.1
+++ b/Documentation/nvme-admin-passthru.1
@@ -2,12 +2,12 @@
.\" Title: nvme-admin-passthru
.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\" Date: 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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).</p></di
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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<storage\-tag> | \-g <storage\-tag>]
[\-\-storage\-tag\-check<storage\-tag\-check> | \-C <storage\-tag\-check>]
[\-\-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=<storage\-tag>, \-g <storage\-tag>
+.RS 4
+Variable Sized Expected Logical Block Storage Tag(ELBST)\&.
+.RE
+.PP
\-\-storage\-tag\-check=<storage\-tag\-check>, \-C <storage\-tag\-check>
.RS 4
This bit specifies the Storage Tag field shall be checked as part of end\-to\-end data protection processing\&.
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&lt;storage-tag&gt; | -g &lt;storage-tag&gt;]
[--storage-tag-check&lt;storage-tag-check&gt; | -C &lt;storage-tag-check&gt;]
[--force]</pre>
<div class="attribution">
@@ -1043,6 +1044,17 @@ metadata is passes.</p></td>
</p>
</dd>
<dt class="hdlist1">
+--storage-tag=&lt;storage-tag&gt;
+</dt>
+<dt class="hdlist1">
+-g &lt;storage-tag&gt;
+</dt>
+<dd>
+<p>
+ Variable Sized Expected Logical Block Storage Tag(ELBST).
+</p>
+</dd>
+<dt class="hdlist1">
--storage-tag-check=&lt;storage-tag-check&gt;
</dt>
<dt class="hdlist1">
@@ -1083,7 +1095,7 @@ metadata is passes.</p></td>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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<storage-tag> | -g <storage-tag>]
[--storage-tag-check<storage-tag-check> | -C <storage-tag-check>]
[--force]
@@ -140,6 +141,10 @@ metadata is passes.
--latency::
Print out the latency the IOCTL took (in us).
+--storage-tag=<storage-tag>::
+-g <storage-tag>::
+ Variable Sized Expected Logical Block Storage Tag(ELBST).
+
--storage-tag-check=<storage-tag-check>::
-C <storage-tag-check>::
This bit specifies the Storage Tag field shall be checked as part of end-to-end
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 <http://docbook.sf.net/>
-.\" 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>, \-\-hostnqn=<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>, \-\-hostid=<hostid>
@@ -153,7 +153,7 @@ will dump the output to stdout\&.
.PP
\-C <cfg>, \-\-config\-file=<cfg>
.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
<div class="paragraph"><p>Send one or more Discovery requests to a NVMe over Fabrics Discovery
Controller, and create controllers for the returned discovery records.</p></div>
<div class="paragraph"><p>If no parameters are given, then <em>nvme connect-all</em> 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.</p></div>
<div class="paragraph"><p>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">
<p>
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">
<dd>
<p>
Use the specified JSON configuration file instead of the
- default /etc/nvme/config.json file or <em>none</em> to not read in
+ default /usr/local/etc/nvme/config.json file or <em>none</em> to not read in
an existing configuration file. The JSON configuration file
format is documented in
<a href="https://github.com/linux-nvme/libnvme/doc/config-schema.json">https://github.com/linux-nvme/libnvme/doc/config-schema.json</a>
@@ -1120,7 +1120,7 @@ the RDMA network. Port 4420 is used by default:
</li>
<li>
<p>
-Issue a <em>nvme connect-all</em> command using a /etc/nvme/discovery.conf file:
+Issue a <em>nvme connect-all</em> command using a /usr/local/etc/nvme/discovery.conf file:
</p>
<div class="listingblock">
<div class="content">
@@ -1156,7 +1156,7 @@ nvme-connect(1)</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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>, \-\-hostnqn=<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>, \-\-hostid=<hostid>
@@ -140,7 +140,7 @@ UUID(Universally Unique Identifier) to be discovered which should be formatted\&
.PP
\-J <cfg>, \-\-config\-file=<cfg>
.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 <secret>, \-\-dhchap\-secret=<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 <secret>, \-\-dhchap\-ctrl\-secret=<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">
<p>
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.
</p>
@@ -932,7 +932,7 @@ cellspacing="0" cellpadding="4">
<dd>
<p>
Use the specified JSON configuration file instead of the
- default /etc/nvme/config.json file or <em>none</em> to not read in
+ default /usr/local/etc/nvme/config.json file or <em>none</em> to not read in
an existing configuration file. The JSON configuration file
format is documented in
<a href="https://github.com/linux-nvme/libnvme/doc/config-schema.json">https://github.com/linux-nvme/libnvme/doc/config-schema.json</a>
@@ -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 <em>Secret representation</em>.
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.
</p>
</dd>
@@ -1162,7 +1162,7 @@ and <a href="mailto:hch@lst.de">Christoph Hellwig</a></p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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=<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>]
.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 <device> 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 <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
+.SH "OPTIONS"
.PP
\-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=&lt;lbstm&gt; | -l &lt;lbstm&gt;]
[--block-size=&lt;block-size&gt; | -b &lt;block-size&gt;]
[--timeout=&lt;timeout&gt; | -t &lt;timeout&gt;]
-DESCRIPTION</pre>
+ [--nsze-si=&lt;nsze-si&gt; | -S &lt;nsze-si&gt;]
+ [--ncap-si=&lt;ncap-si&gt; | -C &lt;ncap-si&gt;]</pre>
<div class="attribution">
</div></div>
-<div class="listingblock">
-<div class="content">
-<pre><code>For the NVMe device given, sends a namespace management command to create
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>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 &lt;device&gt; parameter is mandatory and may be either the NVMe character
-device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
-
-OPTIONS</code></pre>
-</div></div>
+identifier assigned by the controller is returned.</p></div>
+<div class="paragraph"><p>The &lt;device&gt; parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
<div class="dlist"><dl>
<dt class="hdlist1">
-s
@@ -890,13 +895,50 @@ OPTIONS</code></pre>
selected for the create-ns operation. Conflicts with --flbas argument.
</p>
</dd>
+<dt class="hdlist1">
+-S
+</dt>
+<dt class="hdlist1">
+--nsze-si
+</dt>
+<dd>
+<p>
+ 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.
+</p>
+</dd>
+<dt class="hdlist1">
+-C
+</dt>
+<dt class="hdlist1">
+--ncap-si
+</dt>
+<dd>
+<p>
+ 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.
+</p>
+</dd>
</dl></div>
</div>
</div>
<div class="sect1">
<h2 id="_examples">EXAMPLES</h2>
<div class="sectionbody">
-<div class="paragraph"><p>No examples provided yet.</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+Create a namespace:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># 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</code></pre>
+</div></div>
+</li>
+</ul></div>
</div>
</div>
<div class="sect1">
@@ -910,7 +952,7 @@ OPTIONS</code></pre>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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=<lbstm> | -l <lbstm>]
[--block-size=<block-size> | -b <block-size>]
[--timeout=<timeout> | -t <timeout>]
+ [--nsze-si=<nsze-si> | -S <nsze-si>]
+ [--ncap-si=<ncap-si> | -C <ncap-si>]
+
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 <http://docbook.sf.net/>
-.\" 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 <code>'--namespace-id'</code> option is mandatory.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
- [\-\-self\-test\-code=<NUM> | \-s <NUM>]
+ [\-\-self\-test\-code=<NUM> | \-s <NUM>] [\-\-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 <NUM>, \-\-self\-test\-code=<NUM>
.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
<div class="sectionbody">
<div class="verseblock">
<pre class="content"><em>nvme device-self-test</em> &lt;device&gt; [--namespace-id=&lt;NUM&gt; | -n &lt;NUM&gt;]
- [--self-test-code=&lt;NUM&gt; | -s &lt;NUM&gt;]</pre>
+ [--self-test-code=&lt;NUM&gt; | -s &lt;NUM&gt;] [--wait | -w]</pre>
<div class="attribution">
</div></div>
</div>
@@ -788,10 +788,25 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></di
<dd>
<p>
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.
+</p>
+</dd>
+<dt class="hdlist1">
+-w
+</dt>
+<dt class="hdlist1">
+--wait
+</dt>
+<dd>
+<p>
+ 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.
</p>
</dd>
</dl></div>
@@ -833,7 +848,7 @@ Abort the device self-test operation in the namespace-id 1:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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' <device> [--namespace-id=<NUM> | -n <NUM>]
- [--self-test-code=<NUM> | -s <NUM>]
+ [--self-test-code=<NUM> | -s <NUM>] [--wait | -w]
DESCRIPTION
-----------
@@ -28,12 +28,19 @@ OPTIONS
-s <NUM>::
--self-test-code=<NUM>::
- 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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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>, \-\-hostnqn=<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>, \-\-hostid=<hostid>
@@ -166,7 +166,7 @@ This field takes a device as input\&. Device is in the format of nvme*, eg\&. nv
.PP
\-C <cfg>, \-\-config\-file=<cfg>
.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
<div class="paragraph"><p>Send one or more Get Log Page requests to a NVMe-over-Fabrics Discovery
Controller.</p></div>
<div class="paragraph"><p>If no parameters are given, then <em>nvme discover</em> 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.</p></div>
<div class="paragraph"><p>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">
<p>
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.
</p>
</dd>
@@ -987,7 +987,7 @@ cellspacing="0" cellpadding="4">
<dd>
<p>
Use the specified JSON configuration file instead of the
- default /etc/nvme/config.json file or <em>none</em> to not read in
+ default /usr/local/etc/nvme/config.json file or <em>none</em> to not read in
an existing configuration file. The JSON configuration file
format is documented in
<a href="https://github.com/linux-nvme/libnvme/doc/config-schema.json">https://github.com/linux-nvme/libnvme/doc/config-schema.json</a>
@@ -1176,7 +1176,7 @@ Port 4420 is used by default:
</li>
<li>
<p>
-Issue a <em>nvme discover</em> command using a /etc/nvme/discovery.conf file:
+Issue a <em>nvme discover</em> command using a /usr/local/etc/nvme/discovery.conf file:
</p>
<div class="listingblock">
<div class="content">
@@ -1218,7 +1218,7 @@ nvme-connect-all(1)</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
+.\" 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 <device> [\-\-endgrp\-id=<NUM> | \-e <NUM>]
+ [\-\-human\-readable | \-H]
+ [\-\-raw\-binary | \-b]
+ [\-\-output\-format=<FMT> | \-o <FMT>]
+.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 <NUM>, \-\-endgrp\-id=<NUM>
+.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 <format>, \-\-output\-format=<format>
+.RS 4
+Set the reporting format to
+\fInormal\fR,
+\fIjson\fR, or
+\fIbinary\fR\&. Only one output format can be used at a time\&.
+.RE
+.SH "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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
+<title>nvme-fdp-configs(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-fdp-configs(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-fdp-configs -
+ Get Flexible Data Placement Configurations
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme fdp configs</em> &lt;device&gt; [--endgrp-id=&lt;NUM&gt; | -e &lt;NUM&gt;]
+ [--human-readable | -H]
+ [--raw-binary | -b]
+ [--output-format=&lt;FMT&gt; | -o &lt;FMT&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>For the NVMe device given, and the endurance group identifier specified, list
+the possible configurations for Flexible Data Placement.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-e &lt;NUM&gt;
+</dt>
+<dt class="hdlist1">
+--endgrp-id=&lt;NUM&gt;
+</dt>
+<dd>
+<p>
+ The endurance group identifier to use when requesting the log page.
+</p>
+</dd>
+<dt class="hdlist1">
+-H
+</dt>
+<dt class="hdlist1">
+--human-readable
+</dt>
+<dd>
+<p>
+ Parse, print and describe individual parts of bitfields.
+</p>
+</dd>
+<dt class="hdlist1">
+-b
+</dt>
+<dt class="hdlist1">
+--raw-binary
+</dt>
+<dd>
+<p>
+ Print the raw buffer to the standard output stream.
+</p>
+</dd>
+<dt class="hdlist1">
+-o &lt;format&gt;
+</dt>
+<dt class="hdlist1">
+--output-format=&lt;format&gt;
+</dt>
+<dd>
+<p>
+ Set the reporting format to <em>normal</em>, <em>json</em>, or <em>binary</em>. Only one
+ output format can be used at a time.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of nvme-cli</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2023-01-30 14:14:16 CET
+</div>
+</div>
+</body>
+</html>
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' <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-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 <http://docbook.sf.net/>
+.\" 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 <device> [\-\-endgrp\-id=<NUM> | \-e <NUM>]
+ [\-\-host\-events | \-E]
+ [\-\-raw\-binary | \-b]
+ [\-\-output\-format=<FMT> | \-o <FMT>]
+.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 <NUM>, \-\-endgrp\-id=<NUM>
+.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 <format>, \-\-output\-format=<format>
+.RS 4
+Set the reporting format to
+\fInormal\fR,
+\fIjson\fR, or
+\fIbinary\fR\&. Only one output format can be used at a time\&.
+.RE
+.SH "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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
+<title>nvme-fdp-events(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-fdp-events(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-fdp-events -
+ Get Flexible Data Placement Events
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme fdp events</em> &lt;device&gt; [--endgrp-id=&lt;NUM&gt; | -e &lt;NUM&gt;]
+ [--host-events | -E]
+ [--raw-binary | -b]
+ [--output-format=&lt;FMT&gt; | -o &lt;FMT&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>For the NVMe device given, provide information about events affecting Reclaim
+Units and media usage in an Endurance Group.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-e &lt;NUM&gt;
+</dt>
+<dt class="hdlist1">
+--endgrp-id=&lt;NUM&gt;
+</dt>
+<dd>
+<p>
+ The endurance group identifier to use when requesting the log page.
+</p>
+</dd>
+<dt class="hdlist1">
+-E
+</dt>
+<dt class="hdlist1">
+--host-events
+</dt>
+<dd>
+<p>
+ Request the controller to report host events.
+</p>
+</dd>
+<dt class="hdlist1">
+-b
+</dt>
+<dt class="hdlist1">
+--raw-binary
+</dt>
+<dd>
+<p>
+ Print the raw buffer to the standard output stream.
+</p>
+</dd>
+<dt class="hdlist1">
+-o &lt;format&gt;
+</dt>
+<dt class="hdlist1">
+--output-format=&lt;format&gt;
+</dt>
+<dd>
+<p>
+ Set the reporting format to <em>normal</em>, <em>json</em>, or <em>binary</em>. Only one
+ output format can be used at a time.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of nvme-cli</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2023-01-30 14:14:16 CET
+</div>
+</div>
+</body>
+</html>
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' <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-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 <http://docbook.sf.net/>
+.\" 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 <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
+ [\-\-placement\-handle=<NUM> | \-p <NUM>]
+ [\-\-enable | \-e]
+ [\-\-event\-types=<NUM,> | \-t <NUM,>]
+.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 <NUM>, \-\-namespace\-id=<NUM>
+.RS 4
+Namespace identifier\&.
+.RE
+.PP
+\-b, \-\-raw\-binary
+.RS 4
+Print the raw buffer to the standard output stream\&.
+.RE
+.PP
+\-o <format>, \-\-output\-format=<format>
+.RS 4
+Set the reporting format to
+\fInormal\fR,
+\fIjson\fR, or
+\fIbinary\fR\&. Only one output format can be used at a time\&.
+.RE
+.SH "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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
+<title>nvme-fdp-set-events(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-fdp-set-events(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-fdp-set-events -
+ Enable or disable FDP events
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme fdp set-events</em> &lt;device&gt; [--namespace-id=&lt;NUM&gt; | -n &lt;NUM&gt;]
+ [--placement-handle=&lt;NUM&gt; | -p &lt;NUM&gt;]
+ [--enable | -e]
+ [--event-types=&lt;NUM,&gt; | -t &lt;NUM,&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>For the NVMe device given, enable or disable a list of event types from being
+generated for the Reclaim Unit Handle reference by the specified Placement
+Handle.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-n &lt;NUM&gt;
+</dt>
+<dt class="hdlist1">
+--namespace-id=&lt;NUM&gt;
+</dt>
+<dd>
+<p>
+ Namespace identifier.
+</p>
+</dd>
+<dt class="hdlist1">
+-b
+</dt>
+<dt class="hdlist1">
+--raw-binary
+</dt>
+<dd>
+<p>
+ Print the raw buffer to the standard output stream.
+</p>
+</dd>
+<dt class="hdlist1">
+-o &lt;format&gt;
+</dt>
+<dt class="hdlist1">
+--output-format=&lt;format&gt;
+</dt>
+<dd>
+<p>
+ Set the reporting format to <em>normal</em>, <em>json</em>, or <em>binary</em>. Only one
+ output format can be used at a time.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of nvme-cli</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2023-01-30 14:14:16 CET
+</div>
+</div>
+</body>
+</html>
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' <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-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 <http://docbook.sf.net/>
+.\" 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 <device> [\-\-endgrp\-id=<NUM> | \-e <NUM>]
+ [\-\-raw\-binary | \-b]
+ [\-\-output\-format=<FMT> | \-o <FMT>]
+.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 <NUM>, \-\-endgrp\-id=<NUM>
+.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 <format>, \-\-output\-format=<format>
+.RS 4
+Set the reporting format to
+\fInormal\fR,
+\fIjson\fR, or
+\fIbinary\fR\&. Only one output format can be used at a time\&.
+.RE
+.SH "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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
+<title>nvme-fdp-stats(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-fdp-stats(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-fdp-stats -
+ Get Flexible Data Placement Statistics
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme fdp stats</em> &lt;device&gt; [--endgrp-id=&lt;NUM&gt; | -e &lt;NUM&gt;]
+ [--raw-binary | -b]
+ [--output-format=&lt;FMT&gt; | -o &lt;FMT&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>For the NVMe device given, provide information about the FDP configuration over
+the life of the FDP configuration in an Endurance Group.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-e &lt;NUM&gt;
+</dt>
+<dt class="hdlist1">
+--endgrp-id=&lt;NUM&gt;
+</dt>
+<dd>
+<p>
+ The endurance group identifier to use when requesting the log page.
+</p>
+</dd>
+<dt class="hdlist1">
+-b
+</dt>
+<dt class="hdlist1">
+--raw-binary
+</dt>
+<dd>
+<p>
+ Print the raw buffer to the standard output stream.
+</p>
+</dd>
+<dt class="hdlist1">
+-o &lt;format&gt;
+</dt>
+<dt class="hdlist1">
+--output-format=&lt;format&gt;
+</dt>
+<dd>
+<p>
+ Set the reporting format to <em>normal</em>, <em>json</em>, or <em>binary</em>. Only one
+ output format can be used at a time.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of nvme-cli</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2023-01-30 14:14:16 CET
+</div>
+</div>
+</body>
+</html>
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' <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-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 <http://docbook.sf.net/>
+.\" 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 <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
+ [\-\-raw\-binary | \-b]
+ [\-\-output\-format=<FMT> | \-o <FMT>]
+.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 <NUM>, \-\-namespace\-id=<NUM>
+.RS 4
+Namespace identifier\&.
+.RE
+.PP
+\-b, \-\-raw\-binary
+.RS 4
+Print the raw buffer to the standard output stream\&.
+.RE
+.PP
+\-o <format>, \-\-output\-format=<format>
+.RS 4
+Set the reporting format to
+\fInormal\fR,
+\fIjson\fR, or
+\fIbinary\fR\&. Only one output format can be used at a time\&.
+.RE
+.SH "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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
+<title>nvme-fdp-status(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-fdp-status(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-fdp-status -
+ Get Reclaim Unit Handle Status
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme fdp status</em> &lt;device&gt; [--namespace-id=&lt;NUM&gt; | -n &lt;NUM&gt;]
+ [--raw-binary | -b]
+ [--output-format=&lt;FMT&gt; | -o &lt;FMT&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>For the NVMe device given, provide information about Reclaim Unit Handles that
+are accessible by the specified namespace.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-n &lt;NUM&gt;
+</dt>
+<dt class="hdlist1">
+--namespace-id=&lt;NUM&gt;
+</dt>
+<dd>
+<p>
+ Namespace identifier.
+</p>
+</dd>
+<dt class="hdlist1">
+-b
+</dt>
+<dt class="hdlist1">
+--raw-binary
+</dt>
+<dd>
+<p>
+ Print the raw buffer to the standard output stream.
+</p>
+</dd>
+<dt class="hdlist1">
+-o &lt;format&gt;
+</dt>
+<dt class="hdlist1">
+--output-format=&lt;format&gt;
+</dt>
+<dd>
+<p>
+ Set the reporting format to <em>normal</em>, <em>json</em>, or <em>binary</em>. Only one
+ output format can be used at a time.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of nvme-cli</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2023-01-30 14:14:16 CET
+</div>
+</div>
+</body>
+</html>
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' <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-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 <http://docbook.sf.net/>
+.\" 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 <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
+ [\-\-pids=<NUM,> | \-p <NUM,>]
+.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 <NUM>, \-\-namespace\-id=<NUM>
+.RS 4
+Namespace identifier\&.
+.RE
+.PP
+\-p <NUM,>, \-\-pids=<NUM,>
+.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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
+<title>nvme-fdp-update(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-fdp-update(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-fdp-update -
+ Reclaim Unit Handle Update
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme fdp update</em> &lt;device&gt; [--namespace-id=&lt;NUM&gt; | -n &lt;NUM&gt;]
+ [--pids=&lt;NUM,&gt; | -p &lt;NUM,&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>For the NVMe device given, update the given Placement Identifiers to reference
+a different Reclaim Unit accessible by the specified namespace.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-n &lt;NUM&gt;
+</dt>
+<dt class="hdlist1">
+--namespace-id=&lt;NUM&gt;
+</dt>
+<dd>
+<p>
+ Namespace identifier.
+</p>
+</dd>
+<dt class="hdlist1">
+-p &lt;NUM,&gt;
+</dt>
+<dt class="hdlist1">
+--pids=&lt;NUM,&gt;
+</dt>
+<dd>
+<p>
+ Comma-separated list of placement identifiers to update.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of nvme-cli</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2023-01-30 14:14:16 CET
+</div>
+</div>
+</body>
+</html>
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' <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-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 <http://docbook.sf.net/>
+.\" 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 <device> [\-\-endgrp\-id=<NUM> | \-e <NUM>]
+ [\-\-raw\-binary | \-b]
+ [\-\-output\-format=<FMT> | \-o <FMT>]
+.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 <NUM>, \-\-endgrp\-id=<NUM>
+.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 <format>, \-\-output\-format=<format>
+.RS 4
+Set the reporting format to
+\fInormal\fR,
+\fIjson\fR, or
+\fIbinary\fR\&. Only one output format can be used at a time\&.
+.RE
+.SH "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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
+<title>nvme-fdp-usage(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-fdp-usage(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-fdp-usage -
+ Get Reclaim Unit Handle Usage
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme fdp usage</em> &lt;device&gt; [--endgrp-id=&lt;NUM&gt; | -e &lt;NUM&gt;]
+ [--raw-binary | -b]
+ [--output-format=&lt;FMT&gt; | -o &lt;FMT&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>For the NVMe device given, provide information about the Reclaim Unit Handles
+associated with the Placement Handles of the namespaces in the specified
+Endurance Group.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-e &lt;NUM&gt;
+</dt>
+<dt class="hdlist1">
+--endgrp-id=&lt;NUM&gt;
+</dt>
+<dd>
+<p>
+ The endurance group identifier to use when requesting the log page.
+</p>
+</dd>
+<dt class="hdlist1">
+-b
+</dt>
+<dt class="hdlist1">
+--raw-binary
+</dt>
+<dd>
+<p>
+ Print the raw buffer to the standard output stream.
+</p>
+</dd>
+<dt class="hdlist1">
+-o &lt;format&gt;
+</dt>
+<dt class="hdlist1">
+--output-format=&lt;format&gt;
+</dt>
+<dd>
+<p>
+ Set the reporting format to <em>normal</em>, <em>json</em>, or <em>binary</em>. Only one
+ output format can be used at a time.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of nvme-cli</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2023-01-30 14:14:16 CET
+</div>
+</div>
+</body>
+</html>
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' <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-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 <http://docbook.sf.net/>
-.\" 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.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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)
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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).</p></di
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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)
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 <code>'cat'</code> a saved output buff
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
+.\" 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 <device>
+.fi
+.SH "DESCRIPTION"
+.sp
+Retrieves the NVMe Inspur Device Vendor log page from the device and provides the returned structure\&.
+.sp
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
+.sp
+On success, 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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
+<title>nvme-inspur-nvme-vendor-log(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-inspur-nvme-vendor-log(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-inspur-nvme-vendor-log -
+ Send NVMe Inspur Device Vendor log page request, returns result
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme inspur nvme-vendor-log</em> &lt;device&gt;</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Retrieves the NVMe Inspur Device Vendor log page from the device and provides the returned structure.</p></div>
+<div class="paragraph"><p>The &lt;device&gt; parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></div>
+<div class="paragraph"><p>On success, vendor log structure are printed in a readable format.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>none</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Print the Inspur Device Vendor log page in a human readable format:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme inspur nvme-vendor-log /dev/nvme0</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-user suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2023-01-30 14:14:16 CET
+</div>
+</div>
+</body>
+</html>
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' <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-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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
+.\" 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 <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
+ [\-\-mos=<NUM> | \-s <NUM>]
+ [\-\-mo=<NUM> | \-m <NUM>]
+ [\-\-data=<FILE> | \-d <FILE>]
+ [\-\-data\-len=<NUM> | \-l <NUM>]
+.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 <NUM>, \-\-namespace\-id=<NUM>
+.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 <FILE>, \-\-data=<FILE>
+.RS 4
+File to write received data into\&. If unspecified, received data will be hex dumped to the standard output stream\&.
+.RE
+.PP
+\-l <NUM>, \-\-data\-len=<NUM>
+.RS 4
+Received data buffer length
+.RE
+.PP
+\-m <NUM>, \-\-mo <NUM>
+.RS 4
+Management Operation to perform\&.
+.RE
+.PP
+\-s <NUM>, \-\-mos=<NUM>
+.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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
+<title>nvme-io-mgmt-recv(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-io-mgmt-recv(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-io-mgmt-recv -
+ I/O Management Receive command
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme io-mgmt-recv</em> &lt;device&gt; [--namespace-id=&lt;NUM&gt; | -n &lt;NUM&gt;]
+ [--mos=&lt;NUM&gt; | -s &lt;NUM&gt;]
+ [--mo=&lt;NUM&gt; | -m &lt;NUM&gt;]
+ [--data=&lt;FILE&gt; | -d &lt;FILE&gt;]
+ [--data-len=&lt;NUM&gt; | -l &lt;NUM&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>For the NVMe device given, 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&#8217;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.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-n &lt;NUM&gt;
+</dt>
+<dt class="hdlist1">
+--namespace-id=&lt;NUM&gt;
+</dt>
+<dd>
+<p>
+ 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.
+</p>
+</dd>
+<dt class="hdlist1">
+-d &lt;FILE&gt;
+</dt>
+<dt class="hdlist1">
+--data=&lt;FILE&gt;
+</dt>
+<dd>
+<p>
+ File to write received data into. If unspecified, received data will be
+ hex dumped to the standard output stream.
+</p>
+</dd>
+<dt class="hdlist1">
+-l &lt;NUM&gt;
+</dt>
+<dt class="hdlist1">
+--data-len=&lt;NUM&gt;
+</dt>
+<dd>
+<p>
+ Received data buffer length
+</p>
+</dd>
+<dt class="hdlist1">
+-m &lt;NUM&gt;
+</dt>
+<dt class="hdlist1">
+--mo &lt;NUM&gt;
+</dt>
+<dd>
+<p>
+ Management Operation to perform.
+</p>
+</dd>
+<dt class="hdlist1">
+-s &lt;NUM&gt;
+</dt>
+<dt class="hdlist1">
+--mos=&lt;NUM&gt;
+</dt>
+<dd>
+<p>
+ Management Operation Specific parameter.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of nvme-cli</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2023-01-30 14:14:16 CET
+</div>
+</div>
+</body>
+</html>
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' <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-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 <http://docbook.sf.net/>
+.\" 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 <device> [\-\-namespace\-id=<NUM> | \-n <NUM>]
+ [\-\-mos=<NUM> | \-s <NUM>]
+ [\-\-mo=<NUM> | \-m <NUM>]
+ [\-\-data=<FILE> | \-d <FILE>]
+ [\-\-data\-len=<NUM> | \-l <NUM>]
+.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 <NUM>, \-\-namespace\-id=<NUM>
+.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 <FILE>, \-\-data=<FILE>
+.RS 4
+File to read payload from\&. If unspecified, data will be read from the standard input stream\&.
+.RE
+.PP
+\-l <NUM>, \-\-data\-len=<NUM>
+.RS 4
+Payload data buffer length
+.RE
+.PP
+\-m <NUM>, \-\-mo <NUM>
+.RS 4
+Management Operation to perform\&.
+.RE
+.PP
+\-s <NUM>, \-\-mos=<NUM>
+.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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
+<title>nvme-io-mgmt-send(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-io-mgmt-send(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-io-mgmt-send -
+ I/O Management Send command
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme io-mgmt-send</em> &lt;device&gt; [--namespace-id=&lt;NUM&gt; | -n &lt;NUM&gt;]
+ [--mos=&lt;NUM&gt; | -s &lt;NUM&gt;]
+ [--mo=&lt;NUM&gt; | -m &lt;NUM&gt;]
+ [--data=&lt;FILE&gt; | -d &lt;FILE&gt;]
+ [--data-len=&lt;NUM&gt; | -l &lt;NUM&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>For the NVMe device given, 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&#8217;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.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-n &lt;NUM&gt;
+</dt>
+<dt class="hdlist1">
+--namespace-id=&lt;NUM&gt;
+</dt>
+<dd>
+<p>
+ 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.
+</p>
+</dd>
+<dt class="hdlist1">
+-d &lt;FILE&gt;
+</dt>
+<dt class="hdlist1">
+--data=&lt;FILE&gt;
+</dt>
+<dd>
+<p>
+ File to read payload from. If unspecified, data will be read from the
+ standard input stream.
+</p>
+</dd>
+<dt class="hdlist1">
+-l &lt;NUM&gt;
+</dt>
+<dt class="hdlist1">
+--data-len=&lt;NUM&gt;
+</dt>
+<dd>
+<p>
+ Payload data buffer length
+</p>
+</dd>
+<dt class="hdlist1">
+-m &lt;NUM&gt;
+</dt>
+<dt class="hdlist1">
+--mo &lt;NUM&gt;
+</dt>
+<dd>
+<p>
+ Management Operation to perform.
+</p>
+</dd>
+<dt class="hdlist1">
+-s &lt;NUM&gt;
+</dt>
+<dt class="hdlist1">
+--mos=&lt;NUM&gt;
+</dt>
+<dd>
+<p>
+ Management Operation Specific parameter.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of nvme-cli</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2023-01-30 14:14:16 CET
+</div>
+</div>
+</body>
+</html>
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' <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-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 <http://docbook.sf.net/>
-.\" 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.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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</code></pre>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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</code></pre>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
+.\" 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 <device> [\-\-no\-uuid | \-n>]
+.fi
+.SH "DESCRIPTION"
+.sp
+For the NVMe device given, Clear OCP Firmware Update History Log\&.
+.sp
+The <device> 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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
+<title>nvme-ocp-clear-fw-activate-history(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-ocp-clear-fw-activate-history(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-ocp-clear-fw-activate-history -
+ Clear the OCP Firmware Update History Log
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme ocp clear-fw-activate-history</em> &lt;device&gt; [--no-uuid | -n&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>For the NVMe device given, Clear OCP Firmware Update History Log.</p></div>
+<div class="paragraph"><p>The &lt;device&gt; parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).</p></div>
+<div class="paragraph"><p>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.</p></div>
+<div class="paragraph"><p>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.</p></div>
+<div class="paragraph"><p>On success it returns 0, error code otherwise.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-n
+</dt>
+<dt class="hdlist1">
+--no-uuid
+</dt>
+<dd>
+<p>
+ Do not try to automatically detect UUID index for this command (required
+ for old OCP 1.0 support)
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Clears OCP Firmware Activation History Log for the device:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme ocp clear-fw-activate-history /dev/nvme0</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-user suite.</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2023-01-30 14:14:16 CET
+</div>
+</div>
+</body>
+</html>
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' <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. \ 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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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<storage\-tag> | \-g <storage\-tag>]
[\-\-storage\-tag\-check<storage\-tag\-check> | \-C <storage\-tag\-check>]
[\-\-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=<storage\-tag>, \-g <storage\-tag>
+.RS 4
+Variable Sized Expected Logical Block Storage Tag(ELBST)\&.
+.RE
+.PP
\-\-storage\-tag\-check=<storage\-tag\-check>, \-C <storage\-tag\-check>
.RS 4
This bit specifies the Storage Tag field shall be checked as part of end\-to\-end data protection processing\&.
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&lt;storage-tag&gt; | -g &lt;storage-tag&gt;]
[--storage-tag-check&lt;storage-tag-check&gt; | -C &lt;storage-tag-check&gt;]
[--force]</pre>
<div class="attribution">
@@ -1016,6 +1017,17 @@ metadata is passes.</p></td>
</p>
</dd>
<dt class="hdlist1">
+--storage-tag=&lt;storage-tag&gt;
+</dt>
+<dt class="hdlist1">
+-g &lt;storage-tag&gt;
+</dt>
+<dd>
+<p>
+ Variable Sized Expected Logical Block Storage Tag(ELBST).
+</p>
+</dd>
+<dt class="hdlist1">
--storage-tag-check=&lt;storage-tag-check&gt;
</dt>
<dt class="hdlist1">
@@ -1056,7 +1068,7 @@ metadata is passes.</p></td>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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<storage-tag> | -g <storage-tag>]
[--storage-tag-check<storage-tag-check> | -C <storage-tag-check>]
[--force]
@@ -130,6 +131,10 @@ metadata is passes.
--latency::
Print out the latency the IOCTL took (in us).
+--storage-tag=<storage-tag>::
+-g <storage-tag>::
+ Variable Sized Expected Logical Block Storage Tag(ELBST).
+
--storage-tag-check=<storage-tag-check>::
-C <storage-tag-check>::
This bit specifies the Storage Tag field shall be checked as part of end-to-end
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 <http://docbook.sf.net/>
-.\" 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.
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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">
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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">
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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">
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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).</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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">
<td align="left" valign="top"><p class="table">Reserved</p></td>
</tr>
<tr>
-<td align="left" valign="top"><p class="table">0x01</p></td>
+<td align="left" valign="top"><p class="table">0x01 | <em>exit-failure</em></p></td>
<td align="left" valign="top"><p class="table">Exit Failure Mode</p></td>
</tr>
<tr>
-<td align="left" valign="top"><p class="table">0x02</p></td>
+<td align="left" valign="top"><p class="table">0x02 | <em>start-block-erase</em></p></td>
<td align="left" valign="top"><p class="table">Start a Block Erase sanitize operation</p></td>
</tr>
<tr>
-<td align="left" valign="top"><p class="table">0x03</p></td>
+<td align="left" valign="top"><p class="table">0x03 | <em>start-overwrite</em></p></td>
<td align="left" valign="top"><p class="table">Start an Overwrite sanitize operation</p></td>
</tr>
<tr>
-<td align="left" valign="top"><p class="table">0x04</p></td>
+<td align="left" valign="top"><p class="table">0x04 | <em>start-crypto-erase</em></p></td>
<td align="left" valign="top"><p class="table">Start a Crypto Erase sanitize operation</p></td>
</tr>
</tbody>
@@ -919,8 +919,9 @@ Has the program issue Sanitize Command :
</p>
<div class="listingblock">
<div class="content">
-<pre><code># nvme sanitize /dev/nvme0n1 -a 0x02
-# nvme sanitize /dev/nvme0n1 --sanact=0x01</code></pre>
+<pre><code># nvme sanitize /dev/nvme0 -a 0x02
+# nvme sanitize /dev/nvme0 --sanact=0x01
+# nvme sanitize /dev/nvme0 --sanact=start-overwrite</code></pre>
</div></div>
</li>
</ul></div>
@@ -937,7 +938,7 @@ Has the program issue Sanitize Command :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <overwrite-pattern>::
@@ -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 <http://docbook.sf.net/>
-.\" 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).</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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).</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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).</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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).</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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</code></pre>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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).</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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).</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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).</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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).</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></d
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div class="sect1">
<h2 id="_description">DESCRIPTION</h2>
<div class="sectionbody">
-<div class="paragraph"><p>Show the host NQN configured for the system. If /etc/nvme/hostnqn is
+<div class="paragraph"><p>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.</p></div>
</div>
@@ -785,7 +785,7 @@ this will show the systemd-generated host NQN for the system.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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&#8217;s bad blocks in a human readable format:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></td>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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):
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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 :
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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.</p></td>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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<storage\-tag> | \-g <storage\-tag>]
[\-\-storage\-tag\-check<storage\-tag\-check> | \-C <storage\-tag\-check>]
[\-\-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=<storage\-tag>, \-g <storage\-tag>
+.RS 4
+Variable Sized Expected Logical Block Storage Tag(ELBST)\&.
+.RE
+.PP
\-\-storage\-tag\-check=<storage\-tag\-check>, \-C <storage\-tag\-check>
.RS 4
This bit specifies the Storage Tag field shall be checked as part of end\-to\-end data protection processing\&.
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&lt;storage-tag&gt; | -g &lt;storage-tag&gt;]
[--storage-tag-check&lt;storage-tag-check&gt; | -C &lt;storage-tag-check&gt;]
[--force]</pre>
<div class="attribution">
@@ -1038,6 +1039,17 @@ metadata is passes.</p></td>
</p>
</dd>
<dt class="hdlist1">
+--storage-tag=&lt;storage-tag&gt;
+</dt>
+<dt class="hdlist1">
+-g &lt;storage-tag&gt;
+</dt>
+<dd>
+<p>
+ Variable Sized Expected Logical Block Storage Tag(ELBST).
+</p>
+</dd>
+<dt class="hdlist1">
--storage-tag-check=&lt;storage-tag-check&gt;
</dt>
<dt class="hdlist1">
@@ -1078,7 +1090,7 @@ metadata is passes.</p></td>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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<storage-tag> | -g <storage-tag>]
[--storage-tag-check<storage-tag-check> | -C <storage-tag-check>]
[--force]
@@ -138,6 +139,10 @@ metadata is passes.
--latency::
Print out the latency the IOCTL took (in us).
+--storage-tag=<storage-tag>::
+-g <storage-tag>::
+ Variable Sized Expected Logical Block Storage Tag(ELBST).
+
--storage-tag-check=<storage-tag-check>::
-C <storage-tag-check>::
This bit specifies the Storage Tag field shall be checked as part of end-to-end
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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:
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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&#8217;s first zone
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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&#8217;s first zone
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <http://docbook.sf.net/>
-.\" 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".</p></div>
Flush LBAs associated with a ZRWA to a zone
</p>
</dd>
+<dt class="hdlist1">
+<a href="nvme-inspur-nvme-vendor-log.html">nvme-inspur-nvme-vendor-log(1)</a>
+</dt>
+<dd>
+<p>
+ NVMe Inspur Device Vendor log page request
+</p>
+</dd>
</dl></div>
</div>
</div>
@@ -2106,7 +2114,7 @@ NVM-Express Site</a>.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2022-11-02 16:43:53 CET
+ 2023-01-30 14:14:16 CET
</div>
</div>
</body>
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 <dirent.h>
#include <libgen.h>
#include <zlib.h>
+#include <signal.h>
#ifdef CONFIG_LIBHUGETLBFS
#include <hugetlbfs.h>
@@ -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 <fcntl.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <inttypes.h>
+#include <linux/fs.h>
+#include <sys/stat.h>
+
+#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 <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include <errno.h>
+#include <limits.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <sys/stat.h>
+
+#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 <errno.h>
#include <stdio.h>
#include <stdlib.h>
+#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#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 <ctype.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
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 <unistd.h>
+#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/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 <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#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 <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#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/tests/test-uint128.c b/unit/test-uint128.c
index 6301a38..6301a38 100644
--- a/tests/test-uint128.c
+++ b/unit/test-uint128.c
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 <string.h>
#include <getopt.h>
#include <stdarg.h>
+#include <stdio.h>
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,25 +38,60 @@
#include <math.h>
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;
for (s = si_suffixes; s->magnitude != 0; 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 <inttypes.h>
+#include <stdbool.h>
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 <inttypes.h>
#include <stdio.h>
#include <string.h>
+#include <locale.h>
#include <ccan/endian/endian.h>
#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);