108 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- 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();
 | |
|  }
 |