compress: change zio_compress API to use ABDs

This commit changes the frontend zio_compress_data and
zio_decompress_data APIs to take ABD points instead of buffer pointers.

All callers are updated to match. Any that already have an appropriate
ABD nearby now use it directly, while at the rest we create an one.

Internally, the ABDs are passed through to the provider directly.

Sponsored-by: Klara, Inc.
Sponsored-by: Wasabi Technology, Inc.
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
This commit is contained in:
Rob Norris
2024-07-04 14:48:38 +10:00
committed by Tony Hutter
parent d3c12383c9
commit f62e6e1f98
10 changed files with 116 additions and 112 deletions
+6 -14
View File
@@ -128,7 +128,7 @@ zio_compress_select(spa_t *spa, enum zio_compress child,
}
size_t
zio_compress_data(enum zio_compress c, abd_t *src, void **dst, size_t s_len,
zio_compress_data(enum zio_compress c, abd_t *src, abd_t **dst, size_t s_len,
uint8_t level)
{
size_t c_len, d_len;
@@ -158,12 +158,9 @@ zio_compress_data(enum zio_compress c, abd_t *src, void **dst, size_t s_len,
}
if (*dst == NULL)
*dst = zio_buf_alloc(s_len);
*dst = abd_alloc_sametype(src, s_len);
abd_t dabd;
abd_get_from_buf_struct(&dabd, dst, d_len);
c_len = ci->ci_compress(src, &dabd, s_len, d_len, complevel);
abd_free(&dabd);
c_len = ci->ci_compress(src, *dst, s_len, d_len, complevel);
if (c_len > d_len)
return (s_len);
@@ -173,23 +170,18 @@ zio_compress_data(enum zio_compress c, abd_t *src, void **dst, size_t s_len,
}
int
zio_decompress_data(enum zio_compress c, abd_t *src, void *dst,
zio_decompress_data(enum zio_compress c, abd_t *src, abd_t *dst,
size_t s_len, size_t d_len, uint8_t *level)
{
zio_compress_info_t *ci = &zio_compress_table[c];
if ((uint_t)c >= ZIO_COMPRESS_FUNCTIONS || ci->ci_decompress == NULL)
return (SET_ERROR(EINVAL));
abd_t dabd;
abd_get_from_buf_struct(&dabd, dst, d_len);
int err;
if (ci->ci_decompress_level != NULL && level != NULL)
err = ci->ci_decompress_level(src, &dabd, s_len, d_len, level);
err = ci->ci_decompress_level(src, dst, s_len, d_len, level);
else
err = ci->ci_decompress(src, &dabd, s_len, d_len, ci->ci_level);
abd_free(&dabd);
err = ci->ci_decompress(src, dst, s_len, d_len, ci->ci_level);
/*
* Decompression shouldn't fail, because we've already verified