mirror of
https://gitdl.cn/https://github.com/chakralinux/core.git
synced 2025-02-03 22:57:56 +08:00
update kernel patches
This commit is contained in:
parent
3ddce38e36
commit
05d029cd9e
@ -14,8 +14,8 @@ pkgname=('kernel26' 'kernel26-firmware' 'kernel26-headers') # Build stock -CHAKR
|
||||
_kernelname=""
|
||||
_basekernel=2.6.36
|
||||
pkgver=${_basekernel}
|
||||
pkgrel=2
|
||||
_patchname="patch-${pkgver}-2-CHAKRA"
|
||||
pkgrel=3
|
||||
_patchname="patch-${pkgver}-${pkgrel}-CHAKRA"
|
||||
arch=(i686 x86_64)
|
||||
license=('GPL2')
|
||||
url="http://www.kernel.org"
|
||||
@ -26,7 +26,7 @@ source=(ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-$_basekernel.tar.bz2
|
||||
# standard config files for mkinitcpio ramdisk
|
||||
kernel26.preset)
|
||||
md5sums=('61f3739a73afb6914cb007f37fb09b62'
|
||||
'930d7f134f4c53167668b42e9a2c47b9'
|
||||
'cdf165de87c087093f21cea0b0751df0'
|
||||
'3a263275881b62bd4368852bde286d09'
|
||||
'c5502e97bf409a4f5755de1534f5e836'
|
||||
'25584700a0a679542929c4bed31433b6')
|
||||
|
@ -17,22 +17,16 @@ PATCHES=(
|
||||
|
||||
# add aufs2 support, in reference to:
|
||||
# http://aufs.sourceforge.net
|
||||
aufs2-base.patch%1
|
||||
#aufs2-standalone.patch2%1
|
||||
aufs2-kbuild.patch%1
|
||||
aufs2.1-standalone.tree-36-UNRELEASED-20101024.patch%1
|
||||
aufs2.1-standalone.tree-36-UNRELEASED-20101024-EXPORT_SYMBOL.patch%1
|
||||
aufs2-base.patch%1
|
||||
aufs2-standalone.patch%1
|
||||
aufs2.1-standalone.tree-36-UNRELEASED-20101025.patch.bz2%1
|
||||
# squashfs with lzma
|
||||
001-add_support_for_LZMA_compressed_filesystems.patch%1
|
||||
002-make_lzma_available_to_non_initramfs_initrd_code.patch%1
|
||||
003-select_DECOMPRESS_LZMA_NEEDED_when_including_support_for_lzma.patch%1
|
||||
004-make_lzma_reentrant.patch%1
|
||||
005-force_lzma_wrapper_to_be_retained.patch%1
|
||||
006-add_missing_slab.h_include_in_lzma_wrapper.patch%1
|
||||
kernel-squashfs-lzma-v1.7-2.6.36.patch%1
|
||||
|
||||
)
|
||||
# Name of the resulting patch (will be bzipped afterwards)
|
||||
PATCHNAME="patch-2.6.36-2-CHAKRA"
|
||||
PATCHNAME="patch-2.6.36-3-CHAKRA"
|
||||
|
||||
# Run this before applying patches
|
||||
pre_apply() {
|
||||
|
@ -1,222 +0,0 @@
|
||||
From a19b1a6807bc71eb0638f5e7f57d71396cd34863 Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Lougher <phillip@lougher.demon.co.uk>
|
||||
Date: Tue, 20 Oct 2009 09:54:36 +0000
|
||||
Subject: Squashfs: add support for LZMA compressed filesystems
|
||||
|
||||
Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
|
||||
---
|
||||
diff --git a/fs/squashfs/Kconfig b/fs/squashfs/Kconfig
|
||||
index e5f63da..5632f2a 100644
|
||||
--- a/fs/squashfs/Kconfig
|
||||
+++ b/fs/squashfs/Kconfig
|
||||
@@ -37,6 +37,12 @@ config SQUASHFS_XATTR
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
+config SQUASHFS_LZMA
|
||||
+ bool "Include support for LZMA compressed file systems"
|
||||
+ depends on SQUASHFS
|
||||
+ select DECOMPRESS_LZMA
|
||||
+
|
||||
+
|
||||
config SQUASHFS_LZO
|
||||
bool "Include support for LZO compressed file systems"
|
||||
depends on SQUASHFS
|
||||
diff --git a/fs/squashfs/Makefile b/fs/squashfs/Makefile
|
||||
index 7672bac..30fb0fa 100644
|
||||
--- a/fs/squashfs/Makefile
|
||||
+++ b/fs/squashfs/Makefile
|
||||
@@ -6,4 +6,5 @@ obj-$(CONFIG_SQUASHFS) += squashfs.o
|
||||
squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o
|
||||
squashfs-y += namei.o super.o symlink.o zlib_wrapper.o decompressor.o
|
||||
squashfs-$(CONFIG_SQUASHFS_XATTR) += xattr.o xattr_id.o
|
||||
+squashfs-$(CONFIG_SQUASHFS_LZMA) += lzma_wrapper.o
|
||||
squashfs-$(CONFIG_SQUASHFS_LZO) += lzo_wrapper.o
|
||||
diff --git a/fs/squashfs/decompressor.c b/fs/squashfs/decompressor.c
|
||||
index 24af9ce..2f25b2e 100644
|
||||
--- a/fs/squashfs/decompressor.c
|
||||
+++ b/fs/squashfs/decompressor.c
|
||||
@@ -52,7 +52,11 @@ static const struct squashfs_decompressor squashfs_unknown_comp_ops = {
|
||||
|
||||
static const struct squashfs_decompressor *decompressor[] = {
|
||||
&squashfs_zlib_comp_ops,
|
||||
+#ifdef CONFIG_SQUASHFS_LZMA
|
||||
+ &squashfs_lzma_comp_ops,
|
||||
+#else
|
||||
&squashfs_lzma_unsupported_comp_ops,
|
||||
+#endif
|
||||
#ifdef CONFIG_SQUASHFS_LZO
|
||||
&squashfs_lzo_comp_ops,
|
||||
#else
|
||||
diff --git a/fs/squashfs/lzma_wrapper.c b/fs/squashfs/lzma_wrapper.c
|
||||
new file mode 100644
|
||||
index 0000000..cef06d6
|
||||
--- a/dev/null
|
||||
+++ b/fs/squashfs/lzma_wrapper.c
|
||||
@@ -0,0 +1,151 @@
|
||||
+/*
|
||||
+ * Squashfs - a compressed read only filesystem for Linux
|
||||
+ *
|
||||
+ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
||||
+ * Phillip Lougher <phillip@lougher.demon.co.uk>
|
||||
+ *
|
||||
+ * 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,
|
||||
+ * or (at your option) any later version.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; if not, write to the Free Software
|
||||
+ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
+ *
|
||||
+ * lzma_wrapper.c
|
||||
+ */
|
||||
+
|
||||
+#include <asm/unaligned.h>
|
||||
+#include <linux/buffer_head.h>
|
||||
+#include <linux/mutex.h>
|
||||
+#include <linux/vmalloc.h>
|
||||
+#include <linux/decompress/unlzma.h>
|
||||
+
|
||||
+#include "squashfs_fs.h"
|
||||
+#include "squashfs_fs_sb.h"
|
||||
+#include "squashfs_fs_i.h"
|
||||
+#include "squashfs.h"
|
||||
+#include "decompressor.h"
|
||||
+
|
||||
+struct squashfs_lzma {
|
||||
+ void *input;
|
||||
+ void *output;
|
||||
+};
|
||||
+
|
||||
+/* decompress_unlzma.c is currently non re-entrant... */
|
||||
+DEFINE_MUTEX(lzma_mutex);
|
||||
+
|
||||
+/* decompress_unlzma.c doesn't provide any context in its callbacks... */
|
||||
+static int lzma_error;
|
||||
+
|
||||
+static void error(char *m)
|
||||
+{
|
||||
+ ERROR("unlzma error: %s\n", m);
|
||||
+ lzma_error = 1;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static void *lzma_init(struct squashfs_sb_info *msblk)
|
||||
+{
|
||||
+ struct squashfs_lzma *stream = kzalloc(sizeof(*stream), GFP_KERNEL);
|
||||
+ if (stream == NULL)
|
||||
+ goto failed;
|
||||
+ stream->input = vmalloc(msblk->block_size);
|
||||
+ if (stream->input == NULL)
|
||||
+ goto failed;
|
||||
+ stream->output = vmalloc(msblk->block_size);
|
||||
+ if (stream->output == NULL)
|
||||
+ goto failed2;
|
||||
+
|
||||
+ return stream;
|
||||
+
|
||||
+failed2:
|
||||
+ vfree(stream->input);
|
||||
+failed:
|
||||
+ ERROR("failed to allocate lzma workspace\n");
|
||||
+ kfree(stream);
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static void lzma_free(void *strm)
|
||||
+{
|
||||
+ struct squashfs_lzma *stream = strm;
|
||||
+
|
||||
+ if (stream) {
|
||||
+ vfree(stream->input);
|
||||
+ vfree(stream->output);
|
||||
+ }
|
||||
+ kfree(stream);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static int lzma_uncompress(struct squashfs_sb_info *msblk, void **buffer,
|
||||
+ struct buffer_head **bh, int b, int offset, int length, int srclength,
|
||||
+ int pages)
|
||||
+{
|
||||
+ struct squashfs_lzma *stream = msblk->stream;
|
||||
+ void *buff = stream->input;
|
||||
+ int avail, i, bytes = length, res;
|
||||
+
|
||||
+ mutex_lock(&lzma_mutex);
|
||||
+
|
||||
+ for (i = 0; i < b; i++) {
|
||||
+ wait_on_buffer(bh[i]);
|
||||
+ if (!buffer_uptodate(bh[i]))
|
||||
+ goto block_release;
|
||||
+
|
||||
+ avail = min(bytes, msblk->devblksize - offset);
|
||||
+ memcpy(buff, bh[i]->b_data + offset, avail);
|
||||
+ buff += avail;
|
||||
+ bytes -= avail;
|
||||
+ offset = 0;
|
||||
+ put_bh(bh[i]);
|
||||
+ }
|
||||
+
|
||||
+ lzma_error = 0;
|
||||
+ res = unlzma(stream->input, length, NULL, NULL, stream->output, NULL,
|
||||
+ error);
|
||||
+ if (res || lzma_error)
|
||||
+ goto failed;
|
||||
+
|
||||
+ /* uncompressed size is stored in the LZMA header (5 byte offset) */
|
||||
+ res = bytes = get_unaligned_le32(stream->input + 5);
|
||||
+ for (i = 0, buff = stream->output; bytes && i < pages; i++) {
|
||||
+ avail = min_t(int, bytes, PAGE_CACHE_SIZE);
|
||||
+ memcpy(buffer[i], buff, avail);
|
||||
+ buff += avail;
|
||||
+ bytes -= avail;
|
||||
+ }
|
||||
+ if (bytes)
|
||||
+ goto failed;
|
||||
+
|
||||
+ mutex_unlock(&lzma_mutex);
|
||||
+ return res;
|
||||
+
|
||||
+block_release:
|
||||
+ for (; i < b; i++)
|
||||
+ put_bh(bh[i]);
|
||||
+
|
||||
+failed:
|
||||
+ mutex_unlock(&lzma_mutex);
|
||||
+
|
||||
+ ERROR("lzma decompression failed, data probably corrupt\n");
|
||||
+ return -EIO;
|
||||
+}
|
||||
+
|
||||
+const struct squashfs_decompressor squashfs_lzma_comp_ops = {
|
||||
+ .init = lzma_init,
|
||||
+ .free = lzma_free,
|
||||
+ .decompress = lzma_uncompress,
|
||||
+ .id = LZMA_COMPRESSION,
|
||||
+ .name = "lzma",
|
||||
+ .supported = 1
|
||||
+};
|
||||
+
|
||||
diff --git a/fs/squashfs/squashfs.h b/fs/squashfs/squashfs.h
|
||||
index 5d45569..bae1b2c 100644
|
||||
--- a/fs/squashfs/squashfs.h
|
||||
+++ b/fs/squashfs/squashfs.h
|
||||
@@ -105,5 +105,8 @@ extern const struct xattr_handler *squashfs_xattr_handlers[];
|
||||
/* zlib_wrapper.c */
|
||||
extern const struct squashfs_decompressor squashfs_zlib_comp_ops;
|
||||
|
||||
+/* lzma wrapper.c */
|
||||
+extern const struct squashfs_decompressor squashfs_lzma_comp_ops;
|
||||
+
|
||||
/* lzo_wrapper.c */
|
||||
extern const struct squashfs_decompressor squashfs_lzo_comp_ops;
|
||||
--
|
||||
cgit v0.8.3.1
|
@ -1,198 +0,0 @@
|
||||
From afaf6deda47d24effe8f638b46abea210915bee0 Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Lougher <phillip@lougher.demon.co.uk>
|
||||
Date: Mon, 11 Jan 2010 15:15:00 +0000
|
||||
Subject: lzma: Make lzma available to non initramfs/initrd code
|
||||
|
||||
Add a config option DECOMPRESS_LZMA_NEEDED which allows subsystems to
|
||||
specify they need the unlzma code. Normally decompress_unlzma.c is
|
||||
compiled with __init and unlzma is not exported to modules.
|
||||
|
||||
Move INIT definition into separate header files for bzip2/lzma/inflate/lzo
|
||||
so it can be defined differently for each decompressor.
|
||||
|
||||
Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
|
||||
---
|
||||
diff --git a/include/linux/decompress/bunzip2_mm.h b/include/linux/decompress/bunzip2_mm.h
|
||||
new file mode 100644
|
||||
index 0000000..cac6fef
|
||||
--- a/dev/null
|
||||
+++ b/include/linux/decompress/bunzip2_mm.h
|
||||
@@ -0,0 +1,12 @@
|
||||
+#ifndef BUNZIP2_MM_H
|
||||
+#define BUNZIP2_MM_H
|
||||
+
|
||||
+#ifdef STATIC
|
||||
+/* Code active when included from pre-boot environment: */
|
||||
+#define INIT
|
||||
+#else
|
||||
+/* Compile for initramfs/initrd code only */
|
||||
+#define INIT __init
|
||||
+#endif
|
||||
+
|
||||
+#endif
|
||||
diff --git a/include/linux/decompress/inflate_mm.h b/include/linux/decompress/inflate_mm.h
|
||||
new file mode 100644
|
||||
index 0000000..ca4a2ae
|
||||
--- a/dev/null
|
||||
+++ b/include/linux/decompress/inflate_mm.h
|
||||
@@ -0,0 +1,12 @@
|
||||
+#ifndef INFLATE_MM_H
|
||||
+#define INFLATE_MM_H
|
||||
+
|
||||
+#ifdef STATIC
|
||||
+/* Code active when included from pre-boot environment: */
|
||||
+#define INIT
|
||||
+#else
|
||||
+/* Compile for initramfs/initrd code only */
|
||||
+#define INIT __init
|
||||
+#endif
|
||||
+
|
||||
+#endif
|
||||
diff --git a/include/linux/decompress/mm.h b/include/linux/decompress/mm.h
|
||||
index ad5ec1d..f3f6526 100644
|
||||
--- a/include/linux/decompress/mm.h
|
||||
+++ b/include/linux/decompress/mm.h
|
||||
@@ -63,8 +63,6 @@ static void free(void *where)
|
||||
|
||||
#define set_error_fn(x)
|
||||
|
||||
-#define INIT
|
||||
-
|
||||
#else /* STATIC */
|
||||
|
||||
/* Code active when compiled standalone for use when loading ramdisk: */
|
||||
@@ -87,7 +85,6 @@ static void free(void *where)
|
||||
static void(*error)(char *m);
|
||||
#define set_error_fn(x) error = x;
|
||||
|
||||
-#define INIT __init
|
||||
#define STATIC
|
||||
|
||||
#include <linux/init.h>
|
||||
diff --git a/include/linux/decompress/unlzma_mm.h b/include/linux/decompress/unlzma_mm.h
|
||||
new file mode 100644
|
||||
index 0000000..859287e
|
||||
--- a/dev/null
|
||||
+++ b/include/linux/decompress/unlzma_mm.h
|
||||
@@ -0,0 +1,20 @@
|
||||
+#ifndef UNLZMA_MM_H
|
||||
+#define UNLZMA_MM_H
|
||||
+
|
||||
+#ifdef STATIC
|
||||
+
|
||||
+/* Code active when included from pre-boot environment: */
|
||||
+#define INIT
|
||||
+
|
||||
+#elif defined(CONFIG_DECOMPRESS_LZMA_NEEDED)
|
||||
+
|
||||
+/* Make it available to non initramfs/initrd code */
|
||||
+#define INIT
|
||||
+#include <linux/module.h>
|
||||
+#else
|
||||
+
|
||||
+/* Compile for initramfs/initrd code only */
|
||||
+#define INIT __init
|
||||
+#endif
|
||||
+
|
||||
+#endif
|
||||
diff --git a/include/linux/decompress/unlzo_mm.h b/include/linux/decompress/unlzo_mm.h
|
||||
new file mode 100644
|
||||
index 0000000..e3f1573
|
||||
--- a/dev/null
|
||||
+++ b/include/linux/decompress/unlzo_mm.h
|
||||
@@ -0,0 +1,12 @@
|
||||
+#ifndef UNLZO_MM_H
|
||||
+#define UNLZO_MM_H
|
||||
+
|
||||
+#ifdef STATIC
|
||||
+/* Code active when included from pre-boot environment: */
|
||||
+#define INIT
|
||||
+#else
|
||||
+/* Compile for initramfs/initrd code only */
|
||||
+#define INIT __init
|
||||
+#endif
|
||||
+
|
||||
+#endif
|
||||
diff --git a/lib/Kconfig b/lib/Kconfig
|
||||
index fa9bf2c..b87df68 100644
|
||||
--- a/lib/Kconfig
|
||||
+++ b/lib/Kconfig
|
||||
@@ -124,6 +124,9 @@ config DECOMPRESS_LZO
|
||||
select LZO_DECOMPRESS
|
||||
tristate
|
||||
|
||||
+config DECOMPRESS_LZMA_NEEDED
|
||||
+ boolean
|
||||
+
|
||||
#
|
||||
# Generic allocator support is selected if needed
|
||||
#
|
||||
diff --git a/lib/decompress_bunzip2.c b/lib/decompress_bunzip2.c
|
||||
index 81c8bb1..26c1088 100644
|
||||
--- a/lib/decompress_bunzip2.c
|
||||
+++ b/lib/decompress_bunzip2.c
|
||||
@@ -52,6 +52,7 @@
|
||||
#include <linux/slab.h>
|
||||
#endif /* STATIC */
|
||||
|
||||
+#include <linux/decompress/bunzip2_mm.h>
|
||||
#include <linux/decompress/mm.h>
|
||||
|
||||
#ifndef INT_MAX
|
||||
diff --git a/lib/decompress_inflate.c b/lib/decompress_inflate.c
|
||||
index fc686c7..cb6bcab 100644
|
||||
--- a/lib/decompress_inflate.c
|
||||
+++ b/lib/decompress_inflate.c
|
||||
@@ -23,6 +23,7 @@
|
||||
|
||||
#endif /* STATIC */
|
||||
|
||||
+#include <linux/decompress/inflate_mm.h>
|
||||
#include <linux/decompress/mm.h>
|
||||
|
||||
#define GZIP_IOBUF_SIZE (16*1024)
|
||||
diff --git a/lib/decompress_unlzma.c b/lib/decompress_unlzma.c
|
||||
index ca82fde..a614b26 100644
|
||||
--- a/lib/decompress_unlzma.c
|
||||
+++ b/lib/decompress_unlzma.c
|
||||
@@ -36,6 +36,7 @@
|
||||
#include <linux/slab.h>
|
||||
#endif /* STATIC */
|
||||
|
||||
+#include <linux/decompress/unlzma_mm.h>
|
||||
#include <linux/decompress/mm.h>
|
||||
|
||||
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||
@@ -531,7 +532,7 @@ static inline void INIT process_bit1(struct writer *wr, struct rc *rc,
|
||||
|
||||
|
||||
|
||||
-STATIC inline int INIT unlzma(unsigned char *buf, int in_len,
|
||||
+STATIC int INIT unlzma(unsigned char *buf, int in_len,
|
||||
int(*fill)(void*, unsigned int),
|
||||
int(*flush)(void*, unsigned int),
|
||||
unsigned char *output,
|
||||
@@ -652,6 +653,9 @@ exit_1:
|
||||
exit_0:
|
||||
return ret;
|
||||
}
|
||||
+#if defined(CONFIG_DECOMPRESS_LZMA_NEEDED) && !defined(PREBOOT)
|
||||
+EXPORT_SYMBOL(unlzma);
|
||||
+#endif
|
||||
|
||||
#ifdef PREBOOT
|
||||
STATIC int INIT decompress(unsigned char *buf, int in_len,
|
||||
diff --git a/lib/decompress_unlzo.c b/lib/decompress_unlzo.c
|
||||
index bcb3a4b..af06d6f 100644
|
||||
--- a/lib/decompress_unlzo.c
|
||||
+++ b/lib/decompress_unlzo.c
|
||||
@@ -39,6 +39,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/lzo.h>
|
||||
+#include <linux/decompress/unlzo_mm.h>
|
||||
#include <linux/decompress/mm.h>
|
||||
|
||||
#include <linux/compiler.h>
|
||||
--
|
||||
cgit v0.8.3.1
|
@ -1,21 +0,0 @@
|
||||
From 9711a01d380627d1e1535f1bcd0d74fff1476a45 Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Lougher <phillip@lougher.demon.co.uk>
|
||||
Date: Sun, 06 Dec 2009 02:15:08 +0000
|
||||
Subject: Squashfs: select DECOMPRESS_LZMA_NEEDED when including support for lzma
|
||||
|
||||
Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
|
||||
---
|
||||
diff --git a/fs/squashfs/Kconfig b/fs/squashfs/Kconfig
|
||||
index 5632f2a..6fca7b7 100644
|
||||
--- a/fs/squashfs/Kconfig
|
||||
+++ b/fs/squashfs/Kconfig
|
||||
@@ -41,6 +41,7 @@ config SQUASHFS_LZMA
|
||||
bool "Include support for LZMA compressed file systems"
|
||||
depends on SQUASHFS
|
||||
select DECOMPRESS_LZMA
|
||||
+ select DECOMPRESS_LZMA_NEEDED
|
||||
|
||||
|
||||
config SQUASHFS_LZO
|
||||
--
|
||||
cgit v0.8.3.1
|
@ -1,360 +0,0 @@
|
||||
From 96ad13c76002f2d54370bcb57bb6c79ca930d556 Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Lougher <phillip@lougher.demon.co.uk>
|
||||
Date: Mon, 11 Jan 2010 16:45:50 +0000
|
||||
Subject: lzma: make lzma reentrant
|
||||
|
||||
The error function pointer used by lzma is global (file scope) which
|
||||
prevents it being used concurrently. This patch removes the global
|
||||
error pointer use, and instead passes it to all functions that need it.
|
||||
|
||||
The error function pointer is still used by bunzip2, inflate and unlzo.
|
||||
This patch moves the definition into the separate bunzip2, inflate
|
||||
and unlzo header files. This prevents gcc from complaining about an
|
||||
unused definition compiling lzma.
|
||||
|
||||
Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
|
||||
---
|
||||
diff --git a/include/linux/decompress/bunzip2_mm.h b/include/linux/decompress/bunzip2_mm.h
|
||||
index cac6fef..863efd0 100644
|
||||
--- a/include/linux/decompress/bunzip2_mm.h
|
||||
+++ b/include/linux/decompress/bunzip2_mm.h
|
||||
@@ -7,6 +7,7 @@
|
||||
#else
|
||||
/* Compile for initramfs/initrd code only */
|
||||
#define INIT __init
|
||||
+static void(*error)(char *m);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
diff --git a/include/linux/decompress/inflate_mm.h b/include/linux/decompress/inflate_mm.h
|
||||
index ca4a2ae..87a742b 100644
|
||||
--- a/include/linux/decompress/inflate_mm.h
|
||||
+++ b/include/linux/decompress/inflate_mm.h
|
||||
@@ -7,6 +7,7 @@
|
||||
#else
|
||||
/* Compile for initramfs/initrd code only */
|
||||
#define INIT __init
|
||||
+static void(*error)(char *m);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
diff --git a/include/linux/decompress/mm.h b/include/linux/decompress/mm.h
|
||||
index f3f6526..df8b8b5 100644
|
||||
--- a/include/linux/decompress/mm.h
|
||||
+++ b/include/linux/decompress/mm.h
|
||||
@@ -82,7 +82,6 @@ static void free(void *where)
|
||||
#define large_malloc(a) vmalloc(a)
|
||||
#define large_free(a) vfree(a)
|
||||
|
||||
-static void(*error)(char *m);
|
||||
#define set_error_fn(x) error = x;
|
||||
|
||||
#define STATIC
|
||||
diff --git a/include/linux/decompress/unlzo_mm.h b/include/linux/decompress/unlzo_mm.h
|
||||
index e3f1573..27fe0ab 100644
|
||||
--- a/include/linux/decompress/unlzo_mm.h
|
||||
+++ b/include/linux/decompress/unlzo_mm.h
|
||||
@@ -7,6 +7,7 @@
|
||||
#else
|
||||
/* Compile for initramfs/initrd code only */
|
||||
#define INIT __init
|
||||
+static void(*error)(char *m);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
diff --git a/lib/decompress_unlzma.c b/lib/decompress_unlzma.c
|
||||
index a614b26..3e85763 100644
|
||||
--- a/lib/decompress_unlzma.c
|
||||
+++ b/lib/decompress_unlzma.c
|
||||
@@ -89,7 +89,7 @@ static int nofill(void *buffer, unsigned int len)
|
||||
}
|
||||
|
||||
/* Called twice: once at startup and once in rc_normalize() */
|
||||
-static void INIT rc_read(struct rc *rc)
|
||||
+static void INIT rc_read(struct rc *rc, void(*error)(char *x))
|
||||
{
|
||||
rc->buffer_size = rc->fill((char *)rc->buffer, LZMA_IOBUF_SIZE);
|
||||
if (rc->buffer_size <= 0)
|
||||
@@ -116,13 +116,13 @@ static inline void INIT rc_init(struct rc *rc,
|
||||
rc->range = 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
-static inline void INIT rc_init_code(struct rc *rc)
|
||||
+static inline void INIT rc_init_code(struct rc *rc, void(*error)(char *x))
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 5; i++) {
|
||||
if (rc->ptr >= rc->buffer_end)
|
||||
- rc_read(rc);
|
||||
+ rc_read(rc, error);
|
||||
rc->code = (rc->code << 8) | *rc->ptr++;
|
||||
}
|
||||
}
|
||||
@@ -135,32 +135,33 @@ static inline void INIT rc_free(struct rc *rc)
|
||||
}
|
||||
|
||||
/* Called twice, but one callsite is in inline'd rc_is_bit_0_helper() */
|
||||
-static void INIT rc_do_normalize(struct rc *rc)
|
||||
+static void INIT rc_do_normalize(struct rc *rc, void(*error)(char *x))
|
||||
{
|
||||
if (rc->ptr >= rc->buffer_end)
|
||||
- rc_read(rc);
|
||||
+ rc_read(rc, error);
|
||||
rc->range <<= 8;
|
||||
rc->code = (rc->code << 8) | *rc->ptr++;
|
||||
}
|
||||
-static inline void INIT rc_normalize(struct rc *rc)
|
||||
+static inline void INIT rc_normalize(struct rc *rc, void(*error)(char *x))
|
||||
{
|
||||
if (rc->range < (1 << RC_TOP_BITS))
|
||||
- rc_do_normalize(rc);
|
||||
+ rc_do_normalize(rc, error);
|
||||
}
|
||||
|
||||
/* Called 9 times */
|
||||
/* Why rc_is_bit_0_helper exists?
|
||||
*Because we want to always expose (rc->code < rc->bound) to optimizer
|
||||
*/
|
||||
-static inline uint32_t INIT rc_is_bit_0_helper(struct rc *rc, uint16_t *p)
|
||||
+static inline uint32_t INIT rc_is_bit_0_helper(struct rc *rc, uint16_t *p,
|
||||
+ void (*error)(char *x))
|
||||
{
|
||||
- rc_normalize(rc);
|
||||
+ rc_normalize(rc, error);
|
||||
rc->bound = *p * (rc->range >> RC_MODEL_TOTAL_BITS);
|
||||
return rc->bound;
|
||||
}
|
||||
-static inline int INIT rc_is_bit_0(struct rc *rc, uint16_t *p)
|
||||
+static inline int INIT rc_is_bit_0(struct rc *rc, uint16_t *p, void(*error)(char *x))
|
||||
{
|
||||
- uint32_t t = rc_is_bit_0_helper(rc, p);
|
||||
+ uint32_t t = rc_is_bit_0_helper(rc, p, error);
|
||||
return rc->code < t;
|
||||
}
|
||||
|
||||
@@ -178,9 +179,9 @@ static inline void rc_update_bit_1(struct rc *rc, uint16_t *p)
|
||||
}
|
||||
|
||||
/* Called 4 times in unlzma loop */
|
||||
-static int INIT rc_get_bit(struct rc *rc, uint16_t *p, int *symbol)
|
||||
+static int INIT rc_get_bit(struct rc *rc, uint16_t *p, int *symbol, void(*error)(char *x))
|
||||
{
|
||||
- if (rc_is_bit_0(rc, p)) {
|
||||
+ if (rc_is_bit_0(rc, p, error)) {
|
||||
rc_update_bit_0(rc, p);
|
||||
*symbol *= 2;
|
||||
return 0;
|
||||
@@ -192,9 +193,9 @@ static int INIT rc_get_bit(struct rc *rc, uint16_t *p, int *symbol)
|
||||
}
|
||||
|
||||
/* Called once */
|
||||
-static inline int INIT rc_direct_bit(struct rc *rc)
|
||||
+static inline int INIT rc_direct_bit(struct rc *rc , void(*error)(char *x))
|
||||
{
|
||||
- rc_normalize(rc);
|
||||
+ rc_normalize(rc, error);
|
||||
rc->range >>= 1;
|
||||
if (rc->code >= rc->range) {
|
||||
rc->code -= rc->range;
|
||||
@@ -205,13 +206,14 @@ static inline int INIT rc_direct_bit(struct rc *rc)
|
||||
|
||||
/* Called twice */
|
||||
static inline void INIT
|
||||
-rc_bit_tree_decode(struct rc *rc, uint16_t *p, int num_levels, int *symbol)
|
||||
+rc_bit_tree_decode(struct rc *rc, uint16_t *p, int num_levels, int *symbol,
|
||||
+ void(*error)(char *x))
|
||||
{
|
||||
int i = num_levels;
|
||||
|
||||
*symbol = 1;
|
||||
while (i--)
|
||||
- rc_get_bit(rc, p + *symbol, symbol);
|
||||
+ rc_get_bit(rc, p + *symbol, symbol, error);
|
||||
*symbol -= 1 << num_levels;
|
||||
}
|
||||
|
||||
@@ -348,7 +350,8 @@ static inline void INIT copy_bytes(struct writer *wr,
|
||||
static inline void INIT process_bit0(struct writer *wr, struct rc *rc,
|
||||
struct cstate *cst, uint16_t *p,
|
||||
int pos_state, uint16_t *prob,
|
||||
- int lc, uint32_t literal_pos_mask) {
|
||||
+ int lc, uint32_t literal_pos_mask,
|
||||
+ void(*error)(char *x)) {
|
||||
int mi = 1;
|
||||
rc_update_bit_0(rc, prob);
|
||||
prob = (p + LZMA_LITERAL +
|
||||
@@ -366,7 +369,7 @@ static inline void INIT process_bit0(struct writer *wr, struct rc *rc,
|
||||
match_byte <<= 1;
|
||||
bit = match_byte & 0x100;
|
||||
prob_lit = prob + 0x100 + bit + mi;
|
||||
- if (rc_get_bit(rc, prob_lit, &mi)) {
|
||||
+ if (rc_get_bit(rc, prob_lit, &mi, error)) {
|
||||
if (!bit)
|
||||
break;
|
||||
} else {
|
||||
@@ -377,7 +380,7 @@ static inline void INIT process_bit0(struct writer *wr, struct rc *rc,
|
||||
}
|
||||
while (mi < 0x100) {
|
||||
uint16_t *prob_lit = prob + mi;
|
||||
- rc_get_bit(rc, prob_lit, &mi);
|
||||
+ rc_get_bit(rc, prob_lit, &mi, error);
|
||||
}
|
||||
write_byte(wr, mi);
|
||||
if (cst->state < 4)
|
||||
@@ -390,7 +393,8 @@ static inline void INIT process_bit0(struct writer *wr, struct rc *rc,
|
||||
|
||||
static inline void INIT process_bit1(struct writer *wr, struct rc *rc,
|
||||
struct cstate *cst, uint16_t *p,
|
||||
- int pos_state, uint16_t *prob) {
|
||||
+ int pos_state, uint16_t *prob,
|
||||
+ void(*error)(char *x)) {
|
||||
int offset;
|
||||
uint16_t *prob_len;
|
||||
int num_bits;
|
||||
@@ -398,7 +402,7 @@ static inline void INIT process_bit1(struct writer *wr, struct rc *rc,
|
||||
|
||||
rc_update_bit_1(rc, prob);
|
||||
prob = p + LZMA_IS_REP + cst->state;
|
||||
- if (rc_is_bit_0(rc, prob)) {
|
||||
+ if (rc_is_bit_0(rc, prob, error)) {
|
||||
rc_update_bit_0(rc, prob);
|
||||
cst->rep3 = cst->rep2;
|
||||
cst->rep2 = cst->rep1;
|
||||
@@ -408,13 +412,13 @@ static inline void INIT process_bit1(struct writer *wr, struct rc *rc,
|
||||
} else {
|
||||
rc_update_bit_1(rc, prob);
|
||||
prob = p + LZMA_IS_REP_G0 + cst->state;
|
||||
- if (rc_is_bit_0(rc, prob)) {
|
||||
+ if (rc_is_bit_0(rc, prob, error)) {
|
||||
rc_update_bit_0(rc, prob);
|
||||
prob = (p + LZMA_IS_REP_0_LONG
|
||||
+ (cst->state <<
|
||||
LZMA_NUM_POS_BITS_MAX) +
|
||||
pos_state);
|
||||
- if (rc_is_bit_0(rc, prob)) {
|
||||
+ if (rc_is_bit_0(rc, prob, error)) {
|
||||
rc_update_bit_0(rc, prob);
|
||||
|
||||
cst->state = cst->state < LZMA_NUM_LIT_STATES ?
|
||||
@@ -429,13 +433,13 @@ static inline void INIT process_bit1(struct writer *wr, struct rc *rc,
|
||||
|
||||
rc_update_bit_1(rc, prob);
|
||||
prob = p + LZMA_IS_REP_G1 + cst->state;
|
||||
- if (rc_is_bit_0(rc, prob)) {
|
||||
+ if (rc_is_bit_0(rc, prob, error)) {
|
||||
rc_update_bit_0(rc, prob);
|
||||
distance = cst->rep1;
|
||||
} else {
|
||||
rc_update_bit_1(rc, prob);
|
||||
prob = p + LZMA_IS_REP_G2 + cst->state;
|
||||
- if (rc_is_bit_0(rc, prob)) {
|
||||
+ if (rc_is_bit_0(rc, prob, error)) {
|
||||
rc_update_bit_0(rc, prob);
|
||||
distance = cst->rep2;
|
||||
} else {
|
||||
@@ -453,7 +457,7 @@ static inline void INIT process_bit1(struct writer *wr, struct rc *rc,
|
||||
}
|
||||
|
||||
prob_len = prob + LZMA_LEN_CHOICE;
|
||||
- if (rc_is_bit_0(rc, prob_len)) {
|
||||
+ if (rc_is_bit_0(rc, prob_len, error)) {
|
||||
rc_update_bit_0(rc, prob_len);
|
||||
prob_len = (prob + LZMA_LEN_LOW
|
||||
+ (pos_state <<
|
||||
@@ -463,7 +467,7 @@ static inline void INIT process_bit1(struct writer *wr, struct rc *rc,
|
||||
} else {
|
||||
rc_update_bit_1(rc, prob_len);
|
||||
prob_len = prob + LZMA_LEN_CHOICE_2;
|
||||
- if (rc_is_bit_0(rc, prob_len)) {
|
||||
+ if (rc_is_bit_0(rc, prob_len, error)) {
|
||||
rc_update_bit_0(rc, prob_len);
|
||||
prob_len = (prob + LZMA_LEN_MID
|
||||
+ (pos_state <<
|
||||
@@ -479,7 +483,7 @@ static inline void INIT process_bit1(struct writer *wr, struct rc *rc,
|
||||
}
|
||||
}
|
||||
|
||||
- rc_bit_tree_decode(rc, prob_len, num_bits, &len);
|
||||
+ rc_bit_tree_decode(rc, prob_len, num_bits, &len, error);
|
||||
len += offset;
|
||||
|
||||
if (cst->state < 4) {
|
||||
@@ -494,7 +498,7 @@ static inline void INIT process_bit1(struct writer *wr, struct rc *rc,
|
||||
<< LZMA_NUM_POS_SLOT_BITS);
|
||||
rc_bit_tree_decode(rc, prob,
|
||||
LZMA_NUM_POS_SLOT_BITS,
|
||||
- &pos_slot);
|
||||
+ &pos_slot, error);
|
||||
if (pos_slot >= LZMA_START_POS_MODEL_INDEX) {
|
||||
int i, mi;
|
||||
num_bits = (pos_slot >> 1) - 1;
|
||||
@@ -507,7 +511,7 @@ static inline void INIT process_bit1(struct writer *wr, struct rc *rc,
|
||||
num_bits -= LZMA_NUM_ALIGN_BITS;
|
||||
while (num_bits--)
|
||||
cst->rep0 = (cst->rep0 << 1) |
|
||||
- rc_direct_bit(rc);
|
||||
+ rc_direct_bit(rc, error);
|
||||
prob = p + LZMA_ALIGN;
|
||||
cst->rep0 <<= LZMA_NUM_ALIGN_BITS;
|
||||
num_bits = LZMA_NUM_ALIGN_BITS;
|
||||
@@ -515,7 +519,7 @@ static inline void INIT process_bit1(struct writer *wr, struct rc *rc,
|
||||
i = 1;
|
||||
mi = 1;
|
||||
while (num_bits--) {
|
||||
- if (rc_get_bit(rc, prob + mi, &mi))
|
||||
+ if (rc_get_bit(rc, prob + mi, &mi, error))
|
||||
cst->rep0 |= i;
|
||||
i <<= 1;
|
||||
}
|
||||
@@ -537,7 +541,7 @@ STATIC int INIT unlzma(unsigned char *buf, int in_len,
|
||||
int(*flush)(void*, unsigned int),
|
||||
unsigned char *output,
|
||||
int *posp,
|
||||
- void(*error_fn)(char *x)
|
||||
+ void(*error)(char *x)
|
||||
)
|
||||
{
|
||||
struct lzma_header header;
|
||||
@@ -553,8 +557,6 @@ STATIC int INIT unlzma(unsigned char *buf, int in_len,
|
||||
unsigned char *inbuf;
|
||||
int ret = -1;
|
||||
|
||||
- set_error_fn(error_fn);
|
||||
-
|
||||
if (buf)
|
||||
inbuf = buf;
|
||||
else
|
||||
@@ -577,7 +579,7 @@ STATIC int INIT unlzma(unsigned char *buf, int in_len,
|
||||
|
||||
for (i = 0; i < sizeof(header); i++) {
|
||||
if (rc.ptr >= rc.buffer_end)
|
||||
- rc_read(&rc);
|
||||
+ rc_read(&rc, error);
|
||||
((unsigned char *)&header)[i] = *rc.ptr++;
|
||||
}
|
||||
|
||||
@@ -622,17 +624,17 @@ STATIC int INIT unlzma(unsigned char *buf, int in_len,
|
||||
for (i = 0; i < num_probs; i++)
|
||||
p[i] = (1 << RC_MODEL_TOTAL_BITS) >> 1;
|
||||
|
||||
- rc_init_code(&rc);
|
||||
+ rc_init_code(&rc, error);
|
||||
|
||||
while (get_pos(&wr) < header.dst_size) {
|
||||
int pos_state = get_pos(&wr) & pos_state_mask;
|
||||
uint16_t *prob = p + LZMA_IS_MATCH +
|
||||
(cst.state << LZMA_NUM_POS_BITS_MAX) + pos_state;
|
||||
- if (rc_is_bit_0(&rc, prob))
|
||||
+ if (rc_is_bit_0(&rc, prob, error))
|
||||
process_bit0(&wr, &rc, &cst, p, pos_state, prob,
|
||||
- lc, literal_pos_mask);
|
||||
+ lc, literal_pos_mask, error);
|
||||
else {
|
||||
- process_bit1(&wr, &rc, &cst, p, pos_state, prob);
|
||||
+ process_bit1(&wr, &rc, &cst, p, pos_state, prob, error);
|
||||
if (cst.rep0 == 0)
|
||||
break;
|
||||
}
|
||||
--
|
||||
cgit v0.8.3.1
|
@ -1,31 +0,0 @@
|
||||
From fbe65eb62e5dbbf499afa9ee1137b45ee287e6be Mon Sep 17 00:00:00 2001
|
||||
From: Randy Dunlap <randy.dunlap@oracle.com>
|
||||
Date: Tue, 05 Jan 2010 17:15:37 +0000
|
||||
Subject: libs: force lzma_wrapper to be retained
|
||||
|
||||
When CONFIG_SQUASHFS=m and CONFIG_DECOMPRESS_LZMA=m, decompress_lzma
|
||||
is built but then discarded from the library because no built-in code
|
||||
uses it, so change it from a lib- to an obj- to force it to be kept
|
||||
in the library.
|
||||
|
||||
ERROR: "unlzma" [fs/squashfs/squashfs.ko] undefined!
|
||||
|
||||
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
|
||||
Cc: Phillip Lougher <phillip@lougher.demon.co.uk>
|
||||
Cc: Michal Marek <mmarek@suse.cz>
|
||||
---
|
||||
diff --git a/lib/Makefile b/lib/Makefile
|
||||
index e6a3763..a8aa4fc 100644
|
||||
--- a/lib/Makefile
|
||||
+++ b/lib/Makefile
|
||||
@@ -73,7 +73,7 @@ obj-$(CONFIG_RAID6_PQ) += raid6/
|
||||
|
||||
lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o
|
||||
lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o
|
||||
-lib-$(CONFIG_DECOMPRESS_LZMA) += decompress_unlzma.o
|
||||
+obj-$(CONFIG_DECOMPRESS_LZMA) += decompress_unlzma.o
|
||||
lib-$(CONFIG_DECOMPRESS_LZO) += decompress_unlzo.o
|
||||
|
||||
obj-$(CONFIG_TEXTSEARCH) += textsearch.o
|
||||
--
|
||||
cgit v0.8.3.1
|
@ -1,21 +0,0 @@
|
||||
From b5ff8407b58cf4128c1a7edd63c4155aa7724754 Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Lougher <phillip@lougher.demon.co.uk>
|
||||
Date: Thu, 06 May 2010 01:00:11 +0000
|
||||
Subject: squashfs: add missing slab.h include in lzma_wrapper
|
||||
|
||||
Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
|
||||
---
|
||||
diff --git a/fs/squashfs/lzma_wrapper.c b/fs/squashfs/lzma_wrapper.c
|
||||
index cef06d6..4438475 100644
|
||||
--- a/fs/squashfs/lzma_wrapper.c
|
||||
+++ b/fs/squashfs/lzma_wrapper.c
|
||||
@@ -22,6 +22,7 @@
|
||||
*/
|
||||
|
||||
#include <asm/unaligned.h>
|
||||
+#include <linux/slab.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/vmalloc.h>
|
||||
--
|
||||
cgit v0.8.3.1
|
@ -1,79 +0,0 @@
|
||||
--- a/fs/open.c 2010-10-25 12:00:14.484000008 +0200
|
||||
+++ b/fs/open.c 2010-10-25 12:00:50.098000008 +0200
|
||||
@@ -61,6 +61,8 @@ int do_truncate(struct dentry *dentry, l
|
||||
return ret;
|
||||
}
|
||||
|
||||
+EXPORT_SYMBOL(do_truncate);
|
||||
+
|
||||
static long do_sys_truncate(const char __user *pathname, loff_t length)
|
||||
{
|
||||
struct path path;
|
||||
--- a/fs/namei.c 2010-10-25 11:31:57.774000005 +0200
|
||||
+++ b/fs/namei.c 2010-10-25 11:36:56.506000006 +0200
|
||||
@@ -2916,3 +2916,7 @@ EXPORT_SYMBOL(vfs_symlink);
|
||||
EXPORT_SYMBOL(vfs_unlink);
|
||||
EXPORT_SYMBOL(dentry_unhash);
|
||||
EXPORT_SYMBOL(generic_readlink);
|
||||
+EXPORT_SYMBOL(deny_write_access);
|
||||
+EXPORT_SYMBOL(lookup_hash);
|
||||
+EXPORT_SYMBOL(__lookup_one_len);
|
||||
+
|
||||
--- a/fs/splice.c 2010-10-25 11:56:09.020000008 +0200
|
||||
+++ b/fs/splice.c 2010-10-25 11:58:46.227000008 +0200
|
||||
@@ -1117,6 +1117,8 @@ long do_splice_from(struct pipe_inode_in
|
||||
return splice_write(pipe, out, ppos, len, flags);
|
||||
}
|
||||
|
||||
+EXPORT_SYMBOL(do_splice_from);
|
||||
+
|
||||
/*
|
||||
* Attempt to initiate a splice from a file to a pipe.
|
||||
*/
|
||||
@@ -1143,6 +1145,8 @@ long do_splice_to(struct file *in, loff_
|
||||
return splice_read(in, ppos, pipe, len, flags);
|
||||
}
|
||||
|
||||
+EXPORT_SYMBOL(do_splice_to);
|
||||
+
|
||||
/**
|
||||
* splice_direct_to_actor - splices data directly between two non-pipes
|
||||
* @in: file to splice from
|
||||
--- a/security/security.c 2010-10-25 11:39:49.838000006 +0200
|
||||
+++ b/security/security.c 2010-10-25 11:48:27.798000008 +0200
|
||||
@@ -491,6 +491,8 @@ int security_inode_rmdir(struct inode *d
|
||||
return security_ops->inode_rmdir(dir, dentry);
|
||||
}
|
||||
|
||||
+EXPORT_SYMBOL(security_inode_permission);
|
||||
+
|
||||
int security_inode_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
|
||||
{
|
||||
if (unlikely(IS_PRIVATE(dir)))
|
||||
@@ -515,6 +517,8 @@ int security_inode_readlink(struct dentr
|
||||
return security_ops->inode_readlink(dentry);
|
||||
}
|
||||
|
||||
+EXPORT_SYMBOL(security_inode_readlink);
|
||||
+
|
||||
int security_inode_follow_link(struct dentry *dentry, struct nameidata *nd)
|
||||
{
|
||||
if (unlikely(IS_PRIVATE(dentry->d_inode)))
|
||||
@@ -628,6 +632,8 @@ int security_file_permission(struct file
|
||||
return fsnotify_perm(file, mask);
|
||||
}
|
||||
|
||||
+EXPORT_SYMBOL(security_file_permission);
|
||||
+
|
||||
int security_file_alloc(struct file *file)
|
||||
{
|
||||
return security_ops->file_alloc_security(file);
|
||||
@@ -655,6 +661,8 @@ int security_file_mmap(struct file *file
|
||||
return ima_file_mmap(file, prot);
|
||||
}
|
||||
|
||||
+EXPORT_SYMBOL(security_file_mmap);
|
||||
+
|
||||
int security_file_mprotect(struct vm_area_struct *vma, unsigned long reqprot,
|
||||
unsigned long prot)
|
||||
{
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
681
linux-2.6-CHAKRA/patches/kernel-squashfs-lzma-v1.7-2.6.36.patch
Normal file
681
linux-2.6-CHAKRA/patches/kernel-squashfs-lzma-v1.7-2.6.36.patch
Normal file
@ -0,0 +1,681 @@
|
||||
diff -Nru a/fs/squashfs/decompressor.c b/fs/squashfs/decompressor.c
|
||||
--- a/fs/squashfs/decompressor.c 2010-05-16 23:17:36.000000000 +0200
|
||||
+++ b/fs/squashfs/decompressor.c 2010-05-17 14:57:45.271547099 +0200
|
||||
@@ -52,7 +52,11 @@
|
||||
|
||||
static const struct squashfs_decompressor *decompressor[] = {
|
||||
&squashfs_zlib_comp_ops,
|
||||
+#ifdef CONFIG_SQUASHFS_LZMA
|
||||
+ &squashfs_lzma_comp_ops,
|
||||
+#else
|
||||
&squashfs_lzma_unsupported_comp_ops,
|
||||
+#endif
|
||||
#ifdef CONFIG_SQUASHFS_LZO
|
||||
&squashfs_lzo_comp_ops,
|
||||
#else
|
||||
diff -Nru a/fs/squashfs/Kconfig b/fs/squashfs/Kconfig
|
||||
--- a/fs/squashfs/Kconfig 2010-05-16 23:17:36.000000000 +0200
|
||||
+++ b/fs/squashfs/Kconfig 2010-05-17 15:13:49.807545765 +0200
|
||||
@@ -26,6 +26,12 @@
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
+config SQUASHFS_LZMA
|
||||
+ bool "Include support for LZMA compressed file systems"
|
||||
+ depends on SQUASHFS
|
||||
+ select DECOMPRESS_LZMA
|
||||
+ select DECOMPRESS_LZMA_NEEDED
|
||||
+
|
||||
config SQUASHFS_XATTR
|
||||
bool "Squashfs XATTR support"
|
||||
depends on SQUASHFS
|
||||
diff -Nru a/fs/squashfs/lzma_wrapper.c b/fs/squashfs/lzma_wrapper.c
|
||||
--- a/fs/squashfs/lzma_wrapper.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ b/fs/squashfs/lzma_wrapper.c 2010-05-17 15:15:12.637552661 +0200
|
||||
@@ -0,0 +1,152 @@
|
||||
+/*
|
||||
+ * Squashfs - a compressed read only filesystem for Linux
|
||||
+ *
|
||||
+ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
||||
+ * Phillip Lougher <phillip@lougher.demon.co.uk>
|
||||
+ *
|
||||
+ * 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,
|
||||
+ * or (at your option) any later version.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; if not, write to the Free Software
|
||||
+ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
+ *
|
||||
+ * lzma_wrapper.c
|
||||
+ */
|
||||
+
|
||||
+#include <asm/unaligned.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/buffer_head.h>
|
||||
+#include <linux/mutex.h>
|
||||
+#include <linux/vmalloc.h>
|
||||
+#include <linux/decompress/unlzma.h>
|
||||
+
|
||||
+#include "squashfs_fs.h"
|
||||
+#include "squashfs_fs_sb.h"
|
||||
+#include "squashfs_fs_i.h"
|
||||
+#include "squashfs.h"
|
||||
+#include "decompressor.h"
|
||||
+
|
||||
+struct squashfs_lzma {
|
||||
+ void *input;
|
||||
+ void *output;
|
||||
+};
|
||||
+
|
||||
+/* decompress_unlzma.c is currently non re-entrant... */
|
||||
+DEFINE_MUTEX(lzma_mutex);
|
||||
+
|
||||
+/* decompress_unlzma.c doesn't provide any context in its callbacks... */
|
||||
+static int lzma_error;
|
||||
+
|
||||
+static void error(char *m)
|
||||
+{
|
||||
+ ERROR("unlzma error: %s\n", m);
|
||||
+ lzma_error = 1;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static void *lzma_init(struct squashfs_sb_info *msblk)
|
||||
+{
|
||||
+ struct squashfs_lzma *stream = kzalloc(sizeof(*stream), GFP_KERNEL);
|
||||
+ if (stream == NULL)
|
||||
+ goto failed;
|
||||
+ stream->input = vmalloc(msblk->block_size);
|
||||
+ if (stream->input == NULL)
|
||||
+ goto failed;
|
||||
+ stream->output = vmalloc(msblk->block_size);
|
||||
+ if (stream->output == NULL)
|
||||
+ goto failed2;
|
||||
+
|
||||
+ return stream;
|
||||
+
|
||||
+failed2:
|
||||
+ vfree(stream->input);
|
||||
+failed:
|
||||
+ ERROR("failed to allocate lzma workspace\n");
|
||||
+ kfree(stream);
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static void lzma_free(void *strm)
|
||||
+{
|
||||
+ struct squashfs_lzma *stream = strm;
|
||||
+
|
||||
+ if (stream) {
|
||||
+ vfree(stream->input);
|
||||
+ vfree(stream->output);
|
||||
+ }
|
||||
+ kfree(stream);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static int lzma_uncompress(struct squashfs_sb_info *msblk, void **buffer,
|
||||
+ struct buffer_head **bh, int b, int offset, int length, int srclength,
|
||||
+ int pages)
|
||||
+{
|
||||
+ struct squashfs_lzma *stream = msblk->stream;
|
||||
+ void *buff = stream->input;
|
||||
+ int avail, i, bytes = length, res;
|
||||
+
|
||||
+ mutex_lock(&lzma_mutex);
|
||||
+
|
||||
+ for (i = 0; i < b; i++) {
|
||||
+ wait_on_buffer(bh[i]);
|
||||
+ if (!buffer_uptodate(bh[i]))
|
||||
+ goto block_release;
|
||||
+
|
||||
+ avail = min(bytes, msblk->devblksize - offset);
|
||||
+ memcpy(buff, bh[i]->b_data + offset, avail);
|
||||
+ buff += avail;
|
||||
+ bytes -= avail;
|
||||
+ offset = 0;
|
||||
+ put_bh(bh[i]);
|
||||
+ }
|
||||
+
|
||||
+ lzma_error = 0;
|
||||
+ res = unlzma(stream->input, length, NULL, NULL, stream->output, NULL,
|
||||
+ error);
|
||||
+ if (res || lzma_error)
|
||||
+ goto failed;
|
||||
+
|
||||
+ /* uncompressed size is stored in the LZMA header (5 byte offset) */
|
||||
+ res = bytes = get_unaligned_le32(stream->input + 5);
|
||||
+ for (i = 0, buff = stream->output; bytes && i < pages; i++) {
|
||||
+ avail = min_t(int, bytes, PAGE_CACHE_SIZE);
|
||||
+ memcpy(buffer[i], buff, avail);
|
||||
+ buff += avail;
|
||||
+ bytes -= avail;
|
||||
+ }
|
||||
+ if (bytes)
|
||||
+ goto failed;
|
||||
+
|
||||
+ mutex_unlock(&lzma_mutex);
|
||||
+ return res;
|
||||
+
|
||||
+block_release:
|
||||
+ for (; i < b; i++)
|
||||
+ put_bh(bh[i]);
|
||||
+
|
||||
+failed:
|
||||
+ mutex_unlock(&lzma_mutex);
|
||||
+
|
||||
+ ERROR("lzma decompression failed, data probably corrupt\n");
|
||||
+ return -EIO;
|
||||
+}
|
||||
+
|
||||
+const struct squashfs_decompressor squashfs_lzma_comp_ops = {
|
||||
+ .init = lzma_init,
|
||||
+ .free = lzma_free,
|
||||
+ .decompress = lzma_uncompress,
|
||||
+ .id = LZMA_COMPRESSION,
|
||||
+ .name = "lzma",
|
||||
+ .supported = 1
|
||||
+};
|
||||
+
|
||||
diff -Nru a/fs/squashfs/Makefile b/fs/squashfs/Makefile
|
||||
--- a/fs/squashfs/Makefile 2010-05-16 23:17:36.000000000 +0200
|
||||
+++ b/fs/squashfs/Makefile 2010-05-17 14:57:45.270554026 +0200
|
||||
@@ -6,4 +6,5 @@
|
||||
squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o
|
||||
squashfs-y += namei.o super.o symlink.o zlib_wrapper.o decompressor.o
|
||||
squashfs-$(CONFIG_SQUASHFS_XATTR) += xattr.o xattr_id.o
|
||||
+squashfs-$(CONFIG_SQUASHFS_LZMA) += lzma_wrapper.o
|
||||
squashfs-$(CONFIG_SQUASHFS_LZO) += lzo_wrapper.o
|
||||
diff -Nru a/fs/squashfs/squashfs.h b/fs/squashfs/squashfs.h
|
||||
--- a/fs/squashfs/squashfs.h 2010-05-16 23:17:36.000000000 +0200
|
||||
+++ b/fs/squashfs/squashfs.h 2010-05-17 14:57:45.310795600 +0200
|
||||
@@ -105,5 +105,8 @@
|
||||
/* zlib_wrapper.c */
|
||||
extern const struct squashfs_decompressor squashfs_zlib_comp_ops;
|
||||
|
||||
+/* lzma wrapper.c */
|
||||
+extern const struct squashfs_decompressor squashfs_lzma_comp_ops;
|
||||
+
|
||||
/* lzo_wrapper.c */
|
||||
extern const struct squashfs_decompressor squashfs_lzo_comp_ops;
|
||||
diff -Nru a/include/linux/decompress/bunzip2_mm.h b/include/linux/decompress/bunzip2_mm.h
|
||||
--- a/include/linux/decompress/bunzip2_mm.h 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ b/include/linux/decompress/bunzip2_mm.h 2010-05-17 15:14:15.255545839 +0200
|
||||
@@ -0,0 +1,13 @@
|
||||
+#ifndef BUNZIP2_MM_H
|
||||
+#define BUNZIP2_MM_H
|
||||
+
|
||||
+#ifdef STATIC
|
||||
+/* Code active when included from pre-boot environment: */
|
||||
+#define INIT
|
||||
+#else
|
||||
+/* Compile for initramfs/initrd code only */
|
||||
+#define INIT __init
|
||||
+static void(*error)(char *m);
|
||||
+#endif
|
||||
+
|
||||
+#endif
|
||||
diff -Nru a/include/linux/decompress/inflate_mm.h b/include/linux/decompress/inflate_mm.h
|
||||
--- a/include/linux/decompress/inflate_mm.h 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ b/include/linux/decompress/inflate_mm.h 2010-05-17 15:14:15.255545839 +0200
|
||||
@@ -0,0 +1,13 @@
|
||||
+#ifndef INFLATE_MM_H
|
||||
+#define INFLATE_MM_H
|
||||
+
|
||||
+#ifdef STATIC
|
||||
+/* Code active when included from pre-boot environment: */
|
||||
+#define INIT
|
||||
+#else
|
||||
+/* Compile for initramfs/initrd code only */
|
||||
+#define INIT __init
|
||||
+static void(*error)(char *m);
|
||||
+#endif
|
||||
+
|
||||
+#endif
|
||||
diff -Nru a/include/linux/decompress/mm.h b/include/linux/decompress/mm.h
|
||||
--- a/include/linux/decompress/mm.h 2010-05-16 23:17:36.000000000 +0200
|
||||
+++ b/include/linux/decompress/mm.h 2010-05-17 15:14:15.259546209 +0200
|
||||
@@ -63,8 +63,6 @@
|
||||
|
||||
#define set_error_fn(x)
|
||||
|
||||
-#define INIT
|
||||
-
|
||||
#else /* STATIC */
|
||||
|
||||
/* Code active when compiled standalone for use when loading ramdisk: */
|
||||
@@ -84,10 +82,8 @@
|
||||
#define large_malloc(a) vmalloc(a)
|
||||
#define large_free(a) vfree(a)
|
||||
|
||||
-static void(*error)(char *m);
|
||||
#define set_error_fn(x) error = x;
|
||||
|
||||
-#define INIT __init
|
||||
#define STATIC
|
||||
|
||||
#include <linux/init.h>
|
||||
diff -Nru a/include/linux/decompress/unlzma_mm.h b/include/linux/decompress/unlzma_mm.h
|
||||
--- a/include/linux/decompress/unlzma_mm.h 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ b/include/linux/decompress/unlzma_mm.h 2010-05-17 15:13:10.802553245 +0200
|
||||
@@ -0,0 +1,20 @@
|
||||
+#ifndef UNLZMA_MM_H
|
||||
+#define UNLZMA_MM_H
|
||||
+
|
||||
+#ifdef STATIC
|
||||
+
|
||||
+/* Code active when included from pre-boot environment: */
|
||||
+#define INIT
|
||||
+
|
||||
+#elif defined(CONFIG_DECOMPRESS_LZMA_NEEDED)
|
||||
+
|
||||
+/* Make it available to non initramfs/initrd code */
|
||||
+#define INIT
|
||||
+#include <linux/module.h>
|
||||
+#else
|
||||
+
|
||||
+/* Compile for initramfs/initrd code only */
|
||||
+#define INIT __init
|
||||
+#endif
|
||||
+
|
||||
+#endif
|
||||
diff -Nru a/include/linux/decompress/unlzo_mm.h b/include/linux/decompress/unlzo_mm.h
|
||||
--- a/include/linux/decompress/unlzo_mm.h 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ b/include/linux/decompress/unlzo_mm.h 2010-05-17 15:14:15.259546209 +0200
|
||||
@@ -0,0 +1,13 @@
|
||||
+#ifndef UNLZO_MM_H
|
||||
+#define UNLZO_MM_H
|
||||
+
|
||||
+#ifdef STATIC
|
||||
+/* Code active when included from pre-boot environment: */
|
||||
+#define INIT
|
||||
+#else
|
||||
+/* Compile for initramfs/initrd code only */
|
||||
+#define INIT __init
|
||||
+static void(*error)(char *m);
|
||||
+#endif
|
||||
+
|
||||
+#endif
|
||||
diff -Nru a/lib/decompress_bunzip2.c b/lib/decompress_bunzip2.c
|
||||
--- a/lib/decompress_bunzip2.c 2010-05-16 23:17:36.000000000 +0200
|
||||
+++ b/lib/decompress_bunzip2.c 2010-05-17 15:13:10.812574144 +0200
|
||||
@@ -52,6 +52,7 @@
|
||||
#include <linux/slab.h>
|
||||
#endif /* STATIC */
|
||||
|
||||
+#include <linux/decompress/bunzip2_mm.h>
|
||||
#include <linux/decompress/mm.h>
|
||||
|
||||
#ifndef INT_MAX
|
||||
diff -Nru a/lib/decompress_inflate.c b/lib/decompress_inflate.c
|
||||
--- a/lib/decompress_inflate.c 2010-05-16 23:17:36.000000000 +0200
|
||||
+++ b/lib/decompress_inflate.c 2010-05-17 15:13:10.815573687 +0200
|
||||
@@ -23,6 +23,7 @@
|
||||
|
||||
#endif /* STATIC */
|
||||
|
||||
+#include <linux/decompress/inflate_mm.h>
|
||||
#include <linux/decompress/mm.h>
|
||||
|
||||
#define GZIP_IOBUF_SIZE (16*1024)
|
||||
diff -Nru a/lib/decompress_unlzma.c b/lib/decompress_unlzma.c
|
||||
--- a/lib/decompress_unlzma.c 2010-05-16 23:17:36.000000000 +0200
|
||||
+++ b/lib/decompress_unlzma.c 2010-05-17 15:14:15.260574202 +0200
|
||||
@@ -36,6 +36,7 @@
|
||||
#include <linux/slab.h>
|
||||
#endif /* STATIC */
|
||||
|
||||
+#include <linux/decompress/unlzma_mm.h>
|
||||
#include <linux/decompress/mm.h>
|
||||
|
||||
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||
@@ -88,7 +89,7 @@
|
||||
}
|
||||
|
||||
/* Called twice: once at startup and once in rc_normalize() */
|
||||
-static void INIT rc_read(struct rc *rc)
|
||||
+static void INIT rc_read(struct rc *rc, void(*error)(char *x))
|
||||
{
|
||||
rc->buffer_size = rc->fill((char *)rc->buffer, LZMA_IOBUF_SIZE);
|
||||
if (rc->buffer_size <= 0)
|
||||
@@ -115,13 +116,13 @@
|
||||
rc->range = 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
-static inline void INIT rc_init_code(struct rc *rc)
|
||||
+static inline void INIT rc_init_code(struct rc *rc, void(*error)(char *x))
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 5; i++) {
|
||||
if (rc->ptr >= rc->buffer_end)
|
||||
- rc_read(rc);
|
||||
+ rc_read(rc, error);
|
||||
rc->code = (rc->code << 8) | *rc->ptr++;
|
||||
}
|
||||
}
|
||||
@@ -134,32 +135,33 @@
|
||||
}
|
||||
|
||||
/* Called twice, but one callsite is in inline'd rc_is_bit_0_helper() */
|
||||
-static void INIT rc_do_normalize(struct rc *rc)
|
||||
+static void INIT rc_do_normalize(struct rc *rc, void(*error)(char *x))
|
||||
{
|
||||
if (rc->ptr >= rc->buffer_end)
|
||||
- rc_read(rc);
|
||||
+ rc_read(rc, error);
|
||||
rc->range <<= 8;
|
||||
rc->code = (rc->code << 8) | *rc->ptr++;
|
||||
}
|
||||
-static inline void INIT rc_normalize(struct rc *rc)
|
||||
+static inline void INIT rc_normalize(struct rc *rc, void(*error)(char *x))
|
||||
{
|
||||
if (rc->range < (1 << RC_TOP_BITS))
|
||||
- rc_do_normalize(rc);
|
||||
+ rc_do_normalize(rc, error);
|
||||
}
|
||||
|
||||
/* Called 9 times */
|
||||
/* Why rc_is_bit_0_helper exists?
|
||||
*Because we want to always expose (rc->code < rc->bound) to optimizer
|
||||
*/
|
||||
-static inline uint32_t INIT rc_is_bit_0_helper(struct rc *rc, uint16_t *p)
|
||||
+static inline uint32_t INIT rc_is_bit_0_helper(struct rc *rc, uint16_t *p,
|
||||
+ void (*error)(char *x))
|
||||
{
|
||||
- rc_normalize(rc);
|
||||
+ rc_normalize(rc, error);
|
||||
rc->bound = *p * (rc->range >> RC_MODEL_TOTAL_BITS);
|
||||
return rc->bound;
|
||||
}
|
||||
-static inline int INIT rc_is_bit_0(struct rc *rc, uint16_t *p)
|
||||
+static inline int INIT rc_is_bit_0(struct rc *rc, uint16_t *p, void(*error)(char *x))
|
||||
{
|
||||
- uint32_t t = rc_is_bit_0_helper(rc, p);
|
||||
+ uint32_t t = rc_is_bit_0_helper(rc, p, error);
|
||||
return rc->code < t;
|
||||
}
|
||||
|
||||
@@ -177,9 +179,9 @@
|
||||
}
|
||||
|
||||
/* Called 4 times in unlzma loop */
|
||||
-static int INIT rc_get_bit(struct rc *rc, uint16_t *p, int *symbol)
|
||||
+static int INIT rc_get_bit(struct rc *rc, uint16_t *p, int *symbol, void(*error)(char *x))
|
||||
{
|
||||
- if (rc_is_bit_0(rc, p)) {
|
||||
+ if (rc_is_bit_0(rc, p, error)) {
|
||||
rc_update_bit_0(rc, p);
|
||||
*symbol *= 2;
|
||||
return 0;
|
||||
@@ -191,9 +193,9 @@
|
||||
}
|
||||
|
||||
/* Called once */
|
||||
-static inline int INIT rc_direct_bit(struct rc *rc)
|
||||
+static inline int INIT rc_direct_bit(struct rc *rc , void(*error)(char *x))
|
||||
{
|
||||
- rc_normalize(rc);
|
||||
+ rc_normalize(rc, error);
|
||||
rc->range >>= 1;
|
||||
if (rc->code >= rc->range) {
|
||||
rc->code -= rc->range;
|
||||
@@ -204,13 +206,14 @@
|
||||
|
||||
/* Called twice */
|
||||
static inline void INIT
|
||||
-rc_bit_tree_decode(struct rc *rc, uint16_t *p, int num_levels, int *symbol)
|
||||
+rc_bit_tree_decode(struct rc *rc, uint16_t *p, int num_levels, int *symbol,
|
||||
+ void(*error)(char *x))
|
||||
{
|
||||
int i = num_levels;
|
||||
|
||||
*symbol = 1;
|
||||
while (i--)
|
||||
- rc_get_bit(rc, p + *symbol, symbol);
|
||||
+ rc_get_bit(rc, p + *symbol, symbol, error);
|
||||
*symbol -= 1 << num_levels;
|
||||
}
|
||||
|
||||
@@ -347,7 +350,8 @@
|
||||
static inline void INIT process_bit0(struct writer *wr, struct rc *rc,
|
||||
struct cstate *cst, uint16_t *p,
|
||||
int pos_state, uint16_t *prob,
|
||||
- int lc, uint32_t literal_pos_mask) {
|
||||
+ int lc, uint32_t literal_pos_mask,
|
||||
+ void(*error)(char *x)) {
|
||||
int mi = 1;
|
||||
rc_update_bit_0(rc, prob);
|
||||
prob = (p + LZMA_LITERAL +
|
||||
@@ -365,7 +369,7 @@
|
||||
match_byte <<= 1;
|
||||
bit = match_byte & 0x100;
|
||||
prob_lit = prob + 0x100 + bit + mi;
|
||||
- if (rc_get_bit(rc, prob_lit, &mi)) {
|
||||
+ if (rc_get_bit(rc, prob_lit, &mi, error)) {
|
||||
if (!bit)
|
||||
break;
|
||||
} else {
|
||||
@@ -376,7 +380,7 @@
|
||||
}
|
||||
while (mi < 0x100) {
|
||||
uint16_t *prob_lit = prob + mi;
|
||||
- rc_get_bit(rc, prob_lit, &mi);
|
||||
+ rc_get_bit(rc, prob_lit, &mi, error);
|
||||
}
|
||||
write_byte(wr, mi);
|
||||
if (cst->state < 4)
|
||||
@@ -389,7 +393,8 @@
|
||||
|
||||
static inline void INIT process_bit1(struct writer *wr, struct rc *rc,
|
||||
struct cstate *cst, uint16_t *p,
|
||||
- int pos_state, uint16_t *prob) {
|
||||
+ int pos_state, uint16_t *prob,
|
||||
+ void(*error)(char *x)) {
|
||||
int offset;
|
||||
uint16_t *prob_len;
|
||||
int num_bits;
|
||||
@@ -397,7 +402,7 @@
|
||||
|
||||
rc_update_bit_1(rc, prob);
|
||||
prob = p + LZMA_IS_REP + cst->state;
|
||||
- if (rc_is_bit_0(rc, prob)) {
|
||||
+ if (rc_is_bit_0(rc, prob, error)) {
|
||||
rc_update_bit_0(rc, prob);
|
||||
cst->rep3 = cst->rep2;
|
||||
cst->rep2 = cst->rep1;
|
||||
@@ -407,13 +412,13 @@
|
||||
} else {
|
||||
rc_update_bit_1(rc, prob);
|
||||
prob = p + LZMA_IS_REP_G0 + cst->state;
|
||||
- if (rc_is_bit_0(rc, prob)) {
|
||||
+ if (rc_is_bit_0(rc, prob, error)) {
|
||||
rc_update_bit_0(rc, prob);
|
||||
prob = (p + LZMA_IS_REP_0_LONG
|
||||
+ (cst->state <<
|
||||
LZMA_NUM_POS_BITS_MAX) +
|
||||
pos_state);
|
||||
- if (rc_is_bit_0(rc, prob)) {
|
||||
+ if (rc_is_bit_0(rc, prob, error)) {
|
||||
rc_update_bit_0(rc, prob);
|
||||
|
||||
cst->state = cst->state < LZMA_NUM_LIT_STATES ?
|
||||
@@ -428,13 +433,13 @@
|
||||
|
||||
rc_update_bit_1(rc, prob);
|
||||
prob = p + LZMA_IS_REP_G1 + cst->state;
|
||||
- if (rc_is_bit_0(rc, prob)) {
|
||||
+ if (rc_is_bit_0(rc, prob, error)) {
|
||||
rc_update_bit_0(rc, prob);
|
||||
distance = cst->rep1;
|
||||
} else {
|
||||
rc_update_bit_1(rc, prob);
|
||||
prob = p + LZMA_IS_REP_G2 + cst->state;
|
||||
- if (rc_is_bit_0(rc, prob)) {
|
||||
+ if (rc_is_bit_0(rc, prob, error)) {
|
||||
rc_update_bit_0(rc, prob);
|
||||
distance = cst->rep2;
|
||||
} else {
|
||||
@@ -452,7 +457,7 @@
|
||||
}
|
||||
|
||||
prob_len = prob + LZMA_LEN_CHOICE;
|
||||
- if (rc_is_bit_0(rc, prob_len)) {
|
||||
+ if (rc_is_bit_0(rc, prob_len, error)) {
|
||||
rc_update_bit_0(rc, prob_len);
|
||||
prob_len = (prob + LZMA_LEN_LOW
|
||||
+ (pos_state <<
|
||||
@@ -462,7 +467,7 @@
|
||||
} else {
|
||||
rc_update_bit_1(rc, prob_len);
|
||||
prob_len = prob + LZMA_LEN_CHOICE_2;
|
||||
- if (rc_is_bit_0(rc, prob_len)) {
|
||||
+ if (rc_is_bit_0(rc, prob_len, error)) {
|
||||
rc_update_bit_0(rc, prob_len);
|
||||
prob_len = (prob + LZMA_LEN_MID
|
||||
+ (pos_state <<
|
||||
@@ -478,7 +483,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
- rc_bit_tree_decode(rc, prob_len, num_bits, &len);
|
||||
+ rc_bit_tree_decode(rc, prob_len, num_bits, &len, error);
|
||||
len += offset;
|
||||
|
||||
if (cst->state < 4) {
|
||||
@@ -493,7 +498,7 @@
|
||||
<< LZMA_NUM_POS_SLOT_BITS);
|
||||
rc_bit_tree_decode(rc, prob,
|
||||
LZMA_NUM_POS_SLOT_BITS,
|
||||
- &pos_slot);
|
||||
+ &pos_slot, error);
|
||||
if (pos_slot >= LZMA_START_POS_MODEL_INDEX) {
|
||||
int i, mi;
|
||||
num_bits = (pos_slot >> 1) - 1;
|
||||
@@ -506,7 +511,7 @@
|
||||
num_bits -= LZMA_NUM_ALIGN_BITS;
|
||||
while (num_bits--)
|
||||
cst->rep0 = (cst->rep0 << 1) |
|
||||
- rc_direct_bit(rc);
|
||||
+ rc_direct_bit(rc, error);
|
||||
prob = p + LZMA_ALIGN;
|
||||
cst->rep0 <<= LZMA_NUM_ALIGN_BITS;
|
||||
num_bits = LZMA_NUM_ALIGN_BITS;
|
||||
@@ -514,7 +519,7 @@
|
||||
i = 1;
|
||||
mi = 1;
|
||||
while (num_bits--) {
|
||||
- if (rc_get_bit(rc, prob + mi, &mi))
|
||||
+ if (rc_get_bit(rc, prob + mi, &mi, error))
|
||||
cst->rep0 |= i;
|
||||
i <<= 1;
|
||||
}
|
||||
@@ -531,12 +536,12 @@
|
||||
|
||||
|
||||
|
||||
-STATIC inline int INIT unlzma(unsigned char *buf, int in_len,
|
||||
+STATIC int INIT unlzma(unsigned char *buf, int in_len,
|
||||
int(*fill)(void*, unsigned int),
|
||||
int(*flush)(void*, unsigned int),
|
||||
unsigned char *output,
|
||||
int *posp,
|
||||
- void(*error_fn)(char *x)
|
||||
+ void(*error)(char *x)
|
||||
)
|
||||
{
|
||||
struct lzma_header header;
|
||||
@@ -552,8 +557,6 @@
|
||||
unsigned char *inbuf;
|
||||
int ret = -1;
|
||||
|
||||
- set_error_fn(error_fn);
|
||||
-
|
||||
if (buf)
|
||||
inbuf = buf;
|
||||
else
|
||||
@@ -576,7 +579,7 @@
|
||||
|
||||
for (i = 0; i < sizeof(header); i++) {
|
||||
if (rc.ptr >= rc.buffer_end)
|
||||
- rc_read(&rc);
|
||||
+ rc_read(&rc, error);
|
||||
((unsigned char *)&header)[i] = *rc.ptr++;
|
||||
}
|
||||
|
||||
@@ -621,17 +624,17 @@
|
||||
for (i = 0; i < num_probs; i++)
|
||||
p[i] = (1 << RC_MODEL_TOTAL_BITS) >> 1;
|
||||
|
||||
- rc_init_code(&rc);
|
||||
+ rc_init_code(&rc, error);
|
||||
|
||||
while (get_pos(&wr) < header.dst_size) {
|
||||
int pos_state = get_pos(&wr) & pos_state_mask;
|
||||
uint16_t *prob = p + LZMA_IS_MATCH +
|
||||
(cst.state << LZMA_NUM_POS_BITS_MAX) + pos_state;
|
||||
- if (rc_is_bit_0(&rc, prob))
|
||||
+ if (rc_is_bit_0(&rc, prob, error))
|
||||
process_bit0(&wr, &rc, &cst, p, pos_state, prob,
|
||||
- lc, literal_pos_mask);
|
||||
+ lc, literal_pos_mask, error);
|
||||
else {
|
||||
- process_bit1(&wr, &rc, &cst, p, pos_state, prob);
|
||||
+ process_bit1(&wr, &rc, &cst, p, pos_state, prob, error);
|
||||
if (cst.rep0 == 0)
|
||||
break;
|
||||
}
|
||||
@@ -652,6 +655,9 @@
|
||||
exit_0:
|
||||
return ret;
|
||||
}
|
||||
+#if defined(CONFIG_DECOMPRESS_LZMA_NEEDED) && !defined(PREBOOT)
|
||||
+EXPORT_SYMBOL(unlzma);
|
||||
+#endif
|
||||
|
||||
#ifdef PREBOOT
|
||||
STATIC int INIT decompress(unsigned char *buf, int in_len,
|
||||
diff -Nru a/lib/decompress_unlzo.c b/lib/decompress_unlzo.c
|
||||
--- a/lib/decompress_unlzo.c 2010-05-16 23:17:36.000000000 +0200
|
||||
+++ b/lib/decompress_unlzo.c 2010-05-17 15:13:10.820554001 +0200
|
||||
@@ -39,6 +39,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/lzo.h>
|
||||
+#include <linux/decompress/unlzo_mm.h>
|
||||
#include <linux/decompress/mm.h>
|
||||
|
||||
#include <linux/compiler.h>
|
||||
diff -Nru a/lib/Kconfig b/lib/Kconfig
|
||||
--- a/lib/Kconfig 2010-05-16 23:17:36.000000000 +0200
|
||||
+++ b/lib/Kconfig 2010-05-17 15:13:10.809574529 +0200
|
||||
@@ -121,6 +121,9 @@
|
||||
select LZO_DECOMPRESS
|
||||
tristate
|
||||
|
||||
+config DECOMPRESS_LZMA_NEEDED
|
||||
+ boolean
|
||||
+
|
||||
#
|
||||
# Generic allocator support is selected if needed
|
||||
#
|
||||
diff -Nru a/lib/Makefile b/lib/Makefile
|
||||
--- a/lib/Makefile 2010-05-16 23:17:36.000000000 +0200
|
||||
+++ b/lib/Makefile 2010-05-17 15:14:36.312796051 +0200
|
||||
@@ -69,7 +69,7 @@
|
||||
|
||||
lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o
|
||||
lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o
|
||||
-lib-$(CONFIG_DECOMPRESS_LZMA) += decompress_unlzma.o
|
||||
+obj-$(CONFIG_DECOMPRESS_LZMA) += decompress_unlzma.o
|
||||
lib-$(CONFIG_DECOMPRESS_LZO) += decompress_unlzo.o
|
||||
|
||||
obj-$(CONFIG_TEXTSEARCH) += textsearch.o
|
Loading…
Reference in New Issue
Block a user