summaryrefslogtreecommitdiff
path: root/target/linux/generic-2.6/patches-2.6.28/003-squashfs_lzma.patch
blob: 9050e370ca5c0f905a1688b2e4253235713c79a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
--- a/fs/squashfs/inode.c
+++ b/fs/squashfs/inode.c
@@ -4,6 +4,9 @@
  * Copyright (c) 2002, 2003, 2004, 2005, 2006
  * Phillip Lougher <phillip@lougher.org.uk>
  *
+ * LZMA decompressor support added by Oleg I. Vdovikin
+ * Copyright (c) 2005 Oleg I.Vdovikin <oleg@cs.msu.su>
+ *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2,
@@ -21,6 +24,7 @@
  * inode.c
  */
 
+#define SQUASHFS_LZMA
 #include <linux/types.h>
 #include <linux/squashfs_fs.h>
 #include <linux/module.h>
@@ -44,6 +48,19 @@
 
 #include "squashfs.h"
 
+#ifdef SQUASHFS_LZMA
+#include <linux/LzmaDecode.h>
+
+/* default LZMA settings, should be in sync with mksquashfs */
+#define LZMA_LC 3
+#define LZMA_LP 0
+#define LZMA_PB 2
+
+#define LZMA_WORKSPACE_SIZE ((LZMA_BASE_SIZE + \
+      (LZMA_LIT_SIZE << (LZMA_LC + LZMA_LP))) * sizeof(CProb))
+
+#endif
+
 static void squashfs_put_super(struct super_block *);
 static int squashfs_statfs(struct dentry *, struct kstatfs *);
 static int squashfs_symlink_readpage(struct file *file, struct page *page);
@@ -64,7 +81,11 @@ static int squashfs_get_sb(struct file_s
 			const char *, void *, struct vfsmount *);
 
 
+#ifdef SQUASHFS_LZMA
+static unsigned char lzma_workspace[LZMA_WORKSPACE_SIZE];
+#else
 static z_stream stream;
+#endif
 
 static struct file_system_type squashfs_fs_type = {
 	.owner = THIS_MODULE,
@@ -249,6 +270,15 @@ SQSH_EXTERN unsigned int squashfs_read_d
 	if (compressed) {
 		int zlib_err;
 
+#ifdef SQUASHFS_LZMA
+		if ((zlib_err = LzmaDecode(lzma_workspace,
+			LZMA_WORKSPACE_SIZE, LZMA_LC, LZMA_LP, LZMA_PB,
+			c_buffer, c_byte, buffer, msblk->read_size, &bytes)) != LZMA_RESULT_OK)
+		{
+			ERROR("lzma returned unexpected result 0x%x\n", zlib_err);
+			bytes = 0;
+		}
+#else
 		stream.next_in = c_buffer;
 		stream.avail_in = c_byte;
 		stream.next_out = buffer;
@@ -263,7 +293,7 @@ SQSH_EXTERN unsigned int squashfs_read_d
 			bytes = 0;
 		} else
 			bytes = stream.total_out;
-
+#endif
 		up(&msblk->read_data_mutex);
 	}
 
@@ -2045,15 +2075,19 @@ static int __init init_squashfs_fs(void)
 	printk(KERN_INFO "squashfs: version 3.0 (2006/03/15) "
 		"Phillip Lougher\n");
 
+#ifndef SQUASHFS_LZMA
 	if (!(stream.workspace = vmalloc(zlib_inflate_workspacesize()))) {
 		ERROR("Failed to allocate zlib workspace\n");
 		destroy_inodecache();
 		err = -ENOMEM;
 		goto out;
 	}
+#endif
 
 	if ((err = register_filesystem(&squashfs_fs_type))) {
+#ifndef SQUASHFS_LZMA
 		vfree(stream.workspace);
+#endif
 		destroy_inodecache();
 	}
 
@@ -2064,7 +2098,9 @@ out:
 
 static void __exit exit_squashfs_fs(void)
 {
+#ifndef SQUASHFS_LZMA
 	vfree(stream.workspace);
+#endif
 	unregister_filesystem(&squashfs_fs_type);
 	destroy_inodecache();
 }