diff --git a/include/spdk/dif.h b/include/spdk/dif.h index 983e2cbda..aa0a6eefb 100644 --- a/include/spdk/dif.h +++ b/include/spdk/dif.h @@ -74,6 +74,9 @@ struct spdk_dif_ctx { /** Metadata size */ uint32_t md_size; + /** Metadata location */ + bool md_interleave; + /** Interval for guard computation for DIF */ uint32_t guard_interval; @@ -150,6 +153,14 @@ int spdk_dif_ctx_init(struct spdk_dif_ctx *ctx, uint32_t block_size, uint32_t md uint32_t init_ref_tag, uint16_t apptag_mask, uint16_t app_tag, uint32_t data_offset, uint16_t guard_seed); +/** + * Update date offset of DIF context. + * + * \param ctx DIF context. + * \param data_offset Byte offset from the start of the whole data buffer. + */ +void spdk_dif_ctx_set_data_offset(struct spdk_dif_ctx *ctx, uint32_t data_offset); + /** * Generate DIF for extended LBA payload. * diff --git a/lib/util/dif.c b/lib/util/dif.c index 87f1435da..da1481b32 100644 --- a/lib/util/dif.c +++ b/lib/util/dif.c @@ -250,6 +250,7 @@ spdk_dif_ctx_init(struct spdk_dif_ctx *ctx, uint32_t block_size, uint32_t md_siz ctx->block_size = block_size; ctx->md_size = md_size; + ctx->md_interleave = md_interleave; ctx->guard_interval = _get_guard_interval(block_size, md_size, dif_loc, md_interleave); ctx->dif_type = dif_type; ctx->dif_flags = dif_flags; @@ -264,6 +265,21 @@ spdk_dif_ctx_init(struct spdk_dif_ctx *ctx, uint32_t block_size, uint32_t md_siz return 0; } +void +spdk_dif_ctx_set_data_offset(struct spdk_dif_ctx *ctx, uint32_t data_offset) +{ + uint32_t data_block_size; + + if (ctx->md_interleave) { + data_block_size = ctx->block_size - ctx->md_size; + } else { + data_block_size = ctx->block_size; + } + + ctx->data_offset = data_offset; + ctx->ref_tag_offset = data_offset / data_block_size; +} + static void _dif_generate(void *_dif, uint16_t guard, uint32_t offset_blocks, const struct spdk_dif_ctx *ctx)