SPDK v18.01: Blobstore Thin Provisioning

The SPDK team is proud to announce the v18.01 release.


Thanks to everyone who contributed to the SPDK v18.01 release:

  • Barry Spinney
  • Ben Walker
  • Changpeng Liu
  • Chen Wang
  • Cunyin Chang
  • Daniel Mrzyglod
  • Daniel Verkamp
  • Dariusz Stojaczyk
  • Dave Boutcher
  • Ed Rodriguez
  • Felipe Franciosi
  • Gang Cao
  • Hailiang Wang
  • Huagen Xu
  • Isaac Otsiabah
  • Jim Harris
  • John Meneghini
  • Jonas Pfefferle
  • Karol Latecki
  • Lance Hartmann
  • Liang Yan
  • Lu Fan
  • Lukasz Galka
  • Maciej Szwed
  • Nathan Cutler
  • Paul Luse
  • Pawel Kaminski
  • Pawel Niedzwiecki
  • Pawel Wodkowski
  • Philipp Skadorov
  • Piotr Pelplinski
  • Sebastian Basierski
  • Seth Howell
  • Shuhei Matsumoto
  • Slawomir Mrozowicz
  • Stephen Bates
  • Tomasz Kulasek
  • Tomasz Zawadzki
  • Xiaodong Liu
  • Yanbo Zhou
  • Young Tack Jin
  • Ziye Yang
  • Wenzhong Wu

SPDK v18.01 Changelog

Build System

The build system now includes a make install rule, including support for the common DESTDIR and prefix variables as used in other build systems. Additionally, the prefix may be set via the configure --prefix option. Example: make install prefix=/usr.


A JSON RPC listener is now enabled by default using a UNIX domain socket at /var/run/spdk.sock. A -r option command line option has been added to enable an alternative UNIX domain socket location, or a TCP port in the format ip_addr:tcp_port (i.e. The Rpc configuration file section is now deprecated and will be removed in the v18.04 release.

I/O Channels

spdk_poller_register() and spdk_poller_unregister() were moved from the event framework (include/spdk/event.h) to the I/O channel library (include/spdk/io_channel.h). This allows code that doesn’t depend on the event framework to request registration and unregistration of pollers.

spdk_for_each_channel() now allows asynchronous operations during iteration. Instead of immediately continuing the interation upon returning from the iteration callback, the user must call spdk_for_each_channel_continue() to resume iteration.

Block Device Abstraction Layer (bdev)

The poller abstraction was removed from the bdev layer. There is now a general purpose abstraction for pollers available in include/spdk/io_channel.h


A set of changes were made in the SPDK’s lib code altering, instances of calls to exit() and abort() to return a failure instead wherever reasonably possible. This has resulted in return type changes of the API for:

  • spdk_env_init() from type void to int.
  • spdk_mem_map_init() from type void to int.

Applications making use of these APIs should be modified to check for a non-zero return value instead of relying on them to fail without return.

NVMe Driver

SPDK now supports hotplug for vfio-attached devices. But there is one thing keep in mind: Only physical removal events are supported; removing devices via the sysfs remove file will not work.

NVMe-oF Target

Subsystems are no longer tied explicitly to CPU cores. Instead, connections are handed out to the available cores round-robin. The “Core” option in the configuration file has been removed.


A number of functions have been renamed:

  • spdk_bs_md_resize_blob() => spdk_blob_resize()
  • spdk_bs_md_sync_blob() => spdk_blob_sync_md()
  • spdk_bs_md_close_blob() => spdk_blob_close()
  • spdk_bs_md_get_xattr_names() => spdk_blob_get_xattr_names()
  • spdk_bs_md_get_xattr_value() => spdk_blob_get_xattr_value()
  • spdk_blob_md_set_xattr() => spdk_blob_set_xattr()
  • spdk_blob_md_remove_xattr() => spdk_blob_remove_xattr()
  • spdk_bs_md_create_blob() => spdk_bs_create_blob()
  • spdk_bs_md_open_blob() => spdk_bs_open_blob()
  • spdk_bs_md_delete_blob() => spdk_bs_delete_blob()
  • spdk_bs_md_iter_first() => spdk_bs_iter_first()
  • spdk_bs_md_iter_next() => spdk_bs_iter_next()

The function signature of spdk_blob_close() has changed. It now takes a struct spdk_blob * argument rather than struct spdk_blob **.

The function signature of spdk_bs_iter_next() has changed. It now takes a struct spdk_blob * argument rather than struct spdk_blob **.

Thin provisioning support has been added to the blobstore. It can be enabled by setting the thin_provision flag in struct spdk_blob_opts when calling spdk_bs_create_blob_ext().

NBD device

The NBD application (test/lib/bdev/nbd) has been removed; Same functionality can now be achieved by using the test/app/bdev_svc application and start_nbd_disk RPC method. See the GPT documentation for more details.

FIO plugin

SPDK fio_plugin now suports FIO 3.3. The support for previous FIO 2.21 has been dropped, although it still remains to work for now. The new FIO contains huge amount of bugfixes and it’s recommended to do an update.

Virtio library

Previously a part of the bdev_virtio module, now a separate library. Virtio is now available via spdk_internal/virtio.h file. This is an internal interface to be used when implementing new Virtio backends, namely Virtio-BLK.


The MinConnectionIdleInterval parameter has been removed, and connections are no longer migrated to an epoll/kqueue descriptor on the master core when idle.