This commit was manufactured by cvs2svn to create tag 'before-xenU'.
[linux-2.6.git] / drivers / dump / dump_gzip.c
1 /*
2  * GZIP Compression functions for kernel crash dumps.
3  *
4  * Created by: Matt Robinson (yakker@sourceforge.net)
5  * Copyright 2001 Matt D. Robinson.  All rights reserved.
6  *
7  * This code is released under version 2 of the GNU GPL.
8  */
9
10 /* header files */
11 #include <linux/config.h>
12 #include <linux/module.h>
13 #include <linux/sched.h>
14 #include <linux/fs.h>
15 #include <linux/file.h>
16 #include <linux/init.h>
17 #include <linux/slab.h>
18 #include <linux/dump.h>
19 #include <linux/zlib.h>
20 #include <linux/vmalloc.h>
21
22 static void *deflate_workspace;
23
24 /*
25  * Name: dump_compress_gzip()
26  * Func: Compress a DUMP_PAGE_SIZE page using gzip-style algorithms (the.
27  *       deflate functions similar to what's used in PPP).
28  */
29 static u16
30 dump_compress_gzip(const u8 *old, u16 oldsize, u8 *new, u16 newsize)
31 {
32         /* error code and dump stream */
33         int err;
34         z_stream dump_stream;
35         
36         dump_stream.workspace = deflate_workspace;
37         
38         if ((err = zlib_deflateInit(&dump_stream, Z_BEST_COMPRESSION)) != Z_OK) {
39                 /* fall back to RLE compression */
40                 printk("dump_compress_gzip(): zlib_deflateInit() "
41                         "failed (%d)!\n", err);
42                 return 0;
43         }
44
45         /* use old (page of memory) and size (DUMP_PAGE_SIZE) as in-streams */
46         dump_stream.next_in = (u8 *) old;
47         dump_stream.avail_in = oldsize;
48
49         /* out streams are new (dpcpage) and new size (DUMP_DPC_PAGE_SIZE) */
50         dump_stream.next_out = new;
51         dump_stream.avail_out = newsize;
52
53         /* deflate the page -- check for error */
54         err = zlib_deflate(&dump_stream, Z_FINISH);
55         if (err != Z_STREAM_END) {
56                 /* zero is return code here */
57                 (void)zlib_deflateEnd(&dump_stream);
58                 printk("dump_compress_gzip(): zlib_deflate() failed (%d)!\n",
59                         err);
60                 return 0;
61         }
62
63         /* let's end the deflated compression stream */
64         if ((err = zlib_deflateEnd(&dump_stream)) != Z_OK) {
65                 printk("dump_compress_gzip(): zlib_deflateEnd() "
66                         "failed (%d)!\n", err);
67         }
68
69         /* return the compressed byte total (if it's smaller) */
70         if (dump_stream.total_out >= oldsize) {
71                 return oldsize;
72         }
73         return dump_stream.total_out;
74 }
75
76 /* setup the gzip compression functionality */
77 static struct __dump_compress dump_gzip_compression = {
78         .compress_type = DUMP_COMPRESS_GZIP,
79         .compress_func = dump_compress_gzip,
80         .compress_name = "GZIP",
81 };
82
83 /*
84  * Name: dump_compress_gzip_init()
85  * Func: Initialize gzip as a compression mechanism.
86  */
87 static int __init
88 dump_compress_gzip_init(void)
89 {
90         deflate_workspace = vmalloc(zlib_deflate_workspacesize());
91         if (!deflate_workspace) {
92                 printk("dump_compress_gzip_init(): Failed to "
93                         "alloc %d bytes for deflate workspace\n",
94                         zlib_deflate_workspacesize());
95                 return -ENOMEM;
96         }
97         dump_register_compression(&dump_gzip_compression);
98         return 0;
99 }
100
101 /*
102  * Name: dump_compress_gzip_cleanup()
103  * Func: Remove gzip as a compression mechanism.
104  */
105 static void __exit
106 dump_compress_gzip_cleanup(void)
107 {
108         vfree(deflate_workspace);
109         dump_unregister_compression(DUMP_COMPRESS_GZIP);
110 }
111
112 /* module initialization */
113 module_init(dump_compress_gzip_init);
114 module_exit(dump_compress_gzip_cleanup);
115
116 MODULE_LICENSE("GPL");
117 MODULE_AUTHOR("LKCD Development Team <lkcd-devel@lists.sourceforge.net>");
118 MODULE_DESCRIPTION("Gzip compression module for crash dump driver");