109 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
diff -urN linux-2.6.21.1.old/fs/squashfs/inode.c linux-2.6.21.1.dev/fs/squashfs/inode.c
 | 
						|
--- linux-2.6.21.1.old/fs/squashfs/inode.c	2007-05-26 19:03:45.499713896 +0200
 | 
						|
+++ linux-2.6.21.1.dev/fs/squashfs/inode.c	2007-05-26 19:07:27.951896024 +0200
 | 
						|
@@ -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 @@
 | 
						|
 			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 @@
 | 
						|
 	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 @@
 | 
						|
 			bytes = 0;
 | 
						|
 		} else
 | 
						|
 			bytes = stream.total_out;
 | 
						|
-
 | 
						|
+#endif
 | 
						|
 		up(&msblk->read_data_mutex);
 | 
						|
 	}
 | 
						|
 
 | 
						|
@@ -2045,15 +2075,19 @@
 | 
						|
 	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 @@
 | 
						|
 
 | 
						|
 static void __exit exit_squashfs_fs(void)
 | 
						|
 {
 | 
						|
+#ifndef SQUASHFS_LZMA
 | 
						|
 	vfree(stream.workspace);
 | 
						|
+#endif
 | 
						|
 	unregister_filesystem(&squashfs_fs_type);
 | 
						|
 	destroy_inodecache();
 | 
						|
 }
 |