SPDK v17.10 and v17.10.1: Logical Volumes

The SPDK team is proud to announce the v17.10 release, as well as the v17.10.1 release (see below for details on the changes between v17.10 and v17.10.1). This release adds a major new feature, Logical Volumes.


Thanks to everyone who contributed to the SPDK v17.10 release:

  • Ben Walker
  • Changpeng Liu
  • Chunyang Hui
  • Cunyin Chang
  • Daniel Verkamp
  • Dariusz Stojaczyk
  • Gang Cao
  • Hailiang Wang
  • Isaac Otsiabah
  • Jan Kryl
  • Jim Harris
  • Jin Tsai
  • Karol Latecki
  • Konstantin Vyshetsky
  • kriw
  • Liang Yan
  • Lukasz Galka
  • Maciej Szwed
  • Paul Luse
  • Pavel Borzenkov
  • Pawel Kaminski
  • Pawel Niedzwiecki
  • Pawel Wodkowski
  • Piotr Pelplinski
  • Prital Shah
  • Seth Howell
  • Shuhei Matsumoto
  • Tomasz Zawadzki
  • Vishal Verma
  • Young Tack Jin
  • Ziye Yang

SPDK v17.10

New dependencies

libuuid was added as new dependency for logical volumes.

libnuma is now 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 to simplify the API and reduce conversion between bytes and blocks:

  • 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. spdk_nvme_probe() should still be used when connecting to multiple devices to allow parallel initializtion.

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 a 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.

SPDK v17.10.1

SPDK v17.10.1 is a bug fix and maintenance release with several critical fixes. All users of SPDK v17.10 are recommended to upgrade to v17.10.1.

Several issues found after the v17.10 release in the new Logical Volumes feature have been fixed.

The NVMe driver has been updated to recognize the RTD3 Entry timeout reported by the device when performing controller shutdown. In particular, this fixes timeouts on NVMe devices with long shutdown times, such as the Intel® SSD DC P4500 Series SSDs.

A potential issue when running the NVMe over Fabrics target with multiple cores has been fixed.

The env_dpdk environment layer has been updated to work with DPDK 17.11.