SPDK v23.01.1: Maintenance Release

On behalf of the SPDK community I’m pleased to announce the release of SPDK v23.01.1.

v23.01.1 LTS


Corrected the optional key_name parameters in accel_crypto_keys_get and accel_crypto_key_destroy RPC commands.

Fixed SGL initialization in dpdk_cryptodev module when a task is processed in several iterations.

Fixed memory domain contexts not being copied when removing copy operations.


Auxiliary buffer is now freed when crypto operation fails in bdev crypto (#2886).

Uring bdev no longer sets the write_cache flag, as it does not support flushing.

The hdgst and ddgst fields are now output when saving bdev NVMe config.

Fixed off-by-one error in maximum buffer size calculation when determining whether bdev layer can allocate a buffer from the iobuf pool.

Crypto bdev no longer uses spdk_bdev_queue_io_wait() after receiving ENOMEM from accel. Instead, such IOs are completed with NOMEM status and bdev layer is responsible for retrying them.


Removed short-circuiting path for blob_freeze to ensure that if blob_freeze_io() is called twice in a row, and the second time occurs before the for_each_channel for the first completes, the second caller will receive its callback too soon (#2935).

Last md_page index is now correctly tracked during a resize (#2932).


Huge-related options are now omitted when –no-huge specified (#2973).


Fixed maybe-uninitialized compilation warnings under gcc 12.2.1.


bdevperf is now calling rand_r() twice to get 64-bit values to ensure it’s issuing I/O across the full range of the bdev.


The destination port is now checked before parsing address in the TCP transport to keep the behavior the same across Linux and FreeBSD due to differences in getaddrinfo() when port exceeds 65535 (#2936).

The numd field in the Reservation Report command is now filled as a 0 based value in accordance with the NVMe spec.

Fixed nvme_qpair_abort_all_queued_reqs() not being called for the admin queue in the PCIe transport (#2928).

PCIe transport now calls transport_ctrlr_disconnect_qpair_done() if ctrlr_disable_poll() fails, e.g. if the drive is unresponsive (#2931).

RDMA and TCP transports are now correctly initializing cpl->sqid when aborting requests (#2930).

Corrected reporting max SGE supported by the TCP transport to avoid unnecessarily splitting requests.


Fixed issue with aborting TCP requests awaiting R2T ACK leading to terminating the connection (#2789).

Deprecated cb_fn argument in spdk_nvmf_qpair_disconnect() and updated it to return -EINPROGRESS when a qpair is already being disconnected.

All trid fields are now initialized by spdk_nvmf_qpair_get_*_trid(). This fixed issue with active qpairs not getting disconnected after a listener is removed via nvmf_subsystem_remove_listener (#2595, #2862, #2864, #2865).


Fixed the type of rr-min-io parameter in bdev_nvme_set_multipath_policy RPC to be an integer.


Renamed rte_vhost_slave_config_change() to rte_vhost_backend_config_change() due to changes in DPDK.

Many thanks to everyone for your contributions, participation, and effort!