-
A new INI-format connection configuration parser and writer have been added (
nvme-fabrics.conf+nvme-fabrics.conf.d/drop-ins, replacingconfig.json/discovery.conf). Seelibnvme/design/CONFIG.mdfor the format. Existing configuration can be explicietly converted by 'nvme config convert' or implicitly by the first call of any fabric command. -
Key management has moved into a new
nvme keysplugin.gen-dhchap-key,check-dhchap-key,gen-tls-key,check-tls-key, andtls-keyare nownvme keys gen-kxchap,check-kxchap,gen-tls,check-tls,insert-tls,import,export, andrevoke. The old commands still work as deprecated aliases (needs to be enabled at build time), exceptcheck-tls-key --insert, which has no equivalent there. Usenvme keys insert-tlsinstead. TheDH-HMAC-CHAPnaming is also renamed toKX-HMAC-CHAPthroughout, matching TP4201. Seenvme-keys-gen-kxchap(1)andnvme-keys-check-kxchap(1). -
nvme disconnect-allwith no options no longer disconnects every fabric controller. It now only disconnects controllers with no recorded owner in the new ownership registry. A controller owned by another orchestrator is silently skipped. To restore the old disconnect-everything behavior. -
libnvme itself no longer resolves hostnames.
libnvmf_add_ctrl()andlibnvmf_connect_ctrl()now fail immediately on a hostname traddr/host_traddr instead of resolving it internally. The caller is responsible for resolving first. -
--dump-confighas been removed fromnvme discover,connect-all, andconnect. -
In libnvme, the per-command
nvme_<cmd>()wrapper functions and theirstruct nvme_<cmd>_argsargument bundles have been replaced by annvme_init_<cmd>()helper that fills a caller-ownedstruct libnvme_passthru_cmd, submitted separately withlibnvme_exec_admin_passthru()/libnvme_exec_io_passthru()(or the async equivalents). -
The public NBFT parsing API has moved from the
libnvme_*namespace tolibnvmf_*, and every function now takes the global context as its first argument (for example,libnvmf_read_nbft(ctx, ...)). Update both the prefix and the call signature. -
The
-Dpdc-enabledmeson build option has been removed. Whether a discovery controller connection is kept persistent is now decided at runtime, via--persistent/nvme-fabrics.conf, not at build time.
- nvme-cli and libnvme now build and run on Windows (MSYS2 UCRT64).
Direct PCIe access via ioctl works; NVMe-oF fabrics, MI,
nvme-discoverd, and
nvme topare not yet available on this platform.
nvme topis a new interactive,top-like dashboard for NVMe devices. It lists subsystems and lets you drill into one to see live namespace, path, and controller stats, including command retry/error counts and multipath failover/reconnect counts.
-
A new ownership registry (
nvme registry, backed by/run/nvme/registry/) records which orchestrator owns each connected controller. This is what letsdisconnect-all(above) and future orchestrator tooling avoid tearing down a connection another component depends on. Seelibnvme/design/REGISTRY.md. -
A new system-wide exclusion list (
nvme exclusion, backed by/etc/nvme/exclusions.confandexclusions.conf.d/drop-ins) lets an administrator block specific controls from being auto-connected. It's aimed primarily at auto-discovered controllers, which have no config entry to remove in order to suppress an unwanted connection. Seelibnvme/design/EXCLUSIONS.md.
-
A new global config file,
/etc/nvme/nvme-cli.conf, sets machine-wide defaults for global options like--timeout,--output-format,--no-retries, and--no-ioctl-probing. Seenvme-cli.conf(5). -
nvme disconnectnow accepts the same identifying options asnvme connect(--nqn,--transport,--traddr,--host-iface,--hostnqn,--hostid). A new-x/--excludealso writes a matching entry to the exclusion list before disconnecting. Seenvme-disconnect(1). -
nvme discoverandnvme config-creategained--epcsd/--no-epcsd, to request or refuse Explicit Persistent Connection Support for Discovery. Seenvme-config-create(1). -
nvme utils dump-command-metadataprints the full command and option tree as JSON. It is meant to drive shell-completion generation. -
nvme connectgained--idempotentand--devid-file.--idempotentmakes connecting to an already-connected controller succeed instead of erroring.--devid-filewrites the resultingnvmeXdevice name to the given file on success, so a caller that doesn't know the device name at connect time (for example, a systemd unit spawned before the device exists) can look it up afterward instead of scrapingdmesgor polling sysfs. -
nvme config-convertconverts the legacyconfig.jsonanddiscovery.conffiles to the new INI-formatnvme-fabrics.conf. By default it reads the system paths and writes to/etc/nvme/nvme-fabrics.conf.--configoverrides theconfig.jsonpath,--outputthe destination, and--forceallows overwriting an existing target. On success each converted legacy file is renamed to<name>.convertedso running the command again is a safe no-op. Seenvme-config-convert(1).
-
The library has been renamed from libnvme to libnvme3, and the previously separate libnvme-mi has been merged into it. The shared library SONAME is
libnvme3.so.1. Headers install underinclude/libnvme3/and man pages under a versioned path, enabling parallel installation alongside libnvme v1 packages. The Python binding is now namedlibnvme3. Packages, build systems, and Python scripts that reference the library, its headers, or the Python module by name must update. -
nvme-fabrics.confentries can now recordpersistentandepcsdsettings per discovery controller, matching the CLI flags above. -
New diagnostic accessors report per-path, per-namespace, and per-controller command retry/error counts, multipath failover count, and controller reset/reconnect counts. These are always read live rather than cached, and back
nvme top. -
The Python bindings' object-oriented surface has been polished:
connected()andis_registration_supported()are now read-only properties (connected,registration_supported),registration_ctrl()is renamedregistration_control(), andset_symname()has been removed. Sethost.hostsymnamedirectly instead. -
The NBFT parser has been updated for NVMe Boot Specification rev. 1.3, including Security Profile Descriptors, and hardened against malformed or malicious NBFT ACPI tables.
-
ioctl version probing is now deferred until the first command on a transport handle, instead of happening eagerly on open. The probe prefers the 64-bit ioctl and falls back to the 32-bit one only if it isn't supported; the result is cached per handle. The new
--no-ioctl-probingglobal option skips probing and forces the 32-bit ioctl. -
Controller and namespace sysfs attributes are now read lazily, on first access, instead of all at once when the topology tree is scanned. This cuts overhead when scanning large fabric setups.
-
Connect and discover now share a common
struct libnvmf_contextinternally, replacing the old discovery-only context. Relevant to developers extending the fabrics API, not to CLI end users. -
A new internal
shared/static library holds code with no natural home in nvme-cli, libnvme, nvme-discoverd, or the Python bindings (INI parsing, base64, CRC32, filesystem/network helpers). -
Read-only Python bindings for the new config format (
config_read(),config_validate()) are available now for early adopters (e.g. nvme-stas) that want to start reading the new format ahead of the CLI's own switch-over. -
The accessor generator that produces libnvme's getter/setter boilerplate (
accessors.c/.h) has been rewritten in Python, with the struct annotations it reads now living in-source inprivate.hinstead of a separate spec file. Relevant to developers extending libnvme's public structs, not to CLI end users. -
<nvme/nvme-cmds.h>and<nvme/nvme-types.h>have each been split into per-spec-section sub-headers (nvme-cmds-base.h,nvme-cmds-fabrics.h,nvme-cmds-mi.h, similarly for nvme-types). The top-level headers still exist and include all sub-headers, so code that includes them is unaffected. Code that already included a sub-header by its old combined-file path must update the include path. -
nvme_root_thas been replaced bystruct libnvme_global_ctx *throughout the public API. Code that stored or passednvme_root_tmust update to the new type. -
A new transport handle abstraction (
struct nvme_transport_handle,libnvme_transport_handle_*) decouples command issuing from the underlying transport. A handle may wrap either a direct ioctl file descriptor or an MI endpoint. -
An explicit async passthru API has been added.
libnvme_submit_admin_passthru()/libnvme_submit_io_passthru()submit a command without waiting;libnvme_wait_passthru()/libnvme_reap_passthru()collect the result later. The synchronous path islibnvme_exec_admin_passthru()/libnvme_exec_io_passthru(). -
libnvmf_host_get_ids()has been promoted from an internal helper to a public API. It resolves the hostnqn and hostid from all available sources and is the recommended way for callers to obtain host identity before connect or discover. -
The implicit hostnqn/hostid lookup inside the fabrics connect and discover code paths has been removed. Callers must now resolve host identity before connecting; use the newly public
libnvmf_host_get_ids()helper or set values explicitly withlibnvme_global_ctx_set_hostnqn()/libnvme_global_ctx_set_hostid(). -
The
sizeof_argsbackward-compatibility macro and the old struct-based command-argument shim have been removed. The macro returned incorrect values on 32-bit architectures; there is no intention to fix it. -
The platform-specific filter helpers (
nvme_filter_*) are no longer exported from libnvme. Only thelibnvme_scan_*interfaces remain public. Plugins that called filter helpers directly must be updated to use the scan API. -
libnvme_ctrl_match_config()has been removed. It was exported but had no callers outside the library. -
libnvmf_ctrl_get_fabrics_config()has been removed. The individual field accessors generated by the new accessor machinery provide equivalent access without exposing the internal nested struct. -
nvme_mi_ctrl_thas been removed. MI functionality is now accessed throughstruct nvme_transport_handle, the same abstraction used for direct ioctl access; the transport is chosen at handle construction.nvme_mi_admin_identify()andnvme_mi_admin_identify_partial()are gone; uselibnvme_ctrl_identify()with a transport handle opened for MI. -
Several deprecated identifiers have been removed for 3.0: the duplicate
NVME_SC_FEAT_IOCS_COMBINATION_REJECTEDdefine, the old notification-mask enum names, MI backward-compatibility#defines, andnvme_cmd_get_log_telemetry_host_lsp(renamed tonvme_log_telemetry_host_lsp). Update any code using these names. -
The environment-variable configuration knobs for libnvme have been removed.
LIBNVME_MI_PROBE_ENABLED,LIBNVME_TEST_BASE_DIR, and similar variables no longer have any effect. Replace them with explicit setter calls on the global context:libnvme_set_probe_enabled(),libnvme_set_test_base_dir(),libnvme_set_test_sysfs_dir(),libnvme_set_force_4k(), etc.