diff --git a/include/spdk/dif.h b/include/spdk/dif.h index 49ec4462c..34a192aad 100644 --- a/include/spdk/dif.h +++ b/include/spdk/dif.h @@ -47,9 +47,10 @@ #define SPDK_DIF_DATA_ERROR 0x8 enum spdk_dif_type { + SPDK_DIF_DISABLE = 0, SPDK_DIF_TYPE1 = 1, - SPDK_DIF_TYPE2, - SPDK_DIF_TYPE3, + SPDK_DIF_TYPE2 = 2, + SPDK_DIF_TYPE3 = 3, }; struct spdk_dif { diff --git a/lib/util/dif.c b/lib/util/dif.c index 36b0f334e..530a9b0d1 100644 --- a/lib/util/dif.c +++ b/lib/util/dif.c @@ -133,6 +133,7 @@ _dif_type_is_valid(enum spdk_dif_type dif_type, uint32_t dif_flags) switch (dif_type) { case SPDK_DIF_TYPE1: case SPDK_DIF_TYPE2: + case SPDK_DIF_DISABLE: break; case SPDK_DIF_TYPE3: if (dif_flags & SPDK_DIF_REFTAG_CHECK) { @@ -148,6 +149,16 @@ _dif_type_is_valid(enum spdk_dif_type dif_type, uint32_t dif_flags) return true; } +static bool +_dif_is_disabled(enum spdk_dif_type dif_type) +{ + if (dif_type == SPDK_DIF_DISABLE) { + return true; + } else { + return false; + } +} + static uint32_t _get_dif_guard_interval(uint32_t block_size, uint32_t md_size, bool dif_loc) { @@ -323,6 +334,10 @@ spdk_dif_generate(struct iovec *iovs, int iovcnt, return -EINVAL; } + if (_dif_is_disabled(dif_type)) { + return 0; + } + guard_interval = _get_dif_guard_interval(block_size, md_size, dif_loc); if (_are_iovs_bytes_multiple(iovs, iovcnt, block_size)) { @@ -362,6 +377,9 @@ _dif_verify(void *_dif, enum spdk_dif_type dif_type, uint32_t dif_flags, if (dif->app_tag == 0xFFFF && dif->ref_tag == 0xFFFFFFFF) { return 0; } + break; + default: + break; } if (dif_flags & SPDK_DIF_GUARD_CHECK) { @@ -412,6 +430,8 @@ _dif_verify(void *_dif, enum spdk_dif_type dif_type, uint32_t dif_flags, * Hence ignore the Reference Tag field. */ break; + default: + break; } } @@ -564,6 +584,10 @@ spdk_dif_verify(struct iovec *iovs, int iovcnt, return -EINVAL; } + if (_dif_is_disabled(dif_type)) { + return 0; + } + guard_interval = _get_dif_guard_interval(block_size, md_size, dif_loc); if (_are_iovs_bytes_multiple(iovs, iovcnt, block_size)) { diff --git a/test/unit/lib/util/dif.c/dif_ut.c b/test/unit/lib/util/dif.c/dif_ut.c index 5d8bea4c6..ae8b30df1 100644 --- a/test/unit/lib/util/dif.c/dif_ut.c +++ b/test/unit/lib/util/dif.c/dif_ut.c @@ -290,6 +290,18 @@ dif_generate_and_verify(struct iovec *iovs, int iovcnt, CU_ASSERT(rc == 0); } +static void +dif_disable_sec_512_md_8_single_iov_test(void) +{ + struct iovec iov; + + _iov_alloc_buf(&iov, (512 + 8) * 4); + + dif_generate_and_verify(&iov, 1, 512 + 8, 8, 1, false, SPDK_DIF_DISABLE, 0, 0, 0, 0); + + _iov_free_buf(&iov); +} + static void dif_sec_512_md_8_prchk_0_single_iov_test(void) { @@ -717,6 +729,8 @@ main(int argc, char **argv) CU_add_test(suite, "dif_generate_and_verify_test", dif_generate_and_verify_test) == NULL || CU_add_test(suite, "dif_disable_check_test", dif_disable_check_test) == NULL || CU_add_test(suite, "dif_sec_512_md_0_error_test", dif_sec_512_md_0_error_test) == NULL || + CU_add_test(suite, "dif_disable_sec_512_md_8_single_iov_test", + dif_disable_sec_512_md_8_single_iov_test) == NULL || CU_add_test(suite, "dif_sec_512_md_8_prchk_0_single_iov_test", dif_sec_512_md_8_prchk_0_single_iov_test) == NULL || CU_add_test(suite, "dif_sec_512_md_8_prchk_0_1_2_4_multi_iovs_test",