annotate packages/fs/jffs2/current/src/compr.c @ 1443:cd7d2afbc7dd

Import latest JFFS2 code from David Woodhouse
author gthomas
date Thu, 11 Dec 2003 23:33:54 +0000
parents 121121d3d18f
children 8bafb5f8a697
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
1 /*
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
2 * JFFS2 -- Journalling Flash File System, Version 2.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
3 *
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
4 * Copyright (C) 2001-2003 Red Hat, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
5 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
6 * Created by Arjan van de Ven <arjanv@redhat.com>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
7 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
8 * For licensing information, see the file 'LICENCE' in this directory.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
9 *
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1372
diff changeset
10 * $Id: compr.c,v 1.33 2003/11/28 17:22:54 dwmw2 Exp $
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
11 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
12 */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
13
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
14 #include <linux/kernel.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
15 #include <linux/string.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
16 #include <linux/errno.h>
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
17 #include <linux/types.h>
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
18 #include <linux/slab.h>
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
19 #include <linux/jffs2.h>
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1372
diff changeset
20 #include "nodelist.h"
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
21
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
22 int jffs2_zlib_compress(unsigned char *data_in, unsigned char *cpage_out, uint32_t *sourcelen, uint32_t *dstlen);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
23 void jffs2_zlib_decompress(unsigned char *data_in, unsigned char *cpage_out, uint32_t srclen, uint32_t destlen);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
24 int jffs2_rtime_compress(unsigned char *data_in, unsigned char *cpage_out, uint32_t *sourcelen, uint32_t *dstlen);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
25 void jffs2_rtime_decompress(unsigned char *data_in, unsigned char *cpage_out, uint32_t srclen, uint32_t destlen);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
26 int jffs2_rubinmips_compress(unsigned char *data_in, unsigned char *cpage_out, uint32_t *sourcelen, uint32_t *dstlen);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
27 void jffs2_rubinmips_decompress(unsigned char *data_in, unsigned char *cpage_out, uint32_t srclen, uint32_t destlen);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
28 int jffs2_dynrubin_compress(unsigned char *data_in, unsigned char *cpage_out, uint32_t *sourcelen, uint32_t *dstlen);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
29 void jffs2_dynrubin_decompress(unsigned char *data_in, unsigned char *cpage_out, uint32_t srclen, uint32_t destlen);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
30
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
31
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
32 /* jffs2_compress:
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
33 * @data: Pointer to uncompressed data
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
34 * @cdata: Pointer to returned pointer to buffer for compressed data
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
35 * @datalen: On entry, holds the amount of data available for compression.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
36 * On exit, expected to hold the amount of data actually compressed.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
37 * @cdatalen: On entry, holds the amount of space available for compressed
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
38 * data. On exit, expected to hold the actual size of the compressed
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
39 * data.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
40 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
41 * Returns: Byte to be stored with data indicating compression type used.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
42 * Zero is used to show that the data could not be compressed - the
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
43 * compressed version was actually larger than the original.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
44 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
45 * If the cdata buffer isn't large enough to hold all the uncompressed data,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
46 * jffs2_compress should compress as much as will fit, and should set
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
47 * *datalen accordingly to show the amount of data which were compressed.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
48 */
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
49 unsigned char jffs2_compress(unsigned char *data_in, unsigned char **cpage_out,
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
50 uint32_t *datalen, uint32_t *cdatalen)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
51 {
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
52 #ifdef JFFS2_COMPRESSION
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
53 int ret;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
54
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
55 *cpage_out = kmalloc(*cdatalen, GFP_KERNEL);
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
56 if (!*cpage_out) {
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
57 printk(KERN_WARNING "No memory for compressor allocation. Compression failed\n");
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1372
diff changeset
58 goto out;
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
59 }
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
60
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
61 #ifdef JFFS2_USE_ZLIB
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1372
diff changeset
62 ret = jffs2_zlib_compress(data_in, *cpage_out, datalen, cdatalen);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
63 if (!ret) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
64 return JFFS2_COMPR_ZLIB;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
65 }
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
66 #endif
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
67 #ifdef JFFS2_USE_DYNRUBIN
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1372
diff changeset
68 ret = jffs2_dynrubin_compress(data_in, *cpage_out, datalen, cdatalen);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
69 if (!ret) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
70 return JFFS2_COMPR_DYNRUBIN;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
71 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
72 #endif
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
73 #ifdef JFFS2_USE_RUBINMIPS
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1372
diff changeset
74 ret = jffs2_rubinmips_compress(data_in, *cpage_out, datalen, cdatalen);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
75 if (!ret) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
76 return JFFS2_COMPR_RUBINMIPS;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
77 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
78 #endif
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
79 #ifdef JFFS2_USE_RTIME
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
80 /* rtime does manage to recompress already-compressed data */
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1372
diff changeset
81 ret = jffs2_rtime_compress(data_in, *cpage_out, datalen, cdatalen);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
82 if (!ret) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
83 return JFFS2_COMPR_RTIME;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
84 }
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
85 #endif
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
86 kfree(*cpage_out);
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
87 #endif /* Compression */
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1372
diff changeset
88 out:
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
89 *cpage_out = data_in;
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
90 *datalen = *cdatalen;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
91 return JFFS2_COMPR_NONE; /* We failed to compress */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
92 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
93
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1372
diff changeset
94 void jffs2_free_comprbuf(unsigned char *comprbuf, unsigned char *orig)
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
95 {
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
96 if (orig != comprbuf)
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
97 kfree(comprbuf);
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
98 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
99
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
100 int jffs2_decompress(unsigned char comprtype, unsigned char *cdata_in,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
101 unsigned char *data_out, uint32_t cdatalen, uint32_t datalen)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
102 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
103 switch (comprtype) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
104 case JFFS2_COMPR_NONE:
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
105 /* This should be special-cased elsewhere, but we might as well deal with it */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
106 memcpy(data_out, cdata_in, datalen);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
107 break;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
108
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
109 case JFFS2_COMPR_ZERO:
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
110 memset(data_out, 0, datalen);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
111 break;
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
112 #ifdef JFFS2_USE_ZLIB
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
113 case JFFS2_COMPR_ZLIB:
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
114 jffs2_zlib_decompress(cdata_in, data_out, cdatalen, datalen);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
115 break;
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
116 #endif
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
117 #ifdef JFFS2_USE_RTIME
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
118 case JFFS2_COMPR_RTIME:
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
119 jffs2_rtime_decompress(cdata_in, data_out, cdatalen, datalen);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
120 break;
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
121 #endif
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
122 #ifdef JFFS2_USE_RUBINMIPS
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
123 case JFFS2_COMPR_RUBINMIPS:
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
124 jffs2_rubinmips_decompress(cdata_in, data_out, cdatalen, datalen);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
125 break;
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
126 #endif
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
127 #ifdef JFFS2_USE_DYNRUBIN
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
128 case JFFS2_COMPR_DYNRUBIN:
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
129
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
130 jffs2_dynrubin_decompress(cdata_in, data_out, cdatalen, datalen);
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 570
diff changeset
131 break;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
132 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
133 default:
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
134 printk(KERN_NOTICE "Unknown JFFS2 compression type 0x%02x\n", comprtype);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
135 return -EIO;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
136 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
137 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
138 }