From 872d8d8ea78873eae9fb358ff904b8df7bc7212c Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Wed, 29 May 2019 16:24:02 +0900 Subject: [PATCH] iscsi: correct data digest computation for extended LBA payload This patch uses the newly added API spdk_dif_update_crc32c() when DIF insert/strip is enabled. Change-Id: Icf32a0ddef6cf92b0887b38495457e7fcac30987 Signed-off-by: Shuhei Matsumoto Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/456172 Tested-by: SPDK CI Jenkins Reviewed-by: Ziye Yang Reviewed-by: Changpeng Liu Reviewed-by: Jim Harris --- lib/iscsi/iscsi.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/iscsi/iscsi.c b/lib/iscsi/iscsi.c index 77abcf54d..bd3352335 100644 --- a/lib/iscsi/iscsi.c +++ b/lib/iscsi/iscsi.c @@ -302,9 +302,19 @@ spdk_iscsi_pdu_calc_data_digest(struct spdk_iscsi_pdu *pdu) uint32_t data_len = DGET24(pdu->bhs.data_segment_len); uint32_t crc32c; uint32_t mod; + struct iovec iov; + uint32_t num_blocks; crc32c = SPDK_CRC32C_INITIAL; - crc32c = spdk_crc32c_update(pdu->data, data_len, crc32c); + if (spdk_likely(!pdu->dif_insert_or_strip)) { + crc32c = spdk_crc32c_update(pdu->data, data_len, crc32c); + } else { + iov.iov_base = pdu->data_buf; + iov.iov_len = pdu->data_buf_len; + num_blocks = pdu->data_buf_len / pdu->dif_ctx.block_size; + + spdk_dif_update_crc32c(&iov, 1, num_blocks, &crc32c, &pdu->dif_ctx); + } mod = data_len % ISCSI_ALIGNMENT; if (mod != 0) {