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;
|
return iovcnt - dif_sgl.iovcnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
static int
|
||||||
spdk_dif_generate_stream(struct iovec *iovs, int iovcnt,
|
_dif_sgl_setup_stream(struct _dif_sgl *sgl, uint32_t *_buf_offset, uint32_t *_buf_len,
|
||||||
uint32_t data_offset, uint32_t data_len,
|
uint32_t data_offset, uint32_t data_len,
|
||||||
struct spdk_dif_ctx *ctx)
|
const struct spdk_dif_ctx *ctx)
|
||||||
{
|
{
|
||||||
uint32_t data_block_size, data_unalign, buf_len, buf_offset;
|
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;
|
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;
|
data_unalign = ctx->data_offset % data_block_size;
|
||||||
|
|
||||||
/* If the last data block is complete, DIF of the data block is
|
/* 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 +
|
buf_len = ((data_unalign + data_offset + data_len) / data_block_size) * ctx->block_size +
|
||||||
((data_unalign + data_offset + data_len) % data_block_size);
|
((data_unalign + data_offset + data_len) % data_block_size);
|
||||||
buf_len -= data_unalign;
|
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;
|
return -ERANGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1553,11 +1540,43 @@ spdk_dif_generate_stream(struct iovec *iovs, int iovcnt,
|
|||||||
((data_unalign + data_offset) % data_block_size);
|
((data_unalign + data_offset) % data_block_size);
|
||||||
buf_offset -= data_unalign;
|
buf_offset -= data_unalign;
|
||||||
|
|
||||||
_dif_sgl_advance(&sgl, buf_offset);
|
_dif_sgl_advance(sgl, buf_offset);
|
||||||
buf_len -= buf_offset;
|
buf_len -= buf_offset;
|
||||||
|
|
||||||
buf_offset += data_unalign;
|
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) {
|
while (buf_len != 0) {
|
||||||
len = spdk_min(buf_len, _to_next_boundary(buf_offset, ctx->block_size));
|
len = spdk_min(buf_len, _to_next_boundary(buf_offset, ctx->block_size));
|
||||||
offset_in_block = 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_ctx *ctx,
|
||||||
struct spdk_dif_error *err_blk)
|
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;
|
uint32_t len, offset_in_block, offset_blocks;
|
||||||
uint16_t guard = 0;
|
uint16_t guard = 0;
|
||||||
struct _dif_sgl sgl;
|
struct _dif_sgl sgl;
|
||||||
@ -1592,36 +1611,17 @@ spdk_dif_verify_stream(struct iovec *iovs, int iovcnt,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
data_block_size = ctx->block_size - ctx->md_size;
|
|
||||||
|
|
||||||
if (ctx->dif_flags & SPDK_DIF_FLAGS_GUARD_CHECK) {
|
if (ctx->dif_flags & SPDK_DIF_FLAGS_GUARD_CHECK) {
|
||||||
guard = ctx->last_guard;
|
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);
|
_dif_sgl_init(&sgl, iovs, iovcnt);
|
||||||
|
|
||||||
if (!_dif_sgl_is_valid(&sgl, buf_len)) {
|
rc = _dif_sgl_setup_stream(&sgl, &buf_offset, &buf_len, data_offset, data_len, ctx);
|
||||||
return -ERANGE;
|
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) {
|
while (buf_len != 0) {
|
||||||
len = spdk_min(buf_len, _to_next_boundary(buf_offset, ctx->block_size));
|
len = spdk_min(buf_len, _to_next_boundary(buf_offset, ctx->block_size));
|
||||||
offset_in_block = buf_offset % ctx->block_size;
|
offset_in_block = buf_offset % ctx->block_size;
|
||||||
|
Loading…
Reference in New Issue
Block a user