summaryrefslogtreecommitdiffstats
path: root/src/spdk/CHANGELOG.md
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 18:24:20 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 18:24:20 +0000
commit483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch)
treee5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/spdk/CHANGELOG.md
parentInitial commit. (diff)
downloadceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.tar.xz
ceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.zip
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--src/spdk/CHANGELOG.md986
1 files changed, 986 insertions, 0 deletions
diff --git a/src/spdk/CHANGELOG.md b/src/spdk/CHANGELOG.md
new file mode 100644
index 00000000..9f4a27ff
--- /dev/null
+++ b/src/spdk/CHANGELOG.md
@@ -0,0 +1,986 @@
+# Changelog
+
+## v18.10: (Upcoming Release)
+
+### nvme
+
+spdk_nvme_ctrlr_cmd_security_send() and spdk_nvme_ctrlr_cmd_security_receive()
+were added to support sending or receiving security protocol data to or from
+nvme controller.
+
+spdk_nvme_ns_get_extended_sector_size() was added. This function includes
+the metadata size per sector (if any). spdk_nvme_ns_get_sector_size() still
+returns only the data size per sector, not including metadata.
+
+### Build System
+
+New `configure` options, `--with-shared` and `--without-shared`
+[default], provide the capability to build, or not, SPDK shared libraries.
+This includes the single SPDK shared lib encompassing all of the SPDK
+static libs as well as individual SPDK shared libs corresponding to
+each of the SPDK static ones. Although the production of the shared
+libs conforms with conventional version naming practices, such naming
+does not at this time confer any SPDK ABI compatibility claims.
+
+### bdev
+
+spdk_bdev_alias_del_all() was added to delete all alias from block device.
+
+A new virtual bdev module has been added to perform at rest data encryption using the DPDK CryptoDev
+Framework. The module initially uses a software AESNI CBC cipher with experimental support for the
+Intel QAT hardware accelerator also currently implemented with support for CBC cipher. Future work
+may include additional ciphers as well as consideration for authentication. NOTE: this module is
+currently marked as experimental. Do not use in production.
+
+The RAID virtual bdev module is now always enabled by default. The configure --with-raid and
+--without-raid options are now ignored and deprecated and will be removed in the next release.
+
+Enforcement of bandwidth limits for quality of service (QoS) has been added to the bdev layer.
+See the new [set_bdev_qos_limit](http://www.spdk.io/doc/jsonrpc.html#rpc_set_bdev_qos_limit)
+documentation for more details. The previous set_bdev_qos_limit_iops RPC method introduced at
+18.04 release has been deprecated. The new set_bdev_qos_limit RPC method can support both
+bandwidth and IOPS limits.
+
+### Environment Abstraction Layer and Event Framework
+
+The size parameter of spdk_mem_map_translate is now a pointer. This allows the
+function to report back the actual size of the translation relative to the original
+request made by the user.
+
+A new structure spdk_mem_map_ops has been introduced to hold memory map related
+callbacks. This structure is now passed as the second argument of spdk_mem_map_alloc
+in lieu of the notify callback.
+
+### iscsi target
+
+Parameter names of `set_iscsi_options` and `get_iscsi_global_params` RPC
+method for CHAP authentication in discovery sessions have been changed to
+align with `construct_target_node` RPC method. Old names are still usable
+but will be removed in future release.
+
+`set_iscsi_discovery_auth` and `set_iscsi_target_node_auth` RPC methods have
+been added to set CHAP authentication for discovery sessions and existing
+target nodes, respectively.
+
+The SPDK iSCSI target supports an AuthFile which can be used to load CHAP
+shared secrets when the iSCSI target starts. SPDK previously provided a
+default location for this file (`/usr/local/etc/spdk/auth.conf`) if none was
+specified. This default has been removed. Users must now explicitly specify
+the location of this file to load CHAP shared secrets from a file, or use
+the related iSCSI RPC methods to add them at runtime.
+
+### iscsi initiator
+
+The SPDK iSCSI initiator is no longer considered experimental and becomes
+a first-class citizen among bdev modules. The basic usage has been briefly
+described in the bdev user guide: [iSCSI bdev](https://spdk.io/doc/bdev.html#bdev_config_iscsi)
+
+### Miscellaneous
+
+The ReactorMask config file parameter has been deprecated. Users should
+use the -m or --cpumask command line option to specify the CPU core mask
+for the application.
+
+Default config file pathnames have been removed from iscsi_tgt, nvmf_tgt
+and vhost. Config file pathnames may now only be specified using the
+-c command line option.
+
+Users may no longer set DPDK_DIR in their environment to specify the
+location of the DPDK installation used to build SPDK. Using DPDK_DIR
+has not been the documented nor recommended way to specify the DPDK
+location for several releases, but removing it ensures no unexpected
+surprises for users who may have DPDK_DIR defined for other reasons.
+Users should just use the "configure" script to specify the DPDK
+location before building SPDK.
+
+Although we know that many developers still use Python 2 we are officially
+switching to Python3 with requirement that all new code must be valid also
+for Python 2 up to the EOL which is year 2020.
+
+Invoking interpreter explicitly is forbidden for executable scripts. There
+is no need to use syntax like "python ./scripts/rpc.py". All executable
+scripts must contain proper shebang pointing to the right interpreter.
+Scripts without shebang musn't be executable.
+
+A Python script has been added to enable conversion of old INI config file
+to new JSON-RPC config file format. This script can be found at
+scripts/config_converter.py. Example how this script can be used:
+~~~{.sh}
+cat old_format.ini | scripts/config_converter.py > new_json_format.json
+~~~
+
+### Sock
+
+Two additional parameters were added to spdk_sock_get_addr() for the server
+port and client port. These parameters are named "sport" and "cport"
+respectively.
+
+### Virtio
+
+The following RPC commands have been deprecated:
+ - construct_virtio_user_scsi_bdev
+ - construct_virtio_pci_scsi_bdev
+ - construct_virtio_user_blk_bdev
+ - construct_virtio_pci_blk_bdev
+ - remove_virtio_scsi_bdev
+
+The `construct_virtio_*` ones were replaced with a single `construct_virtio_dev`
+command that can create any type of Virtio bdev(s). `remove_virtio_scsi_bdev`
+was replaced with `remove_virtio_bdev` that can delete both Virtio Block and SCSI
+devices.
+
+## v18.07:
+
+### bdev
+
+A new public header file bdev_module.h has been introduced to facilitate the
+development of new bdev modules. This header includes an interface for the
+spdk_bdev_part and spdk_bdev_part_base objects to enable the creation of
+multiple virtual bdevs on top of a single base bdev and should act as the
+primary API for module authors.
+
+spdk_bdev_get_opts() and spdk_bdev_set_opts() were added to set bdev-wide
+options.
+
+A mechanism for handling out of memory condition errors (ENOMEM) returned from
+I/O submission requests at the bdev layer has been added. See
+spdk_bdev_queue_io_wait().
+
+The spdk_bdev_get_io_stat() function now returns cumulative totals instead of
+resetting on each call. This allows multiple callers to query I/O statistics
+without conflicting with each other. Existing users will need to adjust their
+code to record the previous I/O statistics to calculate the delta between calls.
+
+I/O queue depth tracking and samples options have been added. See
+spdk_bdev_get_qd(), spdk_bdev_get_qd_sampling_period(), and
+spdk_bdev_set_qd_sampling_period().
+
+### RAID module
+A new bdev module called "raid" has been added as experimental module which
+aggregates underlying NVMe bdevs and exposes a single raid bdev. Please note
+that vhost will not work with this module because it does not yet have support
+for multi-element io vectors.
+
+### Log
+
+The debug log component flag available on several SPDK applications has been
+renamed from `-t` to `-L` to prevent confusion with tracepoints and to allow the
+option to be added to tools that already use `-t` to mean something else.
+
+### Blobstore
+
+A new function, spdk_bs_dump(), has been added that dumps all of the contents of
+a blobstore to a file pointer. This includes the metadata and is very useful for
+debugging.
+
+Two new operations have been added for thin-provisioned blobs.
+spdk_bs_inflate_blob() will allocate clusters for all thinly provisioned regions
+of the blob and populate them with the correct data by reading from the backing
+blob(s). spdk_bs_blob_decouple_parent() works similarly, but will only allocate
+clusters that correspond to data in the blob's immediate parent. Clusters
+allocated to grandparents or that aren't allocated at all will remain
+thin-provisioned.
+
+### BlobFS
+
+Changed the return type of spdk_file_truncate() from void to int to allow the
+propagation of `ENOMEM` errors.
+
+### NVMe Driver
+
+The new API functions spdk_nvme_qpair_add_cmd_error_injection() and
+spdk_nvme_qpair_remove_cmd_error_injection() have been added for NVMe error
+emulation. Users can set a specified command to fail with a particular error
+status.
+
+Changed the name `timeout_sec` parameter to `timeout_us` in
+spdk_nvme_ctrlr_register_timeout_callback(), and also changed the type from
+uint32_t to uint64_t. This will give users more fine-grained control over the
+timeout period.
+
+Basic support for Open Channel SSDs was added. See nvme_ocssd.h
+
+### NVMe Over Fabrics
+
+The spdk_nvmf_tgt_destroy() function is now asynchronous and takes a callback
+as a parameter.
+
+spdk_nvmf_qpair_disconnect() was added to allow the user to disconnect qpairs.
+
+spdk_nvmf_subsystem_get_max_namespaces() was added to query the maximum allowed
+number of namespaces for a given subsystem.
+
+### Build System
+
+The build system now generates a combined shared library (libspdk.so) that may
+be used in place of the individual static libraries (libspdk_*.a). The combined
+library includes all components of SPDK and is intended to make linking against
+SPDK easier. The static libraries are also still provided for users that prefer
+to link only the minimal set of components required.
+
+### git pre-commit and pre-push hooks
+
+The pre-commit hook will run `scripts/check_format.sh` and verify there are no
+formating errors before allowing `git commit` to run. The pre-push hook runs
+`make CONFIG_WERROR=y` with and without `CONFIG_DEBUG=y` using both the gcc and
+clang compiler before allowing `git push` to run. Following each DEBUG build
+`test/unit/unittest.sh` is run and verified. Results are recorded in the
+`make.log` file.
+
+To enable type: 'git config core.hooksPath .githooks'. To override after
+configuration use the `git --no-verify` flag.
+
+### RPC
+
+The `start_nbd_disk` RPC method now returns the path to the kernel NBD device node
+rather than always returning `true`.
+
+### DPDK 18.05
+
+The DPDK submodule has been rebased on the DPDK 18.05 release. DPDK 18.05 supports
+dynamic memory allocation, but due to some issues found after the DPDK 18.05 release,
+that support is not enabled for SPDK 18.07. Therefore, SPDK 18.07 will continue to use
+the legacy memory allocation model. The plan is to enable dynamic memory allocation
+after the DPDK 18.08 release which should fix these issues.
+
+### Environment Abstraction Layer and Event Framework
+
+The spdk_mem_map_translate() function now takes a size parameter to indicate the size of
+the memory region. This can be used by environment implementations to validate the
+requested translation.
+
+The I/O Channel implementation has been moved to its own library - lib/thread. The
+public API that was previously in spdk/io_channel.h is now in spdk/thread.h The
+file spdk/io_channel.h remains and includes spdk/thread.h.
+
+spdk_reactor_get_tsc_stats was added to return interesting statistics for each
+reactor.
+
+### IOAT
+
+IOAT for copy engine is disabled by default. It can be enabled by specifying the Enable
+option with "Yes" in `[Ioat]` section of the configuration file. The Disable option is
+now deprecated and will be removed in a future release.
+
+## v18.04: Logical Volume Snapshot/Clone, iSCSI Initiator, Bdev QoS, VPP Userspace TCP/IP
+
+### vhost
+
+The SPDK vhost-scsi, vhost-blk and vhost-nvme applications have fixes to address the
+DPDK rte_vhost vulnerability [CVE-2018-1059](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1059).
+Please see this [security advisory](https://access.redhat.com/security/cve/cve-2018-1059)
+for additional information on the DPDK vulnerability.
+
+Workarounds have been added to ensure vhost compatibility with QEMU 2.12.
+
+EXPERIMENTAL: Support for vhost-nvme has been added to the SPDK vhost target. See the
+[vhost documentation](http://www.spdk.io/doc/vhost.html) for more details.
+
+### Unified Target Application
+
+A new unified SPDK target application, `spdk_tgt`, has been added. This application combines the
+functionality of several existing SPDK applications, including the iSCSI target, NVMe-oF target,
+and vhost target. The new application can be managed through the existing configuration file and
+[JSON-RPC](http://www.spdk.io/doc/jsonrpc.html) methods.
+
+### Env
+
+spdk_mempool_get_bulk() has been added to wrap DPDK rte_mempool_get_bulk().
+
+New memory management functions spdk_malloc(), spdk_zmalloc(), and spdk_free() have been added.
+These new functions have a `flags` parameter that allows the user to specify whether the allocated
+memory needs to be suitable for DMA and whether it should be shared across processes with the same
+shm_id. The new functions are intended to replace spdk_dma_malloc() and related functions, which will
+eventually be deprecated and removed.
+
+### Bdev
+
+A new optional bdev module interface function, `init_complete`, has been added to notify bdev modules
+when the bdev subsystem initialization is complete. This may be useful for virtual bdevs that require
+notification that the set of initialization examine() calls is complete.
+
+The bdev layer now allows modules to provide an optional per-bdev UUID, which can be retrieved with
+the spdk_bdev_get_uuid() function.
+
+Enforcement of IOPS limits for quality of service (QoS) has been added to the bdev layer. See the
+[set_bdev_qos_limit_iops](http://www.spdk.io/doc/jsonrpc.html#rpc_set_bdev_qos_limit_iops) documentation
+for more details.
+
+### RPC
+
+The `[Rpc]` configuration file section, which was deprecated in v18.01, has been removed.
+Users should switch to the `-r` command-line parameter instead.
+
+The JSON-RPC server implementation now allows up to 32 megabyte responses, growing as
+needed; previously, the response was limited to 32 kilobytes.
+
+### SPDKCLI
+
+EXPERIMENTAL: New SPDKCLI interactive command tool for managing SPDK is available.
+See the [SPDKCLI](http://www.spdk.io/doc/spdkcli.html) documentation for more details.
+
+### NVMe Driver
+
+EXPERIMENTAL: Support for WDS and RDS capable CMBs in NVMe controllers has been added. This support is
+experimental pending a functional allocator to free and reallocate CMB buffers.
+
+spdk_nvme_ns_get_uuid() has been added to allow retrieval of per-namespace UUIDs when available.
+
+New API functions spdk_nvme_ctrlr_get_first_active_ns() and spdk_nvme_ctrlr_get_next_active_ns()
+have been added to iterate active namespaces, as well as spdk_nvme_ctrlr_is_active_ns() to check if
+a namespace ID is active.
+
+### NVMe-oF Target
+
+Namespaces may now be assigned unique identifiers via new optional `eui64` and `nguid` parameters
+to the `nvmf_subsystem_add_ns` RPC method. Additionally, the NVMe-oF target automatically exposes
+the backing bdev's UUID as the namespace UUID when available.
+
+spdk_nvmf_subsystem_remove_ns() is now asynchronous and requires a callback to indicate completion.
+
+### Blobstore
+
+A number of functions have been renamed:
+
+- spdk_bs_io_write_blob() => spdk_blob_io_write()
+- spdk_bs_io_read_blob() => spdk_blob_io_read()
+- spdk_bs_io_writev_blob() => spdk_blob_io_writev()
+- spdk_bs_io_readv_blob() => spdk_blob_io_readv()
+- spdk_bs_io_unmap_blob() => spdk_blob_io_unmap()
+- spdk_bs_io_write_zeroes_blob() => spdk_blob_io_write_zeroes()
+
+The old names still exist but are deprecated. They will be removed in the v18.07 release.
+
+spdk_blob_resize() is now an asynchronous operation to enable resizing a blob while I/O
+are in progress to that blob on other threads. An explicit spdk_blob_sync_md() is still
+required to sync the updated metadata to disk.
+
+### Logical Volumes
+
+A new `destroy_lvol_bdev` RPC method to delete logical volumes has been added.
+
+Lvols now have their own UUIDs which replace previous LvolStoreUUID_BlobID combination.
+
+New Snapshot and Clone functionalities have been added. User may create Snapshots of existing Lvols
+and Clones of existing Snapshots.
+See the [lvol snapshots](http://www.spdk.io/doc/logical_volumes.html#lvol_snapshots) documentation
+for more details.
+
+Resizing logical volumes is now supported via the `resize_lvol_bdev` RPC method.
+
+### Lib
+
+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.
+
+spdk_app_start() no longer exit()'s on an internal failure, but
+instead returns a non-zero error status.
+
+spdk_app_parse_args() no longer exit()'s on help, '-h', or an invalid
+option, but instead returns SPDK_APP_PARSE_ARGS_HELP and
+SPDK_APP_PARSE_ARGS_FAIL, respectively, and SPDK_APP_PARSE_ARGS_SUCCESS
+on success.
+
+spdk_pci_get_device() has been deprecated and will be removed in SPDK v18.07.
+
+### I/O Channels
+
+The prototype for spdk_poller_fn() has been modified; it now returns a value indicating
+whether or not the poller did any work. Existing pollers will need to be updated to
+return a value.
+
+### iSCSI Target
+
+The SPDK iSCSI target now supports the fd.io Vector Packet Processing (VPP) framework userspace
+TCP/IP stack. See the [iSCSI VPP documentation](http://www.spdk.io/doc/iscsi.html#vpp) for more
+details.
+
+### iSCSI initiator
+
+An iSCSI initiator bdev module has been added to SPDK. This module should be considered
+experimental pending additional features and tests. More details can be found in
+lib/bdev/iscsi/README.
+
+### PMDK
+
+The persistent memory (PMDK) bdev module is now enabled using `--with-pmdk` instead of
+`--with-nvml`. This reflects the renaming of the persistent memory library from NVML to
+PMDK.
+
+### Virtio Block driver
+
+A userspace driver for Virtio Block devices has been added. It was built on top of the
+[Virtio](http://www.spdk.io/doc/virtio.html) library and can be managed similarly to
+the Virtio SCSI driver. See the
+[Virtio Block](http://www.spdk.io/doc/bdev.html#bdev_config_virtio_blk) reference for
+more information.
+
+### Virtio with 2MB hugepages
+
+The previous 1GB hugepage limitation has now been lifted. A new `-g` command-line option
+enables SPDK Virtio to work with 2MB hugepages.
+See [2MB hugepages](http://www.spdk.io/doc/virtio.html#virtio_2mb) for details.
+
+## v18.01: Blobstore Thin Provisioning
+
+### 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`.
+
+### RPC
+
+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. 127.0.0.1:5260). 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
+
+### Lib
+
+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.
+
+### Blobstore
+
+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](http://www.spdk.io/doc/bdev.html#bdev_config_gpt) documentation for more details.
+
+### FIO plugin
+
+SPDK `fio_plugin` now supports 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.
+
+### iSCSI
+
+The MinConnectionIdleInterval parameter has been removed, and connections are no longer migrated
+to an epoll/kqueue descriptor on the master core when idle.
+
+## v17.10: Logical Volumes
+
+### 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](http://github.com/axboe/fio) plugin was added that can route
+I/O to the bdev layer. See the [plugin documentation](https://github.com/spdk/spdk/tree/master/examples/bdev/fio_plugin/)
+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.
+
+### Blobstore
+
+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](https://github.com/spdk/spdk/tree/master/examples/blob/cli)
+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`.
+
+### Log
+
+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](http://www.spdk.io/doc/logical_volumes.html) 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](http://pmem.io/nvml/libpmemblk/).
+It is possible to create pmem devices on top of pmem pool files using RPC.
+
+See the [Pmem Block Device](http://www.spdk.io/doc/bdev.html#bdev_config_pmem) 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](http://www.spdk.io/doc/virtio.html) documentation and [Getting Started](http://www.spdk.io/doc/bdev.html#bdev_config_virtio_scsi) guide for more information.
+
+### Vhost target
+
+The vhost target application now supports live migration between QEMU instances.
+
+
+## v17.07: Build system improvements, userspace vhost-blk target, and GPT bdev
+
+### Build System
+
+A `configure` script has been added to simplify the build configuration process.
+The existing CONFIG file and `make CONFIG_...` options are also still supported.
+Run `./configure --help` for information about available configuration options.
+
+A DPDK submodule has been added to make building SPDK easier. If no `--with-dpdk`
+option is specified to configure, the SPDK build system will automatically build a
+known-good configuration of DPDK with the minimal options enabled. See the Building
+section of README.md for more information.
+
+A [Vagrant](https://www.vagrantup.com/) setup has been added to make it easier to
+develop and use SPDK on systems without suitable NVMe hardware. See the Vagrant
+section of README.md for more information.
+
+### Userspace vhost-blk target
+
+The vhost library and example app have been updated to support the vhost-blk
+protocol in addition to the existing vhost-scsi protocol.
+See the [vhost documentation](http://www.spdk.io/doc/vhost.html) for more details.
+
+### Block device abstraction layer (bdev)
+
+A GPT virtual block device has been added, which automatically exposes GPT partitions
+with a special SPDK-specific partition type as bdevs.
+See the [GPT bdev documentation](http://www.spdk.io/doc/bdev.md#bdev_config_gpt) for
+more information.
+
+### NVMe driver
+
+The NVMe driver has been updated to support recent Intel SSDs, including the Intel®
+Optane™ SSD DC P4800X series.
+
+A workaround has been added for devices that failed to recognize register writes
+during controller reset.
+
+The NVMe driver now allocates request tracking objects on a per-queue basis. The
+number of requests allowed on an I/O queue may be set during `spdk_nvme_probe()` by
+modifying `io_queue_requests` in the opts structure.
+
+The SPDK NVMe `fio_plugin` has been updated to support multiple threads (`numjobs`).
+
+spdk_nvme_ctrlr_alloc_io_qpair() has been modified to allow the user to override
+controller-level options for each individual I/O queue pair.
+Existing callers with qprio == 0 can be updated to:
+~~~
+... = spdk_nvme_ctrlr_alloc_io_qpair(ctrlr, NULL, 0);
+~~~
+Callers that need to specify a non-default qprio should be updated to:
+~~~
+struct spdk_nvme_io_qpair_opts opts;
+spdk_nvme_ctrlr_get_default_io_qpair_opts(ctrlr, &opts, sizeof(opts));
+opts.qprio = SPDK_NVME_QPRIO_...;
+... = spdk_nvme_ctrlr_alloc_io_qpair(ctrlr, &opts, sizeof(opts));
+~~~
+
+### Environment Abstraction Layer
+
+The environment abstraction layer has been updated to include several new functions
+in order to wrap additional DPDK functionality. See `include/spdk/env.h` for the
+current set of functions.
+
+### SPDK Performance Analysis with Intel® VTune™ Amplifier
+
+Support for SPDK performance analysis has been added to Intel® VTune™ Amplifier 2018.
+
+This analysis provides:
+- I/O performance monitoring (calculating standard I/O metrics like IOPS, throughput, etc.)
+- Tuning insights on the interplay of I/O and compute devices by estimating how many cores
+ would be reasonable to provide for SPDK to keep up with a current storage workload.
+
+See the VTune Amplifier documentation for more information.
+
+
+## v17.03: Blobstore and userspace vhost-scsi target
+
+### Blobstore and BlobFS
+
+The blobstore is a persistent, power-fail safe block allocator designed to be
+used as the local storage system backing a higher-level storage service.
+See the [blobstore documentation](http://www.spdk.io/doc/blob.html) for more details.
+
+BlobFS adds basic filesystem functionality like filenames on top of the blobstore.
+This release also includes a RocksDB Env implementation using BlobFS in place of the
+kernel filesystem.
+See the [BlobFS documentation](http://www.spdk.io/doc/blobfs.html) for more details.
+
+### Userspace vhost-scsi target
+
+A userspace implementation of the QEMU vhost-scsi protocol has been added.
+The vhost target is capable of exporting SPDK bdevs to QEMU-based VMs as virtio devices.
+See the [vhost documentation](http://www.spdk.io/doc/vhost.html) for more details.
+
+### Event framework
+
+The overhead of the main reactor event loop was reduced by optimizing the number of
+calls to spdk_get_ticks() per iteration.
+
+### NVMe library
+
+The NVMe library will now automatically split readv/writev requests with scatter-gather
+lists that do not map to valid PRP lists when the NVMe controller does not natively
+support SGLs.
+
+The `identify` and `perf` NVMe examples were modified to add a consistent format for
+specifying remote NVMe over Fabrics devices via the `-r` option.
+This is implemented using the new `spdk_nvme_transport_id_parse()` function.
+
+### iSCSI Target
+
+The [Nvme] section of the configuration file was modified to remove the `BDF` directive
+and replace it with a `TransportID` directive. Both local (PCIe) and remote (NVMe-oF)
+devices can now be specified as the backing block device. A script to generate an
+entire [Nvme] section based on the local NVMe devices attached was added at
+`scripts/gen_nvme.sh`.
+
+### NVMe-oF Target
+
+The [Nvme] section of the configuration file was modified to remove the `BDF` directive
+and replace it with a `TransportID` directive. Both local (PCIe) and remote (NVMe-oF)
+devices can now be specified as the backing block device. A script to generate an
+entire [Nvme] section based on the local NVMe devices attached was added at
+`scripts/gen_nvme.sh`.
+
+## v16.12: NVMe over Fabrics host, hotplug, and multi-process
+
+### NVMe library
+
+The NVMe library has been changed to create its own request memory pool rather than
+requiring the user to initialize the global `request_mempool` variable. Apps can be
+updated by simply removing the initialization of `request_mempool`. Since the NVMe
+library user no longer needs to know the size of the internal NVMe request
+structure to create the pool, the `spdk_nvme_request_size()` function was also removed.
+
+The `spdk_nvme_ns_cmd_deallocate()` function was renamed and extended to become
+`spdk_nvme_ns_cmd_dataset_management()`, which allows access to all of the NVMe
+Dataset Management command's parameters. Existing callers can be updated to use
+`spdk_nvme_ns_cmd_dataset_management()` with `SPDK_NVME_DSM_ATTR_DEALLOCATE` as the
+`type` parameter.
+
+The NVMe library SGL callback prototype has been changed to return virtual addresses
+rather than physical addresses. Callers of `spdk_nvme_ns_cmd_readv()` and
+`spdk_nvme_ns_cmd_writev()` must update their `next_sge_fn` callbacks to match.
+
+The NVMe library now supports NVMe over Fabrics devices in addition to the existing
+support for local PCIe-attached NVMe devices. For an example of how to enable
+NVMe over Fabrics support in an application, see `examples/nvme/identify` and
+`examples/nvme/perf`.
+
+Hot insert/remove support for NVMe devices has been added. To enable NVMe hotplug
+support, an application should call the `spdk_nvme_probe()` function on a regular
+basis to probe for new devices (reported via the existing `probe_cb` callback) and
+removed devices (reported via a new `remove_cb` callback). Hotplug is currently
+only supported on Linux with the `uio_pci_generic` driver, and newly-added NVMe
+devices must be bound to `uio_pci_generic` by an external script or tool.
+
+Multiple processes may now coordinate and use a single NVMe device simultaneously
+using [DPDK Multi-process Support](http://dpdk.org/doc/guides/prog_guide/multi_proc_support.html).
+
+### NVMe over Fabrics target (`nvmf_tgt`)
+
+The `nvmf_tgt` configuration file format has been updated significantly to enable
+new features. See the example configuration file `etc/spdk/nvmf.conf.in` for
+more details on the new and changed options.
+
+The NVMe over Fabrics target now supports virtual mode subsystems, which allow the
+user to export devices from the SPDK block device abstraction layer as NVMe over
+Fabrics subsystems. Direct mode (raw NVMe device access) is also still supported,
+and a single `nvmf_tgt` may export both types of subsystems simultaneously.
+
+### Block device abstraction layer (bdev)
+
+The bdev layer now supports scatter/gather read and write I/O APIs, and the NVMe
+blockdev driver has been updated to support scatter/gather. Apps can use the
+new scatter/gather support via the `spdk_bdev_readv()` and `spdk_bdev_writev()`
+functions.
+
+The bdev status returned from each I/O has been extended to pass through NVMe
+or SCSI status codes directly in cases where the underlying device can provide
+a more specific status code.
+
+A Ceph RBD (RADOS Block Device) blockdev driver has been added. This allows the
+`iscsi_tgt` and `nvmf_tgt` apps to export Ceph RBD volumes as iSCSI LUNs or
+NVMe namespaces.
+
+### General changes
+
+`libpciaccess` has been removed as a dependency and DPDK PCI enumeration is
+used instead. Prior to DPDK 16.07 enumeration by class code was not supported,
+so for earlier DPDK versions, only Intel SSD DC P3x00 devices will be discovered
+by the NVMe library.
+
+The `env` environment abstraction library has been introduced, and a default
+DPDK-based implementation is provided as part of SPDK. The goal of the `env`
+layer is to enable use of alternate user-mode memory allocation and PCI access
+libraries. See `doc/porting.md` for more details.
+
+The build process has been modified to produce all of the library files in the
+`build/lib` directory. This is intended to simplify the use of SPDK from external
+projects, which can now link to SPDK libraries by adding the `build/lib` directory
+to the library path via `-L` and linking the SPDK libraries by name (for example,
+`-lspdk_nvme -lspdk_log -lspdk_util`).
+
+`nvmf_tgt` and `iscsi_tgt` now have a JSON-RPC interface, which allows the user
+to query and modify the configuration at runtime. The RPC service is disabled by
+default, since it currently does not provide any authentication or security
+mechanisms; it should only be enabled on systems with controlled user access
+behind a firewall. An example RPC client implemented in Python is provided in
+`scripts/rpc.py`.
+
+## v16.08: iSCSI target, NVMe over Fabrics maturity
+
+This release adds a userspace iSCSI target. The iSCSI target is capable of exporting
+NVMe devices over a network using the iSCSI protocol. The application is located
+in app/iscsi_tgt and a documented configuration file can be found at etc/spdk/spdk.conf.in.
+
+This release also significantly improves the existing NVMe over Fabrics target.
+ - The configuration file format was changed, which will require updates to
+ any existing nvmf.conf files (see `etc/spdk/nvmf.conf.in`):
+ - `SubsystemGroup` was renamed to `Subsystem`.
+ - `AuthFile` was removed (it was unimplemented).
+ - `nvmf_tgt` was updated to correctly recognize NQN (NVMe Qualified Names)
+ when naming subsystems. The default node name was changed to reflect this;
+ it is now "nqn.2016-06.io.spdk".
+ - `Port` and `Host` sections were merged into the `Subsystem` section
+ - Global options to control max queue depth, number of queues, max I/O
+ size, and max in-capsule data size were added.
+ - The Nvme section was removed. Now a list of devices is specified by
+ bus/device/function directly in the Subsystem section.
+ - Subsystems now have a Mode, which can be Direct or Virtual. This is an attempt
+ to future-proof the interface, so the only mode supported by this release
+ is "Direct".
+ - Many bug fixes and cleanups were applied to the `nvmf_tgt` app and library.
+ - The target now supports discovery.
+
+This release also adds one new feature and provides some better examples and tools
+for the NVMe driver.
+ - The Weighted Round Robin arbitration method is now supported. This allows
+ the user to specify different priorities on a per-I/O-queue basis. To
+ enable WRR, set the `arb_mechanism` field during `spdk_nvme_probe()`.
+ - A simplified "Hello World" example was added to show the proper way to use
+ the NVMe library API; see `examples/nvme/hello_world/hello_world.c`.
+ - A test for measuring software overhead was added. See `test/lib/nvme/overhead`.
+
+## v16.06: NVMf userspace target
+
+This release adds a userspace NVMf (NVMe over Fabrics) target, conforming to the
+newly-released NVMf 1.0/NVMe 1.2.1 specification. The NVMf target exports NVMe
+devices from a host machine over the network via RDMA. Currently, the target is
+limited to directly exporting physical NVMe devices, and the discovery subsystem
+is not supported.
+
+This release includes a general API cleanup, including renaming all declarations
+in public headers to include a `spdk` prefix to prevent namespace clashes with
+user code.
+
+- NVMe
+ - The `nvme_attach()` API was reworked into a new probe/attach model, which
+ moves device detection into the NVMe library. The new API also allows
+ parallel initialization of NVMe controllers, providing a major reduction in
+ startup time when using multiple controllers.
+ - I/O queue allocation was changed to be explicit in the API. Each function
+ that generates I/O requests now takes a queue pair (`spdk_nvme_qpair *`)
+ argument, and I/O queues may be allocated using
+ `spdk_nvme_ctrlr_alloc_io_qpair()`. This allows more flexible assignment of
+ queue pairs than the previous model, which only allowed a single queue
+ per thread and limited the total number of I/O queues to the lowest number
+ supported on any attached controller.
+ - Added support for the Write Zeroes command.
+ - `examples/nvme/perf` can now report I/O command latency from the
+ the controller's viewpoint using the Intel vendor-specific read/write latency
+ log page.
+ - Added namespace reservation command support, which can be used to coordinate
+ sharing of a namespace between multiple hosts.
+ - Added hardware SGL support, which enables use of scattered buffers that
+ don't conform to the PRP list alignment and length requirements on supported
+ NVMe controllers.
+ - Added end-to-end data protection support, including the ability to write and
+ read metadata in extended LBA (metadata appended to each block of data in the
+ buffer) and separate metadata buffer modes.
+ See `spdk_nvme_ns_cmd_write_with_md()` and `spdk_nvme_ns_cmd_read_with_md()`
+ for details.
+- IOAT
+ - The DMA block fill feature is now exposed via the `ioat_submit_fill()`
+ function. This is functionally similar to `memset()`, except the memory is
+ filled with an 8-byte repeating pattern instead of a single byte like memset.
+- PCI
+ - Added support for using DPDK for PCI device mapping in addition to the
+ existing libpciaccess option. Using the DPDK PCI support also allows use of
+ the Linux VFIO driver model, which means that SPDK userspace drivers will work
+ with the IOMMU enabled. Additionally, SPDK applications may be run as an
+ unprivileged user with access restricted to a specific set of PCIe devices.
+ - The PCI library API was made more generic to abstract away differences
+ between the underlying PCI access implementations.
+
+## v1.2.0: IOAT user-space driver
+
+This release adds a user-space driver with support for the Intel I/O Acceleration Technology (I/OAT, also known as "Crystal Beach") DMA offload engine.
+
+- IOAT
+ - New user-space driver supporting DMA memory copy offload
+ - Example programs `ioat/perf` and `ioat/verify`
+ - Kernel-mode DMA engine test driver `kperf` for performance comparison
+- NVMe
+ - Per-I/O flags for Force Unit Access (FUA) and Limited Retry
+ - Public API for retrieving log pages
+ - Reservation register/acquire/release/report command support
+ - Scattered payload support - an alternate API to provide I/O buffers via a sequence of callbacks
+ - Declarations and `nvme/identify` support for Intel SSD DC P3700 series vendor-specific log pages and features
+- Updated to support DPDK 2.2.0
+
+
+## v1.0.0: NVMe user-space driver
+
+This is the initial open source release of the Storage Performance Development Kit (SPDK).
+
+Features:
+- NVMe user-space driver
+- NVMe example programs
+ - `examples/nvme/perf` tests performance (IOPS) using the NVMe user-space driver
+ - `examples/nvme/identify` displays NVMe controller information in a human-readable format
+- Linux and FreeBSD support