• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0+ OR Apache-2.0
2 /*
3  * Copyright (C) 2023, Alibaba Cloud
4  * Copyright (C) 2023, Gao Xiang <xiang@kernel.org>
5  */
6 #include "erofs/internal.h"
7 #include "erofs/print.h"
8 #include "erofs/config.h"
9 #include "compressor.h"
10 
11 void *kite_deflate_init(int level, unsigned int dict_size);
12 void kite_deflate_end(void *s);
13 int kite_deflate_destsize(void *s, const u8 *in, u8 *out,
14 			  unsigned int *srcsize, unsigned int target_dstsize);
15 
deflate_compress_destsize(const struct erofs_compress * c,const void * src,unsigned int * srcsize,void * dst,unsigned int dstsize)16 static int deflate_compress_destsize(const struct erofs_compress *c,
17 				     const void *src, unsigned int *srcsize,
18 				     void *dst, unsigned int dstsize)
19 {
20 	int rc = kite_deflate_destsize(c->private_data, src, dst,
21 				       srcsize, dstsize);
22 
23 	if (rc <= 0)
24 		return -EFAULT;
25 	return rc;
26 }
27 
compressor_deflate_exit(struct erofs_compress * c)28 static int compressor_deflate_exit(struct erofs_compress *c)
29 {
30 	if (!c->private_data)
31 		return -EINVAL;
32 
33 	kite_deflate_end(c->private_data);
34 	return 0;
35 }
36 
compressor_deflate_init(struct erofs_compress * c)37 static int compressor_deflate_init(struct erofs_compress *c)
38 {
39 	c->private_data = NULL;
40 
41 	erofs_warn("EXPERIMENTAL DEFLATE algorithm in use. Use at your own risk!");
42 	erofs_warn("*Carefully* check filesystem data correctness to avoid corruption!");
43 	erofs_warn("Please send a report to <linux-erofs@lists.ozlabs.org> if something is wrong.");
44 	return 0;
45 }
46 
erofs_compressor_deflate_setlevel(struct erofs_compress * c,int compression_level)47 static int erofs_compressor_deflate_setlevel(struct erofs_compress *c,
48 					     int compression_level)
49 {
50 	void *s;
51 
52 	if (c->private_data) {
53 		kite_deflate_end(c->private_data);
54 		c->private_data = NULL;
55 	}
56 
57 	if (compression_level < 0)
58 		compression_level = erofs_compressor_deflate.default_level;
59 
60 	s = kite_deflate_init(compression_level, cfg.c_dict_size);
61 	if (IS_ERR(s))
62 		return PTR_ERR(s);
63 
64 	c->private_data = s;
65 	c->compression_level = compression_level;
66 	return 0;
67 }
68 
69 const struct erofs_compressor erofs_compressor_deflate = {
70 	.default_level = 1,
71 	.best_level = 9,
72 	.init = compressor_deflate_init,
73 	.exit = compressor_deflate_exit,
74 	.setlevel = erofs_compressor_deflate_setlevel,
75 	.compress_destsize = deflate_compress_destsize,
76 };
77