1 | /* |
2 | * JFFS2 -- Journalling Flash File System, Version 2. |
3 | * |
4 | * Copyright © 2004 Ferenc Havasi <havasi@inf.u-szeged.hu>, |
5 | * University of Szeged, Hungary |
6 | * Copyright © 2004-2010 David Woodhouse <dwmw2@infradead.org> |
7 | * |
8 | * For licensing information, see the file 'LICENCE' in this directory. |
9 | * |
10 | */ |
11 | |
12 | #ifndef __JFFS2_COMPR_H__ |
13 | #define __JFFS2_COMPR_H__ |
14 | |
15 | #include <linux/kernel.h> |
16 | #include <linux/vmalloc.h> |
17 | #include <linux/list.h> |
18 | #include <linux/types.h> |
19 | #include <linux/string.h> |
20 | #include <linux/slab.h> |
21 | #include <linux/errno.h> |
22 | #include <linux/fs.h> |
23 | #include <linux/jffs2.h> |
24 | #include "jffs2_fs_i.h" |
25 | #include "jffs2_fs_sb.h" |
26 | #include "nodelist.h" |
27 | |
28 | #define JFFS2_RUBINMIPS_PRIORITY 10 |
29 | #define JFFS2_DYNRUBIN_PRIORITY 20 |
30 | #define JFFS2_LZARI_PRIORITY 30 |
31 | #define JFFS2_RTIME_PRIORITY 50 |
32 | #define JFFS2_ZLIB_PRIORITY 60 |
33 | #define JFFS2_LZO_PRIORITY 80 |
34 | |
35 | |
36 | #define JFFS2_RUBINMIPS_DISABLED /* RUBINs will be used only */ |
37 | #define JFFS2_DYNRUBIN_DISABLED /* for decompression */ |
38 | |
39 | #define JFFS2_COMPR_MODE_NONE 0 |
40 | #define JFFS2_COMPR_MODE_PRIORITY 1 |
41 | #define JFFS2_COMPR_MODE_SIZE 2 |
42 | #define JFFS2_COMPR_MODE_FAVOURLZO 3 |
43 | #define JFFS2_COMPR_MODE_FORCELZO 4 |
44 | #define JFFS2_COMPR_MODE_FORCEZLIB 5 |
45 | |
46 | #define FAVOUR_LZO_PERCENT 80 |
47 | |
48 | struct jffs2_compressor { |
49 | struct list_head list; |
50 | int priority; /* used by prirority comr. mode */ |
51 | char *name; |
52 | char compr; /* JFFS2_COMPR_XXX */ |
53 | int (*compress)(unsigned char *data_in, unsigned char *cpage_out, |
54 | uint32_t *srclen, uint32_t *destlen); |
55 | int (*decompress)(unsigned char *cdata_in, unsigned char *data_out, |
56 | uint32_t cdatalen, uint32_t datalen); |
57 | int usecount; |
58 | int disabled; /* if set the compressor won't compress */ |
59 | unsigned char *compr_buf; /* used by size compr. mode */ |
60 | uint32_t compr_buf_size; /* used by size compr. mode */ |
61 | uint32_t stat_compr_orig_size; |
62 | uint32_t stat_compr_new_size; |
63 | uint32_t stat_compr_blocks; |
64 | uint32_t stat_decompr_blocks; |
65 | }; |
66 | |
67 | int jffs2_register_compressor(struct jffs2_compressor *comp); |
68 | int jffs2_unregister_compressor(struct jffs2_compressor *comp); |
69 | |
70 | int jffs2_compressors_init(void); |
71 | int jffs2_compressors_exit(void); |
72 | |
73 | uint16_t jffs2_compress(struct jffs2_sb_info *c, struct jffs2_inode_info *f, |
74 | unsigned char *data_in, unsigned char **cpage_out, |
75 | uint32_t *datalen, uint32_t *cdatalen); |
76 | |
77 | int jffs2_decompress(struct jffs2_sb_info *c, struct jffs2_inode_info *f, |
78 | uint16_t comprtype, unsigned char *cdata_in, |
79 | unsigned char *data_out, uint32_t cdatalen, uint32_t datalen); |
80 | |
81 | void jffs2_free_comprbuf(unsigned char *comprbuf, unsigned char *orig); |
82 | |
83 | /* Compressor modules */ |
84 | /* These functions will be called by jffs2_compressors_init/exit */ |
85 | |
86 | #ifdef CONFIG_JFFS2_RUBIN |
87 | int jffs2_rubinmips_init(void); |
88 | void jffs2_rubinmips_exit(void); |
89 | int jffs2_dynrubin_init(void); |
90 | void jffs2_dynrubin_exit(void); |
91 | #else |
92 | static inline int jffs2_rubinmips_init(void) { return 0; } |
93 | static inline void jffs2_rubinmips_exit(void) {} |
94 | static inline int jffs2_dynrubin_init(void) { return 0; } |
95 | static inline void jffs2_dynrubin_exit(void) {} |
96 | #endif |
97 | #ifdef CONFIG_JFFS2_RTIME |
98 | extern int jffs2_rtime_init(void); |
99 | extern void jffs2_rtime_exit(void); |
100 | #else |
101 | static inline int jffs2_rtime_init(void) { return 0; } |
102 | static inline void jffs2_rtime_exit(void) {} |
103 | #endif |
104 | #ifdef CONFIG_JFFS2_ZLIB |
105 | extern int jffs2_zlib_init(void); |
106 | extern void jffs2_zlib_exit(void); |
107 | #else |
108 | static inline int jffs2_zlib_init(void) { return 0; } |
109 | static inline void jffs2_zlib_exit(void) {} |
110 | #endif |
111 | #ifdef CONFIG_JFFS2_LZO |
112 | extern int jffs2_lzo_init(void); |
113 | extern void jffs2_lzo_exit(void); |
114 | #else |
115 | static inline int jffs2_lzo_init(void) { return 0; } |
116 | static inline void jffs2_lzo_exit(void) {} |
117 | #endif |
118 | |
119 | #endif /* __JFFS2_COMPR_H__ */ |
120 | |