From cdffe8daa1c4fba5da05da69f916c2fb06292081 Mon Sep 17 00:00:00 2001 From: xxmustafacooTR Date: Wed, 8 Feb 2023 20:34:21 +0300 Subject: [PATCH] crypto: acomp - add support for zstd via scomp Add scomp backend for zstd compression algorithm. --- crypto/zstd.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/crypto/zstd.c b/crypto/zstd.c index 974b6e8fac65..1bd421533142 100644 --- a/crypto/zstd.c +++ b/crypto/zstd.c @@ -20,7 +20,7 @@ #include #include #include - +#include #define ZSTD_DEF_LEVEL 3 @@ -110,6 +110,24 @@ static int __zstd_init(void *ctx) return ret; } +static void *zstd_alloc_ctx(struct crypto_scomp *tfm) +{ + int ret; + struct zstd_ctx *ctx; + + ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return ERR_PTR(-ENOMEM); + + ret = __zstd_init(ctx); + if (ret) { + kfree(ctx); + return ERR_PTR(ret); + } + + return ctx; +} + static int zstd_init(struct crypto_tfm *tfm) { struct zstd_ctx *ctx = crypto_tfm_ctx(tfm); @@ -123,6 +141,12 @@ static void __zstd_exit(void *ctx) zstd_decomp_exit(ctx); } +static void zstd_free_ctx(struct crypto_scomp *tfm, void *ctx) +{ + __zstd_exit(ctx); + kfree(ctx); +} + static void zstd_exit(struct crypto_tfm *tfm) { struct zstd_ctx *ctx = crypto_tfm_ctx(tfm); @@ -152,6 +176,13 @@ static int zstd_compress(struct crypto_tfm *tfm, const u8 *src, return __zstd_compress(src, slen, dst, dlen, ctx); } +static int zstd_scompress(struct crypto_scomp *tfm, const u8 *src, + unsigned int slen, u8 *dst, unsigned int *dlen, + void *ctx) +{ + return __zstd_compress(src, slen, dst, dlen, ctx); +} + static int __zstd_decompress(const u8 *src, unsigned int slen, u8 *dst, unsigned int *dlen, void *ctx) { @@ -173,6 +204,13 @@ static int zstd_decompress(struct crypto_tfm *tfm, const u8 *src, return __zstd_decompress(src, slen, dst, dlen, ctx); } +static int zstd_sdecompress(struct crypto_scomp *tfm, const u8 *src, + unsigned int slen, u8 *dst, unsigned int *dlen, + void *ctx) +{ + return __zstd_decompress(src, slen, dst, dlen, ctx); +} + static struct crypto_alg alg = { .cra_name = "zstd", .cra_flags = CRYPTO_ALG_TYPE_COMPRESS, @@ -185,6 +223,18 @@ static struct crypto_alg alg = { .coa_decompress = zstd_decompress } } }; +static struct scomp_alg scomp = { + .alloc_ctx = zstd_alloc_ctx, + .free_ctx = zstd_free_ctx, + .compress = zstd_scompress, + .decompress = zstd_sdecompress, + .base = { + .cra_name = "zstd", + .cra_driver_name = "zstd-scomp", + .cra_module = THIS_MODULE, + } +}; + static int __init zstd_mod_init(void) { int ret; @@ -192,6 +242,10 @@ static int __init zstd_mod_init(void) ret = crypto_register_alg(&alg); if (ret) return ret; + + ret = crypto_register_scomp(&scomp); + if (ret) + crypto_unregister_alg(&alg); return ret; } @@ -199,6 +253,7 @@ static int __init zstd_mod_init(void) static void __exit zstd_mod_fini(void) { crypto_unregister_alg(&alg); + crypto_unregister_scomp(&scomp); } module_init(zstd_mod_init);