| // SPDX-License-Identifier: GPL-2.0-or-later | |
| #define pr_fmt(fmt) "lzo: " fmt | |
| #include <linux/kernel.h> | |
| #include <linux/slab.h> | |
| #include <linux/lzo.h> | |
| #include "backend_lzo.h" | |
| static void lzo_release_params(struct zcomp_params *params) | |
| { | |
| } | |
| static int lzo_setup_params(struct zcomp_params *params) | |
| { | |
| if (params->dict_sz) { | |
| pr_err("dictionary is not supported\n"); | |
| return -EOPNOTSUPP; | |
| } | |
| if (params->level != ZCOMP_PARAM_NOT_SET) { | |
| pr_err("compression level is not supported\n"); | |
| return -EOPNOTSUPP; | |
| } | |
| return 0; | |
| } | |
| static int lzo_create(struct zcomp_params *params, struct zcomp_ctx *ctx) | |
| { | |
| ctx->context = kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL); | |
| if (!ctx->context) | |
| return -ENOMEM; | |
| return 0; | |
| } | |
| static void lzo_destroy(struct zcomp_ctx *ctx) | |
| { | |
| kfree(ctx->context); | |
| } | |
| static int lzo_compress(struct zcomp_params *params, struct zcomp_ctx *ctx, | |
| struct zcomp_req *req) | |
| { | |
| int ret; | |
| ret = lzo1x_1_compress(req->src, req->src_len, req->dst, | |
| &req->dst_len, ctx->context); | |
| return ret == LZO_E_OK ? 0 : ret; | |
| } | |
| static int lzo_decompress(struct zcomp_params *params, struct zcomp_ctx *ctx, | |
| struct zcomp_req *req) | |
| { | |
| int ret; | |
| ret = lzo1x_decompress_safe(req->src, req->src_len, | |
| req->dst, &req->dst_len); | |
| return ret == LZO_E_OK ? 0 : ret; | |
| } | |
| const struct zcomp_ops backend_lzo = { | |
| .compress = lzo_compress, | |
| .decompress = lzo_decompress, | |
| .create_ctx = lzo_create, | |
| .destroy_ctx = lzo_destroy, | |
| .setup_params = lzo_setup_params, | |
| .release_params = lzo_release_params, | |
| .name = "lzo", | |
| }; |