tagged Oct 31, 2017 · 2835 commits to master since this release

Assets 2

New dependencies

libuuid was added as new dependency for logical volumes.

libnuma is required unconditionally now that the DPDK submodule has been updated to DPDK 17.08.

Block Device Abstraction Layer (bdev)

An fio plugin was added that can route I/O to the bdev layer. See the plugin documentation for more information.

spdk_bdev_unmap() was modified to take an offset and a length in bytes as arguments instead of requiring the
user to provide an array of SCSI unmap descriptors. This limits unmaps to a single contiguous range.

spdk_bdev_write_zeroes() was introduced. It ensures that all specified blocks will be zeroed out. If a block device doesn't natively support a write zeroes command, the bdev layer emulates it using write commands.

New API functions that accept I/O parameters in units of blocks instead of bytes have been added:

  • spdk_bdev_read_blocks(), spdk_bdev_readv_blocks()
  • spdk_bdev_write_blocks(), spdk_bdev_writev_blocks()
  • spdk_bdev_write_zeroes_blocks()
  • spdk_bdev_unmap_blocks()

The bdev layer now handles temporary out-of-memory I/O failures internally by queueing the I/O to be retried later.

Linux AIO bdev

The AIO bdev now allows the user to override the auto-detected block size.

NVMe driver

The NVMe driver now recognizes the NVMe 1.3 Namespace Optimal I/O Boundary field. NVMe 1.3 devices may report an optimal I/O boundary, which the driver will take into account when splitting I/O requests.

The HotplugEnable option in [Nvme] sections of the configuration file is now "No" by default. It was previously "Yes".

The NVMe library now includes a spdk_nvme_ns_get_ctrlr() function which returns the NVMe Controller associated with a given namespace.

The NVMe library now allows the user to specify a host identifier when attaching to a controller. The host identifier is used as part of the Reservations feature, as well as in the NVMe-oF Connect command. The default
host ID is also now a randomly-generated UUID, and the default host NQN uses the host ID to generate a UUID-based NQN.

spdk_nvme_connect() was added to allow the user to connect directly to a single NVMe or NVMe-oF controller.

NVMe-oF Target (nvmf_tgt)

The NVMe-oF target no longer requires any in-capsule data buffers to run, and the feature is now entirely optional. Previously, at least 4 KiB in-capsule data buffers were required.

NVMe-oF subsytems have a new configuration option, AllowAnyHost, to control whether the host NQN whitelist is enforced when accepting new connections. If no Host options have been specified and AllowAnyHost is disabled, the connection will be denied; this is a behavior change from previous releases,
which allowed any host NQN to connect if the Host list was empty. AllowAnyHost is disabled by default.

NVMe-oF namespaces may now be assigned arbitrary namespace IDs, and the number of namespaces per subsystem is no longer limited.

The NVMe-oF target now supports the Write Zeroes command.

Environment Abstraction Layer

A new default value, SPDK_MEMPOOL_DEFAULT_CACHE_SIZE, was added to provide additional clarity when constructing spdk_mempools. Previously, -1 could be passed and the library would choose a reasonable default, but this new value makes it explicit that the default is being used.


The blobstore super block now contains a bstype field to identify the type of the blobstore. Existing code should be updated to fill out bstype when calling spdk_bs_init() and spdk_bs_load().

spdk_bs_destroy() was added to allow destroying blobstore on device with an initialized blobstore.

spdk_bs_io_readv_blob() and spdk_bs_io_writev_blob() were added to enable scattered payloads.

A CLI tool for blobstore has been added, allowing basic operations through either command line or shell interface. See the blobcli documentation for more details.

Event Framework

The ability to set a thread name, previously only used by the reactor code, is now part of the spdk_thread_allocate() API. Users may specify a thread name which will show up in tools like gdb.


The spdk_trace_dump() function now takes a new parameter to allow the caller to specify an output file handle (stdout or stderr, for example).

Logical Volumes

Logical volumes library built on top of SPDK blobstore has been added. It is possible to create logical volumes on top of other devices using RPC.

See the logical volumes documentation for more information.

Persistent Memory

A new persistent memory bdev type has been added. The persistent memory block device is built on top of libpmemblk. It is possible to create pmem devices on top of pmem pool files using RPC.

See the Pmem Block Device documentation for more information.

Virtio SCSI driver

A userspace driver for Virtio SCSI devices has been added. The driver is capable of creating block devices on top of LUNs exposed by another SPDK vhost-scsi application.

See the Virtio SCSI documentation and Getting Started guide for more information.