2008-06-16 12:40:48 +00:00
|
|
|
--- a/fs/squashfs/inode.c
|
|
|
|
+++ b/fs/squashfs/inode.c
|
2007-06-16 01:56:04 +00:00
|
|
|
@@ -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);
|
2008-06-16 12:40:48 +00:00
|
|
|
@@ -64,7 +81,11 @@
|
2007-06-16 01:56:04 +00:00
|
|
|
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,
|
2008-06-16 12:40:48 +00:00
|
|
|
@@ -249,6 +270,15 @@
|
2007-06-16 01:56:04 +00:00
|
|
|
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;
|
2008-06-16 12:40:48 +00:00
|
|
|
@@ -263,7 +293,7 @@
|
2007-06-16 01:56:04 +00:00
|
|
|
bytes = 0;
|
|
|
|
} else
|
|
|
|
bytes = stream.total_out;
|
|
|
|
-
|
|
|
|
+#endif
|
|
|
|
up(&msblk->read_data_mutex);
|
|
|
|
}
|
|
|
|
|
2008-06-16 12:40:48 +00:00
|
|
|
@@ -2045,15 +2075,19 @@
|
2007-06-16 01:56:04 +00:00
|
|
|
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();
|
|
|
|
}
|
|
|
|
|
2008-06-16 12:40:48 +00:00
|
|
|
@@ -2064,7 +2098,9 @@
|
2007-06-16 01:56:04 +00:00
|
|
|
|
|
|
|
static void __exit exit_squashfs_fs(void)
|
|
|
|
{
|
|
|
|
+#ifndef SQUASHFS_LZMA
|
|
|
|
vfree(stream.workspace);
|
|
|
|
+#endif
|
|
|
|
unregister_filesystem(&squashfs_fs_type);
|
|
|
|
destroy_inodecache();
|
|
|
|
}
|