1 // SPDX-License-Identifier: GPL-2.0+ OR Apache-2.0
2 /*
3 * Copyright (C) 2018-2019 HUAWEI, Inc.
4 * http://www.huawei.com/
5 * Created by Gao Xiang <gaoxiang25@huawei.com>
6 */
7 #define LZ4_HC_STATIC_LINKING_ONLY (1)
8 #include <lz4hc.h>
9 #include "erofs/internal.h"
10 #include "compressor.h"
11
12 #ifndef LZ4_DISTANCE_MAX /* history window size */
13 #define LZ4_DISTANCE_MAX 65535 /* set to maximum value by default */
14 #endif
15
lz4hc_compress_destsize(const struct erofs_compress * c,const void * src,unsigned int * srcsize,void * dst,unsigned int dstsize)16 static int lz4hc_compress_destsize(const struct erofs_compress *c,
17 const void *src, unsigned int *srcsize,
18 void *dst, unsigned int dstsize)
19 {
20 int srcSize = (int)*srcsize;
21 int rc = LZ4_compress_HC_destSize(c->private_data, src, dst,
22 &srcSize, (int)dstsize,
23 c->compression_level);
24 if (!rc)
25 return -EFAULT;
26 *srcsize = srcSize;
27 return rc;
28 }
29
compressor_lz4hc_exit(struct erofs_compress * c)30 static int compressor_lz4hc_exit(struct erofs_compress *c)
31 {
32 if (!c->private_data)
33 return -EINVAL;
34
35 LZ4_freeStreamHC(c->private_data);
36 return 0;
37 }
38
compressor_lz4hc_init(struct erofs_compress * c)39 static int compressor_lz4hc_init(struct erofs_compress *c)
40 {
41 c->private_data = LZ4_createStreamHC();
42 if (!c->private_data)
43 return -ENOMEM;
44
45 c->sbi->lz4_max_distance = LZ4_DISTANCE_MAX;
46 return 0;
47 }
48
compressor_lz4hc_setlevel(struct erofs_compress * c,int compression_level)49 static int compressor_lz4hc_setlevel(struct erofs_compress *c,
50 int compression_level)
51 {
52 if (compression_level > LZ4HC_CLEVEL_MAX)
53 return -EINVAL;
54
55 c->compression_level = compression_level < 0 ?
56 LZ4HC_CLEVEL_DEFAULT : compression_level;
57 return 0;
58 }
59
60 const struct erofs_compressor erofs_compressor_lz4hc = {
61 .default_level = LZ4HC_CLEVEL_DEFAULT,
62 .best_level = LZ4HC_CLEVEL_MAX,
63 .init = compressor_lz4hc_init,
64 .exit = compressor_lz4hc_exit,
65 .setlevel = compressor_lz4hc_setlevel,
66 .compress_destsize = lz4hc_compress_destsize,
67 };
68