efd7b514d4
Here is the an example to describe existing issue: There is a Write request with 64KiB data length, and this IO is cross the IO boundary. We assume that the parent IO will have 2 children requests, one is 33KiB length, the other one is 31KiB. Here is the view of parent iovs, the first 33KiB length data has 33 iovs: iov.[0].iov_length = 1024; . . iov.[31].iov_length = 256; iov.[32].iov_length = 768; . . iov.[64].iov_length = 1024; In function _spdk_bdev_io_split(), then you can see that for the 33KiB length child request, exiting code will run out of child child_iov space and return error due to last one data buffer is not block size aligned. Here we can rewind the existing offset to last block size aligned buffer to avoid the error case, for backend which need aligned data buffer such as AIO backend, the request will go through spdk_bdev_io_get_buf() again to do the data copy, otherwise for those backend devices such as NVMe with hardware SGL support, 256 data segment is fine for them. Change-Id: I96ebdf29829d86f9b38fab28a7406eedc9fa44ef Signed-off-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/453604 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com> |
||
---|---|---|
.. | ||
include | ||
lib | ||
Makefile | ||
unittest.sh |