dif: Factor out setup operation of spdk_dif_generate/verify_stream
spdk_dif_generate_stream() and spdk_dif_verify_stream() are very similar. Factoring out the common part into a function will improve the maintainability and do in this patch. Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Change-Id: I16ecd0860c75037d9182298d7513749dfe8e9b56 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/458376 Reviewed-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
parent
6db126c24c
commit
a019feec62
@ -1514,38 +1514,25 @@ spdk_dif_set_md_interleave_iovs(struct iovec *iovs, int iovcnt,
|
||||
return iovcnt - dif_sgl.iovcnt;
|
||||
}
|
||||
|
||||
int
|
||||
spdk_dif_generate_stream(struct iovec *iovs, int iovcnt,
|
||||
uint32_t data_offset, uint32_t data_len,
|
||||
struct spdk_dif_ctx *ctx)
|
||||
static int
|
||||
_dif_sgl_setup_stream(struct _dif_sgl *sgl, uint32_t *_buf_offset, uint32_t *_buf_len,
|
||||
uint32_t data_offset, uint32_t data_len,
|
||||
const struct spdk_dif_ctx *ctx)
|
||||
{
|
||||
uint32_t data_block_size, data_unalign, buf_len, buf_offset;
|
||||
uint32_t len, offset_in_block, offset_blocks;
|
||||
uint16_t guard = 0;
|
||||
struct _dif_sgl sgl;
|
||||
|
||||
if (iovs == NULL || iovcnt == 0) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
data_block_size = ctx->block_size - ctx->md_size;
|
||||
|
||||
if (ctx->dif_flags & SPDK_DIF_FLAGS_GUARD_CHECK) {
|
||||
guard = ctx->last_guard;
|
||||
}
|
||||
|
||||
data_unalign = ctx->data_offset % data_block_size;
|
||||
|
||||
/* If the last data block is complete, DIF of the data block is
|
||||
* inserted in this function.
|
||||
* inserted or verified in this turn.
|
||||
*/
|
||||
buf_len = ((data_unalign + data_offset + data_len) / data_block_size) * ctx->block_size +
|
||||
((data_unalign + data_offset + data_len) % data_block_size);
|
||||
buf_len -= data_unalign;
|
||||
|
||||
_dif_sgl_init(&sgl, iovs, iovcnt);
|
||||
|
||||
if (!_dif_sgl_is_valid(&sgl, buf_len)) {
|
||||
if (!_dif_sgl_is_valid(sgl, buf_len)) {
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
@ -1553,11 +1540,43 @@ spdk_dif_generate_stream(struct iovec *iovs, int iovcnt,
|
||||
((data_unalign + data_offset) % data_block_size);
|
||||
buf_offset -= data_unalign;
|
||||
|
||||
_dif_sgl_advance(&sgl, buf_offset);
|
||||
_dif_sgl_advance(sgl, buf_offset);
|
||||
buf_len -= buf_offset;
|
||||
|
||||
buf_offset += data_unalign;
|
||||
|
||||
*_buf_offset = buf_offset;
|
||||
*_buf_len = buf_len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
spdk_dif_generate_stream(struct iovec *iovs, int iovcnt,
|
||||
uint32_t data_offset, uint32_t data_len,
|
||||
struct spdk_dif_ctx *ctx)
|
||||
{
|
||||
uint32_t buf_len = 0, buf_offset = 0;
|
||||
uint32_t len, offset_in_block, offset_blocks;
|
||||
uint16_t guard = 0;
|
||||
struct _dif_sgl sgl;
|
||||
int rc;
|
||||
|
||||
if (iovs == NULL || iovcnt == 0) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (ctx->dif_flags & SPDK_DIF_FLAGS_GUARD_CHECK) {
|
||||
guard = ctx->last_guard;
|
||||
}
|
||||
|
||||
_dif_sgl_init(&sgl, iovs, iovcnt);
|
||||
|
||||
rc = _dif_sgl_setup_stream(&sgl, &buf_offset, &buf_len, data_offset, data_len, ctx);
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
while (buf_len != 0) {
|
||||
len = spdk_min(buf_len, _to_next_boundary(buf_offset, ctx->block_size));
|
||||
offset_in_block = buf_offset % ctx->block_size;
|
||||
@ -1582,7 +1601,7 @@ spdk_dif_verify_stream(struct iovec *iovs, int iovcnt,
|
||||
struct spdk_dif_ctx *ctx,
|
||||
struct spdk_dif_error *err_blk)
|
||||
{
|
||||
uint32_t data_block_size, data_unalign, buf_len, buf_offset;
|
||||
uint32_t buf_len = 0, buf_offset = 0;
|
||||
uint32_t len, offset_in_block, offset_blocks;
|
||||
uint16_t guard = 0;
|
||||
struct _dif_sgl sgl;
|
||||
@ -1592,36 +1611,17 @@ spdk_dif_verify_stream(struct iovec *iovs, int iovcnt,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
data_block_size = ctx->block_size - ctx->md_size;
|
||||
|
||||
if (ctx->dif_flags & SPDK_DIF_FLAGS_GUARD_CHECK) {
|
||||
guard = ctx->last_guard;
|
||||
}
|
||||
|
||||
data_unalign = ctx->data_offset % data_block_size;
|
||||
|
||||
/* If the last data block is complete, DIF of the data block is
|
||||
* verified in this function.;
|
||||
*/
|
||||
buf_len = ((data_unalign + data_offset + data_len) / data_block_size) * ctx->block_size +
|
||||
((data_unalign + data_offset + data_len) % data_block_size);
|
||||
buf_len -= data_unalign;
|
||||
|
||||
_dif_sgl_init(&sgl, iovs, iovcnt);
|
||||
|
||||
if (!_dif_sgl_is_valid(&sgl, buf_len)) {
|
||||
return -ERANGE;
|
||||
rc = _dif_sgl_setup_stream(&sgl, &buf_offset, &buf_len, data_offset, data_len, ctx);
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
buf_offset = ((data_unalign + data_offset) / data_block_size) * ctx->block_size +
|
||||
((data_unalign + data_offset) % data_block_size);
|
||||
buf_offset -= data_unalign;
|
||||
|
||||
_dif_sgl_advance(&sgl, buf_offset);
|
||||
buf_len -= buf_offset;
|
||||
|
||||
buf_offset += data_unalign;
|
||||
|
||||
while (buf_len != 0) {
|
||||
len = spdk_min(buf_len, _to_next_boundary(buf_offset, ctx->block_size));
|
||||
offset_in_block = buf_offset % ctx->block_size;
|
||||
|
Loading…
Reference in New Issue
Block a user