Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
fs
cramfs
uncompress.c
Go to the documentation of this file.
1
/*
2
* uncompress.c
3
*
4
* (C) Copyright 1999 Linus Torvalds
5
*
6
* cramfs interfaces to the uncompression library. There's really just
7
* three entrypoints:
8
*
9
* - cramfs_uncompress_init() - called to initialize the thing.
10
* - cramfs_uncompress_exit() - tell me when you're done
11
* - cramfs_uncompress_block() - uncompress a block.
12
*
13
* NOTE NOTE NOTE! The uncompression is entirely single-threaded. We
14
* only have one stream, and we'll initialize it only once even if it
15
* then is used by multiple filesystems.
16
*/
17
18
#include <linux/kernel.h>
19
#include <linux/errno.h>
20
#include <
linux/vmalloc.h
>
21
#include <
linux/zlib.h
>
22
#include <linux/cramfs_fs.h>
23
24
static
z_stream
stream
;
25
static
int
initialized
;
26
27
/* Returns length of decompressed data. */
28
int
cramfs_uncompress_block
(
void
*
dst
,
int
dstlen,
void
*
src
,
int
srclen)
29
{
30
int
err
;
31
32
stream.
next_in
=
src
;
33
stream.
avail_in
= srclen;
34
35
stream.
next_out
=
dst
;
36
stream.
avail_out
= dstlen;
37
38
err =
zlib_inflateReset
(&stream);
39
if
(err !=
Z_OK
) {
40
printk
(
"zlib_inflateReset error %d\n"
, err);
41
zlib_inflateEnd
(&stream);
42
zlib_inflateInit
(&stream);
43
}
44
45
err =
zlib_inflate
(&stream,
Z_FINISH
);
46
if
(err !=
Z_STREAM_END
)
47
goto
err
;
48
return
stream.
total_out
;
49
50
err:
51
printk
(
"Error %d while decompressing!\n"
, err);
52
printk
(
"%p(%d)->%p(%d)\n"
, src, srclen, dst, dstlen);
53
return
-
EIO
;
54
}
55
56
int
cramfs_uncompress_init
(
void
)
57
{
58
if
(!
initialized
++) {
59
stream.
workspace
=
vmalloc
(
zlib_inflate_workspacesize
());
60
if
( !stream.
workspace
) {
61
initialized
= 0;
62
return
-
ENOMEM
;
63
}
64
stream.
next_in
=
NULL
;
65
stream.
avail_in
= 0;
66
zlib_inflateInit
(&stream);
67
}
68
return
0;
69
}
70
71
void
cramfs_uncompress_exit
(
void
)
72
{
73
if
(!--
initialized
) {
74
zlib_inflateEnd
(&stream);
75
vfree
(stream.
workspace
);
76
}
77
}
Generated on Thu Jan 10 2013 14:46:21 for Linux Kernel by
1.8.2