2 * GZIP Compression functions for kernel crash dumps.
4 * Created by: Matt Robinson (yakker@sourceforge.net)
5 * Copyright 2001 Matt D. Robinson. All rights reserved.
7 * This code is released under version 2 of the GNU GPL.
11 #include <linux/config.h>
12 #include <linux/module.h>
13 #include <linux/sched.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>
22 static void *deflate_workspace;
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).
30 dump_compress_gzip(const u8 *old, u16 oldsize, u8 *new, u16 newsize)
32 /* error code and dump stream */
36 dump_stream.workspace = deflate_workspace;
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);
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;
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;
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",
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);
69 /* return the compressed byte total (if it's smaller) */
70 if (dump_stream.total_out >= oldsize) {
73 return dump_stream.total_out;
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",
84 * Name: dump_compress_gzip_init()
85 * Func: Initialize gzip as a compression mechanism.
88 dump_compress_gzip_init(void)
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());
97 dump_register_compression(&dump_gzip_compression);
102 * Name: dump_compress_gzip_cleanup()
103 * Func: Remove gzip as a compression mechanism.
106 dump_compress_gzip_cleanup(void)
108 vfree(deflate_workspace);
109 dump_unregister_compression(DUMP_COMPRESS_GZIP);
112 /* module initialization */
113 module_init(dump_compress_gzip_init);
114 module_exit(dump_compress_gzip_cleanup);
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");