• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-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(struct erofs_compress * c,void * src,unsigned int * srcsize,void * dst,unsigned int dstsize)16 static int lz4hc_compress_destsize(struct erofs_compress *c,
17 				   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->alg = &erofs_compressor_lz4hc;
42 
43 	c->private_data = LZ4_createStreamHC();
44 	if (!c->private_data)
45 		return -ENOMEM;
46 
47 	sbi.lz4_max_distance = LZ4_DISTANCE_MAX;
48 	return 0;
49 }
50 
compressor_lz4hc_setlevel(struct erofs_compress * c,int compression_level)51 static int compressor_lz4hc_setlevel(struct erofs_compress *c,
52 				     int compression_level)
53 {
54 	if (compression_level > LZ4HC_CLEVEL_MAX)
55 		return -EINVAL;
56 
57 	c->compression_level = compression_level < 0 ?
58 		LZ4HC_CLEVEL_DEFAULT : compression_level;
59 	return 0;
60 }
61 
62 struct erofs_compressor erofs_compressor_lz4hc = {
63 	.name = "lz4hc",
64 	.default_level = LZ4HC_CLEVEL_DEFAULT,
65 	.best_level = LZ4HC_CLEVEL_MAX,
66 	.init = compressor_lz4hc_init,
67 	.exit = compressor_lz4hc_exit,
68 	.setlevel = compressor_lz4hc_setlevel,
69 	.compress_destsize = lz4hc_compress_destsize,
70 };
71