From 88fbbb6bbc0f10c8d8ee70e99e4bcbdff06db315 Mon Sep 17 00:00:00 2001 From: Jacek Kalwas Date: Thu, 6 Apr 2023 10:21:36 -0400 Subject: [PATCH] bdev: fix return value of bdev_io_get_max_buf_len Fixed function is used to determine if it is possible to get iobuf from the pool. To make sure that buf size alignment requirement is satisifed value returned shall include alignment value but subtracted by one. e.g. transaction size length = 64k buffer alignment = 1 byte (no alignment requirement) metadata length = 0 Without the fix the function returned 64k + 1, now it returns 64k which is correct behavior and allows to proceed with further command processing (if max buffer size limit is set to 64k only). Signed-off-by: Jacek Kalwas Change-Id: I09104ad21b3652ba1aa5c3805a04b1c6549d04ac Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17513 Community-CI: Mellanox Build Bot Reviewed-by: Jim Harris Tested-by: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto --- lib/bdev/bdev.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 61f813656..0bd63f061 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -1248,7 +1248,9 @@ bdev_io_get_max_buf_len(struct spdk_bdev_io *bdev_io, uint64_t len) uint64_t md_len, alignment; md_len = spdk_bdev_is_md_separate(bdev) ? bdev_io->u.bdev.num_blocks * bdev->md_len : 0; - alignment = spdk_bdev_get_buf_align(bdev); + + /* 1 byte alignment needs 0 byte of extra space, 64 bytes alignment needs 63 bytes of extra space, etc. */ + alignment = spdk_bdev_get_buf_align(bdev) - 1; return len + alignment + md_len; }