wok-current rev 4701
linux/squashfs: add lzma support
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sun Jan 03 17:41:36 2010 +0100 (2010-01-03) |
parents | 4911917bb50f |
children | 7b34aa2dd3aa |
files | dahdi/receipt linux/receipt linux/stuff/linux-2.6.30.6-slitaz.config linux/stuff/linux-squashfs-lzma-2.6.30.6.u tazndis/receipt xfce4/receipt |
line diff
1.1 --- a/dahdi/receipt Sat Jan 02 14:50:04 2010 +0100 1.2 +++ b/dahdi/receipt Sun Jan 03 17:41:36 2010 +0100 1.3 @@ -5,7 +5,6 @@ 1.4 CATEGORY="meta" 1.5 SHORT_DESC="Digium Asterisk Hardware Device Interface." 1.6 MAINTAINER="pascal.bellard@slitaz.org" 1.7 -TARBALL="$PACKAGE-$VERSION.tar.gz" 1.8 WEB_SITE="http://www.asterisk.org/" 1.9 DEPENDS="dahdi-linux dahdi-tools" 1.10 PROVIDE="zaptel"
2.1 --- a/linux/receipt Sat Jan 02 14:50:04 2010 +0100 2.2 +++ b/linux/receipt Sun Jan 03 17:41:36 2010 +0100 2.3 @@ -51,6 +51,7 @@ 2.4 aufs2-kbuild.patch 2.5 aufs2-standalone.patch 2.6 $PACKAGE-header-$VERSION.u 2.7 +$PACKAGE-squashfs-lzma-$VERSION.u 2.8 EOT 2.9 make mrproper 2.10 cd Documentation/lguest
3.1 --- a/linux/stuff/linux-2.6.30.6-slitaz.config Sat Jan 02 14:50:04 2010 +0100 3.2 +++ b/linux/stuff/linux-2.6.30.6-slitaz.config Sun Jan 03 17:41:36 2010 +0100 3.3 @@ -1,7 +1,7 @@ 3.4 # 3.5 # Automatically generated make config: don't edit 3.6 # Linux kernel version: 2.6.30.6 3.7 -# Mon Nov 30 12:43:49 2009 3.8 +# Sun Jan 3 17:28:53 2010 3.9 # 3.10 # CONFIG_64BIT is not set 3.11 CONFIG_X86_32=y 3.12 @@ -2149,7 +2149,7 @@ 3.13 CONFIG_VIDEO_V4L2_COMMON=m 3.14 CONFIG_VIDEO_ALLOW_V4L1=y 3.15 CONFIG_VIDEO_V4L1_COMPAT=y 3.16 -# CONFIG_DVB_CORE is not set 3.17 +CONFIG_DVB_CORE=m 3.18 CONFIG_VIDEO_MEDIA=m 3.19 3.20 # 3.21 @@ -2192,7 +2192,10 @@ 3.22 # CONFIG_VIDEO_HEXIUM_ORION is not set 3.23 # CONFIG_VIDEO_HEXIUM_GEMINI is not set 3.24 # CONFIG_VIDEO_CX88 is not set 3.25 +# CONFIG_VIDEO_CX23885 is not set 3.26 +# CONFIG_VIDEO_AU0828 is not set 3.27 # CONFIG_VIDEO_IVTV is not set 3.28 +# CONFIG_VIDEO_CX18 is not set 3.29 # CONFIG_VIDEO_CAFE_CCIC is not set 3.30 CONFIG_SOC_CAMERA=m 3.31 # CONFIG_SOC_CAMERA_MT9M001 is not set 3.32 @@ -2273,8 +2276,54 @@ 3.33 # CONFIG_USB_SI470X is not set 3.34 # CONFIG_USB_MR800 is not set 3.35 # CONFIG_RADIO_TEA5764 is not set 3.36 +# CONFIG_DVB_DYNAMIC_MINORS is not set 3.37 +CONFIG_DVB_CAPTURE_DRIVERS=y 3.38 + 3.39 +# 3.40 +# Supported SAA7146 based PCI Adapters 3.41 +# 3.42 +# CONFIG_TTPCI_EEPROM is not set 3.43 +# CONFIG_DVB_AV7110 is not set 3.44 +# CONFIG_DVB_BUDGET_CORE is not set 3.45 + 3.46 +# 3.47 +# Supported USB Adapters 3.48 +# 3.49 +# CONFIG_DVB_USB is not set 3.50 +# CONFIG_DVB_TTUSB_BUDGET is not set 3.51 +# CONFIG_DVB_TTUSB_DEC is not set 3.52 +# CONFIG_DVB_SIANO_SMS1XXX is not set 3.53 + 3.54 +# 3.55 +# Supported FlexCopII (B2C2) Adapters 3.56 +# 3.57 +# CONFIG_DVB_B2C2_FLEXCOP is not set 3.58 + 3.59 +# 3.60 +# Supported BT878 Adapters 3.61 +# 3.62 + 3.63 +# 3.64 +# Supported Pluto2 Adapters 3.65 +# 3.66 +# CONFIG_DVB_PLUTO2 is not set 3.67 + 3.68 +# 3.69 +# Supported SDMC DM1105 Adapters 3.70 +# 3.71 +# CONFIG_DVB_DM1105 is not set 3.72 + 3.73 +# 3.74 +# Supported FireWire (IEEE 1394) Adapters 3.75 +# 3.76 +# CONFIG_DVB_FIREDTV is not set 3.77 + 3.78 +# 3.79 +# Supported DVB Frontends 3.80 +# 3.81 +# CONFIG_DVB_FE_CUSTOMISE is not set 3.82 CONFIG_DAB=y 3.83 -# CONFIG_USB_DABUSB is not set 3.84 +CONFIG_USB_DABUSB=m 3.85 3.86 # 3.87 # Graphics support 3.88 @@ -2518,7 +2567,8 @@ 3.89 CONFIG_SND_FM801_TEA575X_BOOL=y 3.90 CONFIG_SND_FM801_TEA575X=m 3.91 CONFIG_SND_HDA_INTEL=m 3.92 -# CONFIG_SND_HDA_HWDEP is not set 3.93 +CONFIG_SND_HDA_HWDEP=y 3.94 +# CONFIG_SND_HDA_RECONFIG is not set 3.95 # CONFIG_SND_HDA_INPUT_BEEP is not set 3.96 CONFIG_SND_HDA_CODEC_REALTEK=y 3.97 CONFIG_SND_HDA_CODEC_ANALOG=y 3.98 @@ -2533,7 +2583,7 @@ 3.99 CONFIG_SND_HDA_CODEC_SI3054=y 3.100 CONFIG_SND_HDA_GENERIC=y 3.101 CONFIG_SND_HDA_POWER_SAVE=y 3.102 -CONFIG_SND_HDA_POWER_SAVE_DEFAULT=5 3.103 +CONFIG_SND_HDA_POWER_SAVE_DEFAULT=60 3.104 CONFIG_SND_HDSP=m 3.105 CONFIG_SND_HDSPM=m 3.106 CONFIG_SND_HIFIER=m 3.107 @@ -3026,6 +3076,7 @@ 3.108 # CONFIG_EFS_FS is not set 3.109 CONFIG_CRAMFS=m 3.110 CONFIG_SQUASHFS=m 3.111 +CONFIG_SQUASHFS_LZMA=y 3.112 # CONFIG_SQUASHFS_EMBEDDED is not set 3.113 CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 3.114 # CONFIG_VXFS_FS is not set 3.115 @@ -3369,6 +3420,7 @@ 3.116 CONFIG_DECOMPRESS_GZIP=y 3.117 CONFIG_DECOMPRESS_BZIP2=y 3.118 CONFIG_DECOMPRESS_LZMA=y 3.119 +CONFIG_DECOMPRESS_LZMA_NEEDED=y 3.120 CONFIG_TEXTSEARCH=y 3.121 CONFIG_TEXTSEARCH_KMP=m 3.122 CONFIG_TEXTSEARCH_BM=m 3.123 @@ -3377,3 +3429,5 @@ 3.124 CONFIG_HAS_IOPORT=y 3.125 CONFIG_HAS_DMA=y 3.126 CONFIG_NLATTR=y 3.127 +# CONFIG_SHM_SIGNAL is not set 3.128 +# CONFIG_IOQ is not set
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 4.2 +++ b/linux/stuff/linux-squashfs-lzma-2.6.30.6.u Sun Jan 03 17:41:36 2010 +0100 4.3 @@ -0,0 +1,1808 @@ 4.4 +--- linux-2.6.30.6/fs/squashfs/Kconfig 4.5 ++++ linux-2.6.30.6/fs/squashfs/Kconfig 4.6 +@@ -26,6 +26,12 @@ 4.7 + 4.8 + If unsure, say N. 4.9 + 4.10 ++config SQUASHFS_LZMA 4.11 ++ bool "Include support for LZMA compressed file systems" 4.12 ++ depends on SQUASHFS 4.13 ++ select DECOMPRESS_LZMA 4.14 ++ select DECOMPRESS_LZMA_NEEDED 4.15 ++ 4.16 + config SQUASHFS_EMBEDDED 4.17 + 4.18 + bool "Additional option for memory-constrained systems" 4.19 + 4.20 +--- linux-2.6.30.6/fs/squashfs/Makefile 4.21 ++++ linux-2.6.30.6/fs/squashfs/Makefile 4.22 +@@ -4,4 +4,5 @@ 4.23 + 4.24 + obj-$(CONFIG_SQUASHFS) += squashfs.o 4.25 + squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o 4.26 +-squashfs-y += namei.o super.o symlink.o 4.27 ++squashfs-y += namei.o super.o symlink.o zlib_wrapper.o decompressor.o 4.28 ++squashfs-$(CONFIG_SQUASHFS_LZMA) += lzma_wrapper.o 4.29 + 4.30 +--- linux-2.6.30.6/fs/squashfs/block.c 4.31 ++++ linux-2.6.30.6/fs/squashfs/block.c 4.32 +@@ -29,15 +29,14 @@ 4.33 + #include <linux/fs.h> 4.34 + #include <linux/vfs.h> 4.35 + #include <linux/slab.h> 4.36 +-#include <linux/mutex.h> 4.37 + #include <linux/string.h> 4.38 + #include <linux/buffer_head.h> 4.39 +-#include <linux/zlib.h> 4.40 + 4.41 + #include "squashfs_fs.h" 4.42 + #include "squashfs_fs_sb.h" 4.43 + #include "squashfs_fs_i.h" 4.44 + #include "squashfs.h" 4.45 ++#include "decompressor.h" 4.46 + 4.47 + /* 4.48 + * Read the metadata block length, this is stored in the first two 4.49 +@@ -153,72 +152,10 @@ 4.50 + } 4.51 + 4.52 + if (compressed) { 4.53 +- int zlib_err = 0, zlib_init = 0; 4.54 +- 4.55 +- /* 4.56 +- * Uncompress block. 4.57 +- */ 4.58 +- 4.59 +- mutex_lock(&msblk->read_data_mutex); 4.60 +- 4.61 +- msblk->stream.avail_out = 0; 4.62 +- msblk->stream.avail_in = 0; 4.63 +- 4.64 +- bytes = length; 4.65 +- do { 4.66 +- if (msblk->stream.avail_in == 0 && k < b) { 4.67 +- avail = min(bytes, msblk->devblksize - offset); 4.68 +- bytes -= avail; 4.69 +- wait_on_buffer(bh[k]); 4.70 +- if (!buffer_uptodate(bh[k])) 4.71 +- goto release_mutex; 4.72 +- 4.73 +- if (avail == 0) { 4.74 +- offset = 0; 4.75 +- put_bh(bh[k++]); 4.76 +- continue; 4.77 +- } 4.78 +- 4.79 +- msblk->stream.next_in = bh[k]->b_data + offset; 4.80 +- msblk->stream.avail_in = avail; 4.81 +- offset = 0; 4.82 +- } 4.83 +- 4.84 +- if (msblk->stream.avail_out == 0 && page < pages) { 4.85 +- msblk->stream.next_out = buffer[page++]; 4.86 +- msblk->stream.avail_out = PAGE_CACHE_SIZE; 4.87 +- } 4.88 +- 4.89 +- if (!zlib_init) { 4.90 +- zlib_err = zlib_inflateInit(&msblk->stream); 4.91 +- if (zlib_err != Z_OK) { 4.92 +- ERROR("zlib_inflateInit returned" 4.93 +- " unexpected result 0x%x," 4.94 +- " srclength %d\n", zlib_err, 4.95 +- srclength); 4.96 +- goto release_mutex; 4.97 +- } 4.98 +- zlib_init = 1; 4.99 +- } 4.100 +- 4.101 +- zlib_err = zlib_inflate(&msblk->stream, Z_SYNC_FLUSH); 4.102 +- 4.103 +- if (msblk->stream.avail_in == 0 && k < b) 4.104 +- put_bh(bh[k++]); 4.105 +- } while (zlib_err == Z_OK); 4.106 +- 4.107 +- if (zlib_err != Z_STREAM_END) { 4.108 +- ERROR("zlib_inflate error, data probably corrupt\n"); 4.109 +- goto release_mutex; 4.110 +- } 4.111 +- 4.112 +- zlib_err = zlib_inflateEnd(&msblk->stream); 4.113 +- if (zlib_err != Z_OK) { 4.114 +- ERROR("zlib_inflate error, data probably corrupt\n"); 4.115 +- goto release_mutex; 4.116 +- } 4.117 +- length = msblk->stream.total_out; 4.118 +- mutex_unlock(&msblk->read_data_mutex); 4.119 ++ length = squashfs_decompress(msblk, buffer, bh, b, offset, 4.120 ++ length, srclength, pages); 4.121 ++ if (length < 0) 4.122 ++ goto read_failure; 4.123 + } else { 4.124 + /* 4.125 + * Block is uncompressed. 4.126 +@@ -254,9 +191,6 @@ 4.127 + 4.128 + kfree(bh); 4.129 + return length; 4.130 +- 4.131 +-release_mutex: 4.132 +- mutex_unlock(&msblk->read_data_mutex); 4.133 + 4.134 + block_release: 4.135 + for (; k < b; k++) 4.136 + 4.137 +--- linux-2.6.30.6/fs/squashfs/cache.c 4.138 ++++ linux-2.6.30.6/fs/squashfs/cache.c 4.139 +@@ -51,7 +51,6 @@ 4.140 + #include <linux/sched.h> 4.141 + #include <linux/spinlock.h> 4.142 + #include <linux/wait.h> 4.143 +-#include <linux/zlib.h> 4.144 + #include <linux/pagemap.h> 4.145 + 4.146 + #include "squashfs_fs.h" 4.147 + 4.148 +--- linux-2.6.30.6/fs/squashfs/decompressor.c 4.149 ++++ linux-2.6.30.6/fs/squashfs/decompressor.c 4.150 +@@ -0,0 +1,72 @@ 4.151 ++/* 4.152 ++ * Squashfs - a compressed read only filesystem for Linux 4.153 ++ * 4.154 ++ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 4.155 ++ * Phillip Lougher <phillip@lougher.demon.co.uk> 4.156 ++ * 4.157 ++ * This program is free software; you can redistribute it and/or 4.158 ++ * modify it under the terms of the GNU General Public License 4.159 ++ * as published by the Free Software Foundation; either version 2, 4.160 ++ * or (at your option) any later version. 4.161 ++ * 4.162 ++ * This program is distributed in the hope that it will be useful, 4.163 ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of 4.164 ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 4.165 ++ * GNU General Public License for more details. 4.166 ++ * 4.167 ++ * You should have received a copy of the GNU General Public License 4.168 ++ * along with this program; if not, write to the Free Software 4.169 ++ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 4.170 ++ * 4.171 ++ * decompressor.c 4.172 ++ */ 4.173 ++ 4.174 ++#include <linux/types.h> 4.175 ++#include <linux/mutex.h> 4.176 ++#include <linux/buffer_head.h> 4.177 ++ 4.178 ++#include "squashfs_fs.h" 4.179 ++#include "squashfs_fs_sb.h" 4.180 ++#include "squashfs_fs_i.h" 4.181 ++#include "decompressor.h" 4.182 ++#include "squashfs.h" 4.183 ++ 4.184 ++/* 4.185 ++ * This file (and decompressor.h) implements a decompressor framework for 4.186 ++ * Squashfs, allowing multiple decompressors to be easily supported 4.187 ++ */ 4.188 ++ 4.189 ++static const struct squashfs_decompressor squashfs_lzma_unsupported_comp_ops = { 4.190 ++ NULL, NULL, NULL, LZMA_COMPRESSION, "lzma", 0 4.191 ++}; 4.192 ++ 4.193 ++static const struct squashfs_decompressor squashfs_lzo_unsupported_comp_ops = { 4.194 ++ NULL, NULL, NULL, LZO_COMPRESSION, "lzo", 0 4.195 ++}; 4.196 ++ 4.197 ++static const struct squashfs_decompressor squashfs_unknown_comp_ops = { 4.198 ++ NULL, NULL, NULL, 0, "unknown", 0 4.199 ++}; 4.200 ++ 4.201 ++static const struct squashfs_decompressor *decompressor[] = { 4.202 ++ &squashfs_zlib_comp_ops, 4.203 ++#ifdef CONFIG_SQUASHFS_LZMA 4.204 ++ &squashfs_lzma_comp_ops, 4.205 ++#else 4.206 ++ &squashfs_lzma_unsupported_comp_ops, 4.207 ++#endif 4.208 ++ &squashfs_lzo_unsupported_comp_ops, 4.209 ++ &squashfs_unknown_comp_ops 4.210 ++}; 4.211 ++ 4.212 ++ 4.213 ++const struct squashfs_decompressor *squashfs_lookup_decompressor(int id) 4.214 ++{ 4.215 ++ int i; 4.216 ++ 4.217 ++ for (i = 0; decompressor[i]->id; i++) 4.218 ++ if (id == decompressor[i]->id) 4.219 ++ break; 4.220 ++ 4.221 ++ return decompressor[i]; 4.222 ++} 4.223 + 4.224 +--- linux-2.6.30.6/fs/squashfs/decompressor.h 4.225 ++++ linux-2.6.30.6/fs/squashfs/decompressor.h 4.226 +@@ -0,0 +1,55 @@ 4.227 ++#ifndef DECOMPRESSOR_H 4.228 ++#define DECOMPRESSOR_H 4.229 ++/* 4.230 ++ * Squashfs - a compressed read only filesystem for Linux 4.231 ++ * 4.232 ++ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 4.233 ++ * Phillip Lougher <phillip@lougher.demon.co.uk> 4.234 ++ * 4.235 ++ * This program is free software; you can redistribute it and/or 4.236 ++ * modify it under the terms of the GNU General Public License 4.237 ++ * as published by the Free Software Foundation; either version 2, 4.238 ++ * or (at your option) any later version. 4.239 ++ * 4.240 ++ * This program is distributed in the hope that it will be useful, 4.241 ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of 4.242 ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 4.243 ++ * GNU General Public License for more details. 4.244 ++ * 4.245 ++ * You should have received a copy of the GNU General Public License 4.246 ++ * along with this program; if not, write to the Free Software 4.247 ++ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 4.248 ++ * 4.249 ++ * decompressor.h 4.250 ++ */ 4.251 ++ 4.252 ++struct squashfs_decompressor { 4.253 ++ void *(*init)(struct squashfs_sb_info *); 4.254 ++ void (*free)(void *); 4.255 ++ int (*decompress)(struct squashfs_sb_info *, void **, 4.256 ++ struct buffer_head **, int, int, int, int, int); 4.257 ++ int id; 4.258 ++ char *name; 4.259 ++ int supported; 4.260 ++}; 4.261 ++ 4.262 ++static inline void *squashfs_decompressor_init(struct squashfs_sb_info *msblk) 4.263 ++{ 4.264 ++ return msblk->decompressor->init(msblk); 4.265 ++} 4.266 ++ 4.267 ++static inline void squashfs_decompressor_free(struct squashfs_sb_info *msblk, 4.268 ++ void *s) 4.269 ++{ 4.270 ++ if (msblk->decompressor) 4.271 ++ msblk->decompressor->free(s); 4.272 ++} 4.273 ++ 4.274 ++static inline int squashfs_decompress(struct squashfs_sb_info *msblk, 4.275 ++ void **buffer, struct buffer_head **bh, int b, int offset, int length, 4.276 ++ int srclength, int pages) 4.277 ++{ 4.278 ++ return msblk->decompressor->decompress(msblk, buffer, bh, b, offset, 4.279 ++ length, srclength, pages); 4.280 ++} 4.281 ++#endif 4.282 + 4.283 +--- linux-2.6.30.6/fs/squashfs/dir.c 4.284 ++++ linux-2.6.30.6/fs/squashfs/dir.c 4.285 +@@ -30,7 +30,6 @@ 4.286 + #include <linux/fs.h> 4.287 + #include <linux/vfs.h> 4.288 + #include <linux/slab.h> 4.289 +-#include <linux/zlib.h> 4.290 + 4.291 + #include "squashfs_fs.h" 4.292 + #include "squashfs_fs_sb.h" 4.293 + 4.294 +--- linux-2.6.30.6/fs/squashfs/export.c 4.295 ++++ linux-2.6.30.6/fs/squashfs/export.c 4.296 +@@ -39,7 +39,6 @@ 4.297 + #include <linux/vfs.h> 4.298 + #include <linux/dcache.h> 4.299 + #include <linux/exportfs.h> 4.300 +-#include <linux/zlib.h> 4.301 + #include <linux/slab.h> 4.302 + 4.303 + #include "squashfs_fs.h" 4.304 + 4.305 +--- linux-2.6.30.6/fs/squashfs/file.c 4.306 ++++ linux-2.6.30.6/fs/squashfs/file.c 4.307 +@@ -47,7 +47,6 @@ 4.308 + #include <linux/string.h> 4.309 + #include <linux/pagemap.h> 4.310 + #include <linux/mutex.h> 4.311 +-#include <linux/zlib.h> 4.312 + 4.313 + #include "squashfs_fs.h" 4.314 + #include "squashfs_fs_sb.h" 4.315 + 4.316 +--- linux-2.6.30.6/fs/squashfs/fragment.c 4.317 ++++ linux-2.6.30.6/fs/squashfs/fragment.c 4.318 +@@ -36,7 +36,6 @@ 4.319 + #include <linux/fs.h> 4.320 + #include <linux/vfs.h> 4.321 + #include <linux/slab.h> 4.322 +-#include <linux/zlib.h> 4.323 + 4.324 + #include "squashfs_fs.h" 4.325 + #include "squashfs_fs_sb.h" 4.326 + 4.327 +--- linux-2.6.30.6/fs/squashfs/id.c 4.328 ++++ linux-2.6.30.6/fs/squashfs/id.c 4.329 +@@ -34,7 +34,6 @@ 4.330 + #include <linux/fs.h> 4.331 + #include <linux/vfs.h> 4.332 + #include <linux/slab.h> 4.333 +-#include <linux/zlib.h> 4.334 + 4.335 + #include "squashfs_fs.h" 4.336 + #include "squashfs_fs_sb.h" 4.337 + 4.338 +--- linux-2.6.30.6/fs/squashfs/inode.c 4.339 ++++ linux-2.6.30.6/fs/squashfs/inode.c 4.340 +@@ -40,7 +40,6 @@ 4.341 + 4.342 + #include <linux/fs.h> 4.343 + #include <linux/vfs.h> 4.344 +-#include <linux/zlib.h> 4.345 + 4.346 + #include "squashfs_fs.h" 4.347 + #include "squashfs_fs_sb.h" 4.348 + 4.349 +--- linux-2.6.30.6/fs/squashfs/lzma_wrapper.c 4.350 ++++ linux-2.6.30.6/fs/squashfs/lzma_wrapper.c 4.351 +@@ -0,0 +1,151 @@ 4.352 ++/* 4.353 ++ * Squashfs - a compressed read only filesystem for Linux 4.354 ++ * 4.355 ++ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 4.356 ++ * Phillip Lougher <phillip@lougher.demon.co.uk> 4.357 ++ * 4.358 ++ * This program is free software; you can redistribute it and/or 4.359 ++ * modify it under the terms of the GNU General Public License 4.360 ++ * as published by the Free Software Foundation; either version 2, 4.361 ++ * or (at your option) any later version. 4.362 ++ * 4.363 ++ * This program is distributed in the hope that it will be useful, 4.364 ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of 4.365 ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 4.366 ++ * GNU General Public License for more details. 4.367 ++ * 4.368 ++ * You should have received a copy of the GNU General Public License 4.369 ++ * along with this program; if not, write to the Free Software 4.370 ++ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 4.371 ++ * 4.372 ++ * lzma_wrapper.c 4.373 ++ */ 4.374 ++ 4.375 ++#include <asm/unaligned.h> 4.376 ++#include <linux/buffer_head.h> 4.377 ++#include <linux/mutex.h> 4.378 ++#include <linux/vmalloc.h> 4.379 ++#include <linux/decompress/unlzma.h> 4.380 ++ 4.381 ++#include "squashfs_fs.h" 4.382 ++#include "squashfs_fs_sb.h" 4.383 ++#include "squashfs_fs_i.h" 4.384 ++#include "squashfs.h" 4.385 ++#include "decompressor.h" 4.386 ++ 4.387 ++struct squashfs_lzma { 4.388 ++ void *input; 4.389 ++ void *output; 4.390 ++}; 4.391 ++ 4.392 ++/* decompress_unlzma.c is currently non re-entrant... */ 4.393 ++DEFINE_MUTEX(lzma_mutex); 4.394 ++ 4.395 ++/* decompress_unlzma.c doesn't provide any context in its callbacks... */ 4.396 ++static int lzma_error; 4.397 ++ 4.398 ++static void error(char *m) 4.399 ++{ 4.400 ++ ERROR("unlzma error: %s\n", m); 4.401 ++ lzma_error = 1; 4.402 ++} 4.403 ++ 4.404 ++ 4.405 ++static void *lzma_init(struct squashfs_sb_info *msblk) 4.406 ++{ 4.407 ++ struct squashfs_lzma *stream = kzalloc(sizeof(*stream), GFP_KERNEL); 4.408 ++ if (stream == NULL) 4.409 ++ goto failed; 4.410 ++ stream->input = vmalloc(msblk->block_size); 4.411 ++ if (stream->input == NULL) 4.412 ++ goto failed; 4.413 ++ stream->output = vmalloc(msblk->block_size); 4.414 ++ if (stream->output == NULL) 4.415 ++ goto failed2; 4.416 ++ 4.417 ++ return stream; 4.418 ++ 4.419 ++failed2: 4.420 ++ vfree(stream->input); 4.421 ++failed: 4.422 ++ ERROR("failed to allocate lzma workspace\n"); 4.423 ++ kfree(stream); 4.424 ++ return NULL; 4.425 ++} 4.426 ++ 4.427 ++ 4.428 ++static void lzma_free(void *strm) 4.429 ++{ 4.430 ++ struct squashfs_lzma *stream = strm; 4.431 ++ 4.432 ++ if (stream) { 4.433 ++ vfree(stream->input); 4.434 ++ vfree(stream->output); 4.435 ++ } 4.436 ++ kfree(stream); 4.437 ++} 4.438 ++ 4.439 ++ 4.440 ++static int lzma_uncompress(struct squashfs_sb_info *msblk, void **buffer, 4.441 ++ struct buffer_head **bh, int b, int offset, int length, int srclength, 4.442 ++ int pages) 4.443 ++{ 4.444 ++ struct squashfs_lzma *stream = msblk->stream; 4.445 ++ void *buff = stream->input; 4.446 ++ int avail, i, bytes = length, res; 4.447 ++ 4.448 ++ mutex_lock(&lzma_mutex); 4.449 ++ 4.450 ++ for (i = 0; i < b; i++) { 4.451 ++ wait_on_buffer(bh[i]); 4.452 ++ if (!buffer_uptodate(bh[i])) 4.453 ++ goto block_release; 4.454 ++ 4.455 ++ avail = min(bytes, msblk->devblksize - offset); 4.456 ++ memcpy(buff, bh[i]->b_data + offset, avail); 4.457 ++ buff += avail; 4.458 ++ bytes -= avail; 4.459 ++ offset = 0; 4.460 ++ put_bh(bh[i]); 4.461 ++ } 4.462 ++ 4.463 ++ lzma_error = 0; 4.464 ++ res = unlzma(stream->input, length, NULL, NULL, stream->output, NULL, 4.465 ++ error); 4.466 ++ if (res || lzma_error) 4.467 ++ goto failed; 4.468 ++ 4.469 ++ /* uncompressed size is stored in the LZMA header (5 byte offset) */ 4.470 ++ res = bytes = get_unaligned_le32(stream->input + 5); 4.471 ++ for (i = 0, buff = stream->output; bytes && i < pages; i++) { 4.472 ++ avail = min_t(int, bytes, PAGE_CACHE_SIZE); 4.473 ++ memcpy(buffer[i], buff, avail); 4.474 ++ buff += avail; 4.475 ++ bytes -= avail; 4.476 ++ } 4.477 ++ if (bytes) 4.478 ++ goto failed; 4.479 ++ 4.480 ++ mutex_unlock(&lzma_mutex); 4.481 ++ return res; 4.482 ++ 4.483 ++block_release: 4.484 ++ for (; i < b; i++) 4.485 ++ put_bh(bh[i]); 4.486 ++ 4.487 ++failed: 4.488 ++ mutex_unlock(&lzma_mutex); 4.489 ++ 4.490 ++ ERROR("lzma decompression failed, data probably corrupt\n"); 4.491 ++ return -EIO; 4.492 ++} 4.493 ++ 4.494 ++const struct squashfs_decompressor squashfs_lzma_comp_ops = { 4.495 ++ .init = lzma_init, 4.496 ++ .free = lzma_free, 4.497 ++ .decompress = lzma_uncompress, 4.498 ++ .id = LZMA_COMPRESSION, 4.499 ++ .name = "lzma", 4.500 ++ .supported = 1 4.501 ++}; 4.502 ++ 4.503 + 4.504 +--- linux-2.6.30.6/fs/squashfs/namei.c 4.505 ++++ linux-2.6.30.6/fs/squashfs/namei.c 4.506 +@@ -57,7 +57,6 @@ 4.507 + #include <linux/slab.h> 4.508 + #include <linux/string.h> 4.509 + #include <linux/dcache.h> 4.510 +-#include <linux/zlib.h> 4.511 + 4.512 + #include "squashfs_fs.h" 4.513 + #include "squashfs_fs_sb.h" 4.514 + 4.515 +--- linux-2.6.30.6/fs/squashfs/squashfs.h 4.516 ++++ linux-2.6.30.6/fs/squashfs/squashfs.h 4.517 +@@ -51,6 +51,9 @@ 4.518 + u64, int); 4.519 + extern int squashfs_read_table(struct super_block *, void *, u64, int); 4.520 + 4.521 ++/* decompressor.c */ 4.522 ++extern const struct squashfs_decompressor *squashfs_lookup_decompressor(int); 4.523 ++ 4.524 + /* export.c */ 4.525 + extern __le64 *squashfs_read_inode_lookup_table(struct super_block *, u64, 4.526 + unsigned int); 4.527 +@@ -71,7 +74,7 @@ 4.528 + extern int squashfs_read_inode(struct inode *, long long); 4.529 + 4.530 + /* 4.531 +- * Inodes and files operations 4.532 ++ * Inodes, files and decompressor operations 4.533 + */ 4.534 + 4.535 + /* dir.c */ 4.536 +@@ -88,3 +91,9 @@ 4.537 + 4.538 + /* symlink.c */ 4.539 + extern const struct address_space_operations squashfs_symlink_aops; 4.540 ++ 4.541 ++/* zlib_wrapper.c */ 4.542 ++extern const struct squashfs_decompressor squashfs_zlib_comp_ops; 4.543 ++ 4.544 ++/* lzma wrapper.c */ 4.545 ++extern const struct squashfs_decompressor squashfs_lzma_comp_ops; 4.546 + 4.547 +--- linux-2.6.30.6/fs/squashfs/squashfs_fs.h 4.548 ++++ linux-2.6.30.6/fs/squashfs/squashfs_fs.h 4.549 +@@ -211,7 +211,9 @@ 4.550 + /* 4.551 + * definitions for structures on disk 4.552 + */ 4.553 +-#define ZLIB_COMPRESSION 1 4.554 ++#define ZLIB_COMPRESSION 1 4.555 ++#define LZMA_COMPRESSION 2 4.556 ++#define LZO_COMPRESSION 3 4.557 + 4.558 + struct squashfs_super_block { 4.559 + __le32 s_magic; 4.560 + 4.561 +--- linux-2.6.30.6/fs/squashfs/squashfs_fs_sb.h 4.562 ++++ linux-2.6.30.6/fs/squashfs/squashfs_fs_sb.h 4.563 +@@ -52,25 +52,26 @@ 4.564 + }; 4.565 + 4.566 + struct squashfs_sb_info { 4.567 +- int devblksize; 4.568 +- int devblksize_log2; 4.569 +- struct squashfs_cache *block_cache; 4.570 +- struct squashfs_cache *fragment_cache; 4.571 +- struct squashfs_cache *read_page; 4.572 +- int next_meta_index; 4.573 +- __le64 *id_table; 4.574 +- __le64 *fragment_index; 4.575 +- unsigned int *fragment_index_2; 4.576 +- struct mutex read_data_mutex; 4.577 +- struct mutex meta_index_mutex; 4.578 +- struct meta_index *meta_index; 4.579 +- z_stream stream; 4.580 +- __le64 *inode_lookup_table; 4.581 +- u64 inode_table; 4.582 +- u64 directory_table; 4.583 +- unsigned int block_size; 4.584 +- unsigned short block_log; 4.585 +- long long bytes_used; 4.586 +- unsigned int inodes; 4.587 ++ const struct squashfs_decompressor *decompressor; 4.588 ++ int devblksize; 4.589 ++ int devblksize_log2; 4.590 ++ struct squashfs_cache *block_cache; 4.591 ++ struct squashfs_cache *fragment_cache; 4.592 ++ struct squashfs_cache *read_page; 4.593 ++ int next_meta_index; 4.594 ++ __le64 *id_table; 4.595 ++ __le64 *fragment_index; 4.596 ++ unsigned int *fragment_index_2; 4.597 ++ struct mutex read_data_mutex; 4.598 ++ struct mutex meta_index_mutex; 4.599 ++ struct meta_index *meta_index; 4.600 ++ void *stream; 4.601 ++ __le64 *inode_lookup_table; 4.602 ++ u64 inode_table; 4.603 ++ u64 directory_table; 4.604 ++ unsigned int block_size; 4.605 ++ unsigned short block_log; 4.606 ++ long long bytes_used; 4.607 ++ unsigned int inodes; 4.608 + }; 4.609 + #endif 4.610 + 4.611 +--- linux-2.6.30.6/fs/squashfs/super.c 4.612 ++++ linux-2.6.30.6/fs/squashfs/super.c 4.613 +@@ -30,38 +30,46 @@ 4.614 + #include <linux/fs.h> 4.615 + #include <linux/vfs.h> 4.616 + #include <linux/slab.h> 4.617 ++#include <linux/smp_lock.h> 4.618 + #include <linux/mutex.h> 4.619 + #include <linux/pagemap.h> 4.620 + #include <linux/init.h> 4.621 + #include <linux/module.h> 4.622 +-#include <linux/zlib.h> 4.623 + #include <linux/magic.h> 4.624 + 4.625 + #include "squashfs_fs.h" 4.626 + #include "squashfs_fs_sb.h" 4.627 + #include "squashfs_fs_i.h" 4.628 + #include "squashfs.h" 4.629 ++#include "decompressor.h" 4.630 + 4.631 + static struct file_system_type squashfs_fs_type; 4.632 +-static struct super_operations squashfs_super_ops; 4.633 ++static const struct super_operations squashfs_super_ops; 4.634 + 4.635 +-static int supported_squashfs_filesystem(short major, short minor, short comp) 4.636 ++static const struct squashfs_decompressor *supported_squashfs_filesystem(short 4.637 ++ major, short minor, short id) 4.638 + { 4.639 ++ const struct squashfs_decompressor *decompressor; 4.640 ++ 4.641 + if (major < SQUASHFS_MAJOR) { 4.642 + ERROR("Major/Minor mismatch, older Squashfs %d.%d " 4.643 + "filesystems are unsupported\n", major, minor); 4.644 +- return -EINVAL; 4.645 ++ return NULL; 4.646 + } else if (major > SQUASHFS_MAJOR || minor > SQUASHFS_MINOR) { 4.647 + ERROR("Major/Minor mismatch, trying to mount newer " 4.648 + "%d.%d filesystem\n", major, minor); 4.649 + ERROR("Please update your kernel\n"); 4.650 +- return -EINVAL; 4.651 ++ return NULL; 4.652 + } 4.653 + 4.654 +- if (comp != ZLIB_COMPRESSION) 4.655 +- return -EINVAL; 4.656 ++ decompressor = squashfs_lookup_decompressor(id); 4.657 ++ if (!decompressor->supported) { 4.658 ++ ERROR("Filesystem uses \"%s\" compression. This is not " 4.659 ++ "supported\n", decompressor->name); 4.660 ++ return NULL; 4.661 ++ } 4.662 + 4.663 +- return 0; 4.664 ++ return decompressor; 4.665 + } 4.666 + 4.667 + 4.668 +@@ -86,13 +94,6 @@ 4.669 + } 4.670 + msblk = sb->s_fs_info; 4.671 + 4.672 +- msblk->stream.workspace = kmalloc(zlib_inflate_workspacesize(), 4.673 +- GFP_KERNEL); 4.674 +- if (msblk->stream.workspace == NULL) { 4.675 +- ERROR("Failed to allocate zlib workspace\n"); 4.676 +- goto failure; 4.677 +- } 4.678 +- 4.679 + sblk = kzalloc(sizeof(*sblk), GFP_KERNEL); 4.680 + if (sblk == NULL) { 4.681 + ERROR("Failed to allocate squashfs_super_block\n"); 4.682 +@@ -119,25 +120,25 @@ 4.683 + goto failed_mount; 4.684 + } 4.685 + 4.686 ++ err = -EINVAL; 4.687 ++ 4.688 + /* Check it is a SQUASHFS superblock */ 4.689 + sb->s_magic = le32_to_cpu(sblk->s_magic); 4.690 + if (sb->s_magic != SQUASHFS_MAGIC) { 4.691 + if (!silent) 4.692 + ERROR("Can't find a SQUASHFS superblock on %s\n", 4.693 + bdevname(sb->s_bdev, b)); 4.694 +- err = -EINVAL; 4.695 + goto failed_mount; 4.696 + } 4.697 + 4.698 +- /* Check the MAJOR & MINOR versions and compression type */ 4.699 +- err = supported_squashfs_filesystem(le16_to_cpu(sblk->s_major), 4.700 ++ /* Check the MAJOR & MINOR versions and lookup compression type */ 4.701 ++ msblk->decompressor = supported_squashfs_filesystem( 4.702 ++ le16_to_cpu(sblk->s_major), 4.703 + le16_to_cpu(sblk->s_minor), 4.704 + le16_to_cpu(sblk->compression)); 4.705 +- if (err < 0) 4.706 ++ if (msblk->decompressor == NULL) 4.707 + goto failed_mount; 4.708 + 4.709 +- err = -EINVAL; 4.710 +- 4.711 + /* 4.712 + * Check if there's xattrs in the filesystem. These are not 4.713 + * supported in this version, so warn that they will be ignored. 4.714 +@@ -204,6 +205,10 @@ 4.715 + 4.716 + err = -ENOMEM; 4.717 + 4.718 ++ msblk->stream = squashfs_decompressor_init(msblk); 4.719 ++ if (msblk->stream == NULL) 4.720 ++ goto failed_mount; 4.721 ++ 4.722 + msblk->block_cache = squashfs_cache_init("metadata", 4.723 + SQUASHFS_CACHED_BLKS, SQUASHFS_METADATA_SIZE); 4.724 + if (msblk->block_cache == NULL) 4.725 +@@ -291,17 +296,16 @@ 4.726 + squashfs_cache_delete(msblk->block_cache); 4.727 + squashfs_cache_delete(msblk->fragment_cache); 4.728 + squashfs_cache_delete(msblk->read_page); 4.729 ++ squashfs_decompressor_free(msblk, msblk->stream); 4.730 + kfree(msblk->inode_lookup_table); 4.731 + kfree(msblk->fragment_index); 4.732 + kfree(msblk->id_table); 4.733 +- kfree(msblk->stream.workspace); 4.734 + kfree(sb->s_fs_info); 4.735 + sb->s_fs_info = NULL; 4.736 + kfree(sblk); 4.737 + return err; 4.738 + 4.739 + failure: 4.740 +- kfree(msblk->stream.workspace); 4.741 + kfree(sb->s_fs_info); 4.742 + sb->s_fs_info = NULL; 4.743 + return -ENOMEM; 4.744 +@@ -338,18 +342,22 @@ 4.745 + 4.746 + static void squashfs_put_super(struct super_block *sb) 4.747 + { 4.748 ++ lock_kernel(); 4.749 ++ 4.750 + if (sb->s_fs_info) { 4.751 + struct squashfs_sb_info *sbi = sb->s_fs_info; 4.752 + squashfs_cache_delete(sbi->block_cache); 4.753 + squashfs_cache_delete(sbi->fragment_cache); 4.754 + squashfs_cache_delete(sbi->read_page); 4.755 ++ squashfs_decompressor_free(sbi, sbi->stream); 4.756 + kfree(sbi->id_table); 4.757 + kfree(sbi->fragment_index); 4.758 + kfree(sbi->meta_index); 4.759 +- kfree(sbi->stream.workspace); 4.760 + kfree(sb->s_fs_info); 4.761 + sb->s_fs_info = NULL; 4.762 + } 4.763 ++ 4.764 ++ unlock_kernel(); 4.765 + } 4.766 + 4.767 + 4.768 +@@ -439,7 +447,7 @@ 4.769 + .fs_flags = FS_REQUIRES_DEV 4.770 + }; 4.771 + 4.772 +-static struct super_operations squashfs_super_ops = { 4.773 ++static const struct super_operations squashfs_super_ops = { 4.774 + .alloc_inode = squashfs_alloc_inode, 4.775 + .destroy_inode = squashfs_destroy_inode, 4.776 + .statfs = squashfs_statfs, 4.777 + 4.778 +--- linux-2.6.30.6/fs/squashfs/symlink.c 4.779 ++++ linux-2.6.30.6/fs/squashfs/symlink.c 4.780 +@@ -36,7 +36,6 @@ 4.781 + #include <linux/slab.h> 4.782 + #include <linux/string.h> 4.783 + #include <linux/pagemap.h> 4.784 +-#include <linux/zlib.h> 4.785 + 4.786 + #include "squashfs_fs.h" 4.787 + #include "squashfs_fs_sb.h" 4.788 + 4.789 +--- linux-2.6.30.6/fs/squashfs/zlib_wrapper.c 4.790 ++++ linux-2.6.30.6/fs/squashfs/zlib_wrapper.c 4.791 +@@ -0,0 +1,150 @@ 4.792 ++/* 4.793 ++ * Squashfs - a compressed read only filesystem for Linux 4.794 ++ * 4.795 ++ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 4.796 ++ * Phillip Lougher <phillip@lougher.demon.co.uk> 4.797 ++ * 4.798 ++ * This program is free software; you can redistribute it and/or 4.799 ++ * modify it under the terms of the GNU General Public License 4.800 ++ * as published by the Free Software Foundation; either version 2, 4.801 ++ * or (at your option) any later version. 4.802 ++ * 4.803 ++ * This program is distributed in the hope that it will be useful, 4.804 ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of 4.805 ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 4.806 ++ * GNU General Public License for more details. 4.807 ++ * 4.808 ++ * You should have received a copy of the GNU General Public License 4.809 ++ * along with this program; if not, write to the Free Software 4.810 ++ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 4.811 ++ * 4.812 ++ * zlib_wrapper.c 4.813 ++ */ 4.814 ++ 4.815 ++ 4.816 ++#include <linux/mutex.h> 4.817 ++#include <linux/buffer_head.h> 4.818 ++#include <linux/zlib.h> 4.819 ++ 4.820 ++#include "squashfs_fs.h" 4.821 ++#include "squashfs_fs_sb.h" 4.822 ++#include "squashfs_fs_i.h" 4.823 ++#include "squashfs.h" 4.824 ++#include "decompressor.h" 4.825 ++ 4.826 ++static void *zlib_init(struct squashfs_sb_info *dummy) 4.827 ++{ 4.828 ++ z_stream *stream = kmalloc(sizeof(z_stream), GFP_KERNEL); 4.829 ++ if (stream == NULL) 4.830 ++ goto failed; 4.831 ++ stream->workspace = kmalloc(zlib_inflate_workspacesize(), 4.832 ++ GFP_KERNEL); 4.833 ++ if (stream->workspace == NULL) 4.834 ++ goto failed; 4.835 ++ 4.836 ++ return stream; 4.837 ++ 4.838 ++failed: 4.839 ++ ERROR("Failed to allocate zlib workspace\n"); 4.840 ++ kfree(stream); 4.841 ++ return NULL; 4.842 ++} 4.843 ++ 4.844 ++ 4.845 ++static void zlib_free(void *strm) 4.846 ++{ 4.847 ++ z_stream *stream = strm; 4.848 ++ 4.849 ++ if (stream) 4.850 ++ kfree(stream->workspace); 4.851 ++ kfree(stream); 4.852 ++} 4.853 ++ 4.854 ++ 4.855 ++static int zlib_uncompress(struct squashfs_sb_info *msblk, void **buffer, 4.856 ++ struct buffer_head **bh, int b, int offset, int length, int srclength, 4.857 ++ int pages) 4.858 ++{ 4.859 ++ int zlib_err = 0, zlib_init = 0; 4.860 ++ int avail, bytes, k = 0, page = 0; 4.861 ++ z_stream *stream = msblk->stream; 4.862 ++ 4.863 ++ mutex_lock(&msblk->read_data_mutex); 4.864 ++ 4.865 ++ stream->avail_out = 0; 4.866 ++ stream->avail_in = 0; 4.867 ++ 4.868 ++ bytes = length; 4.869 ++ do { 4.870 ++ if (stream->avail_in == 0 && k < b) { 4.871 ++ avail = min(bytes, msblk->devblksize - offset); 4.872 ++ bytes -= avail; 4.873 ++ wait_on_buffer(bh[k]); 4.874 ++ if (!buffer_uptodate(bh[k])) 4.875 ++ goto release_mutex; 4.876 ++ 4.877 ++ if (avail == 0) { 4.878 ++ offset = 0; 4.879 ++ put_bh(bh[k++]); 4.880 ++ continue; 4.881 ++ } 4.882 ++ 4.883 ++ stream->next_in = bh[k]->b_data + offset; 4.884 ++ stream->avail_in = avail; 4.885 ++ offset = 0; 4.886 ++ } 4.887 ++ 4.888 ++ if (stream->avail_out == 0 && page < pages) { 4.889 ++ stream->next_out = buffer[page++]; 4.890 ++ stream->avail_out = PAGE_CACHE_SIZE; 4.891 ++ } 4.892 ++ 4.893 ++ if (!zlib_init) { 4.894 ++ zlib_err = zlib_inflateInit(stream); 4.895 ++ if (zlib_err != Z_OK) { 4.896 ++ ERROR("zlib_inflateInit returned unexpected " 4.897 ++ "result 0x%x, srclength %d\n", 4.898 ++ zlib_err, srclength); 4.899 ++ goto release_mutex; 4.900 ++ } 4.901 ++ zlib_init = 1; 4.902 ++ } 4.903 ++ 4.904 ++ zlib_err = zlib_inflate(stream, Z_SYNC_FLUSH); 4.905 ++ 4.906 ++ if (stream->avail_in == 0 && k < b) 4.907 ++ put_bh(bh[k++]); 4.908 ++ } while (zlib_err == Z_OK); 4.909 ++ 4.910 ++ if (zlib_err != Z_STREAM_END) { 4.911 ++ ERROR("zlib_inflate error, data probably corrupt\n"); 4.912 ++ goto release_mutex; 4.913 ++ } 4.914 ++ 4.915 ++ zlib_err = zlib_inflateEnd(stream); 4.916 ++ if (zlib_err != Z_OK) { 4.917 ++ ERROR("zlib_inflate error, data probably corrupt\n"); 4.918 ++ goto release_mutex; 4.919 ++ } 4.920 ++ 4.921 ++ mutex_unlock(&msblk->read_data_mutex); 4.922 ++ return stream->total_out; 4.923 ++ 4.924 ++release_mutex: 4.925 ++ mutex_unlock(&msblk->read_data_mutex); 4.926 ++ 4.927 ++ for (; k < b; k++) 4.928 ++ put_bh(bh[k]); 4.929 ++ 4.930 ++ return -EIO; 4.931 ++} 4.932 ++ 4.933 ++const struct squashfs_decompressor squashfs_zlib_comp_ops = { 4.934 ++ .init = zlib_init, 4.935 ++ .free = zlib_free, 4.936 ++ .decompress = zlib_uncompress, 4.937 ++ .id = ZLIB_COMPRESSION, 4.938 ++ .name = "zlib", 4.939 ++ .supported = 1 4.940 ++}; 4.941 ++ 4.942 + 4.943 +--- linux-2.6.30.6/include/linux/decompress/bunzip2_mm.h 4.944 ++++ linux-2.6.30.6/include/linux/decompress/bunzip2_mm.h 4.945 +@@ -0,0 +1,13 @@ 4.946 ++#ifndef BUNZIP2_MM_H 4.947 ++#define BUNZIP2_MM_H 4.948 ++ 4.949 ++#ifdef STATIC 4.950 ++/* Code active when included from pre-boot environment: */ 4.951 ++#define INIT 4.952 ++#else 4.953 ++/* Compile for initramfs/initrd code only */ 4.954 ++#define INIT __init 4.955 ++static void(*error)(char *m); 4.956 ++#endif 4.957 ++ 4.958 ++#endif 4.959 + 4.960 +--- linux-2.6.30.6/include/linux/decompress/inflate_mm.h 4.961 ++++ linux-2.6.30.6/include/linux/decompress/inflate_mm.h 4.962 +@@ -0,0 +1,13 @@ 4.963 ++#ifndef INFLATE_MM_H 4.964 ++#define INFLATE_MM_H 4.965 ++ 4.966 ++#ifdef STATIC 4.967 ++/* Code active when included from pre-boot environment: */ 4.968 ++#define INIT 4.969 ++#else 4.970 ++/* Compile for initramfs/initrd code only */ 4.971 ++#define INIT __init 4.972 ++static void(*error)(char *m); 4.973 ++#endif 4.974 ++ 4.975 ++#endif 4.976 + 4.977 +--- linux-2.6.30.6/include/linux/decompress/mm.h 4.978 ++++ linux-2.6.30.6/include/linux/decompress/mm.h 4.979 +@@ -25,7 +25,7 @@ 4.980 + void *p; 4.981 + 4.982 + if (size < 0) 4.983 +- error("Malloc error"); 4.984 ++ return NULL; 4.985 + if (!malloc_ptr) 4.986 + malloc_ptr = free_mem_ptr; 4.987 + 4.988 +@@ -35,7 +35,7 @@ 4.989 + malloc_ptr += size; 4.990 + 4.991 + if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr) 4.992 +- error("Out of memory"); 4.993 ++ return NULL; 4.994 + 4.995 + malloc_count++; 4.996 + return p; 4.997 +@@ -53,8 +53,6 @@ 4.998 + 4.999 + #define set_error_fn(x) 4.1000 + 4.1001 +-#define INIT 4.1002 +- 4.1003 + #else /* STATIC */ 4.1004 + 4.1005 + /* Code active when compiled standalone for use when loading ramdisk: */ 4.1006 +@@ -74,10 +72,8 @@ 4.1007 + #define large_malloc(a) vmalloc(a) 4.1008 + #define large_free(a) vfree(a) 4.1009 + 4.1010 +-static void(*error)(char *m); 4.1011 + #define set_error_fn(x) error = x; 4.1012 + 4.1013 +-#define INIT __init 4.1014 + #define STATIC 4.1015 + 4.1016 + #include <linux/init.h> 4.1017 + 4.1018 +--- linux-2.6.30.6/include/linux/decompress/unlzma_mm.h 4.1019 ++++ linux-2.6.30.6/include/linux/decompress/unlzma_mm.h 4.1020 +@@ -0,0 +1,20 @@ 4.1021 ++#ifndef UNLZMA_MM_H 4.1022 ++#define UNLZMA_MM_H 4.1023 ++ 4.1024 ++#ifdef STATIC 4.1025 ++ 4.1026 ++/* Code active when included from pre-boot environment: */ 4.1027 ++#define INIT 4.1028 ++ 4.1029 ++#elif defined(CONFIG_DECOMPRESS_LZMA_NEEDED) 4.1030 ++ 4.1031 ++/* Make it available to non initramfs/initrd code */ 4.1032 ++#define INIT 4.1033 ++#include <linux/module.h> 4.1034 ++#else 4.1035 ++ 4.1036 ++/* Compile for initramfs/initrd code only */ 4.1037 ++#define INIT __init 4.1038 ++#endif 4.1039 ++ 4.1040 ++#endif 4.1041 + 4.1042 +--- linux-2.6.30.6/lib/Kconfig 4.1043 ++++ linux-2.6.30.6/lib/Kconfig 4.1044 +@@ -10,6 +10,9 @@ 4.1045 + config BITREVERSE 4.1046 + tristate 4.1047 + 4.1048 ++config RATIONAL 4.1049 ++ boolean 4.1050 ++ 4.1051 + config GENERIC_FIND_FIRST_BIT 4.1052 + bool 4.1053 + 4.1054 +@@ -114,6 +117,9 @@ 4.1055 + config DECOMPRESS_LZMA 4.1056 + tristate 4.1057 + 4.1058 ++config DECOMPRESS_LZMA_NEEDED 4.1059 ++ boolean 4.1060 ++ 4.1061 + # 4.1062 + # Generic allocator support is selected if needed 4.1063 + # 4.1064 +@@ -153,6 +159,9 @@ 4.1065 + config TEXTSEARCH_FSM 4.1066 + tristate 4.1067 + 4.1068 ++config BTREE 4.1069 ++ boolean 4.1070 ++ 4.1071 + config HAS_IOMEM 4.1072 + boolean 4.1073 + depends on !NO_IOMEM 4.1074 +@@ -190,5 +199,35 @@ 4.1075 + # 4.1076 + config NLATTR 4.1077 + bool 4.1078 ++ 4.1079 ++# 4.1080 ++# Generic 64-bit atomic support is selected if needed 4.1081 ++# 4.1082 ++config GENERIC_ATOMIC64 4.1083 ++ bool 4.1084 ++ 4.1085 ++config LRU_CACHE 4.1086 ++ tristate 4.1087 ++ 4.1088 ++config SHM_SIGNAL 4.1089 ++ tristate "SHM Signal - Generic shared-memory signaling mechanism" 4.1090 ++ default n 4.1091 ++ help 4.1092 ++ Provides a shared-memory based signaling mechanism to indicate 4.1093 ++ memory-dirty notifications between two end-points. 4.1094 ++ 4.1095 ++ If unsure, say N 4.1096 ++ 4.1097 ++config IOQ 4.1098 ++ tristate "IO-Queue library - Generic shared-memory queue" 4.1099 ++ select SHM_SIGNAL 4.1100 ++ default n 4.1101 ++ help 4.1102 ++ IOQ is a generic shared-memory-queue mechanism that happens to be 4.1103 ++ friendly to virtualization boundaries. It can be used in a variety 4.1104 ++ of ways, though its intended purpose is to become a low-level 4.1105 ++ communication path for paravirtualized drivers. 4.1106 ++ 4.1107 ++ If unsure, say N 4.1108 + 4.1109 + endmenu 4.1110 + 4.1111 +--- linux-2.6.30.6/lib/decompress_bunzip2.c 4.1112 ++++ linux-2.6.30.6/lib/decompress_bunzip2.c 4.1113 +@@ -45,12 +45,15 @@ 4.1114 + */ 4.1115 + 4.1116 + 4.1117 +-#ifndef STATIC 4.1118 ++#ifdef STATIC 4.1119 ++#define PREBOOT 4.1120 ++#else 4.1121 + #include <linux/decompress/bunzip2.h> 4.1122 +-#endif /* !STATIC */ 4.1123 ++#include <linux/slab.h> 4.1124 ++#endif /* STATIC */ 4.1125 + 4.1126 ++#include <linux/decompress/bunzip2_mm.h> 4.1127 + #include <linux/decompress/mm.h> 4.1128 +-#include <linux/slab.h> 4.1129 + 4.1130 + #ifndef INT_MAX 4.1131 + #define INT_MAX 0x7fffffff 4.1132 +@@ -297,7 +300,7 @@ 4.1133 + again when using them (during symbol decoding).*/ 4.1134 + base = hufGroup->base-1; 4.1135 + limit = hufGroup->limit-1; 4.1136 +- /* Calculate permute[]. Concurently, initialize 4.1137 ++ /* Calculate permute[]. Concurrently, initialize 4.1138 + * temp[] and limit[]. */ 4.1139 + pp = 0; 4.1140 + for (i = minLen; i <= maxLen; i++) { 4.1141 +@@ -635,6 +638,8 @@ 4.1142 + 4.1143 + /* Allocate bunzip_data. Most fields initialize to zero. */ 4.1144 + bd = *bdp = malloc(i); 4.1145 ++ if (!bd) 4.1146 ++ return RETVAL_OUT_OF_MEMORY; 4.1147 + memset(bd, 0, sizeof(struct bunzip_data)); 4.1148 + /* Setup input buffer */ 4.1149 + bd->inbuf = inbuf; 4.1150 +@@ -662,6 +667,8 @@ 4.1151 + bd->dbufSize = 100000*(i-BZh0); 4.1152 + 4.1153 + bd->dbuf = large_malloc(bd->dbufSize * sizeof(int)); 4.1154 ++ if (!bd->dbuf) 4.1155 ++ return RETVAL_OUT_OF_MEMORY; 4.1156 + return RETVAL_OK; 4.1157 + } 4.1158 + 4.1159 +@@ -681,12 +688,10 @@ 4.1160 + set_error_fn(error_fn); 4.1161 + if (flush) 4.1162 + outbuf = malloc(BZIP2_IOBUF_SIZE); 4.1163 +- else 4.1164 +- len -= 4; /* Uncompressed size hack active in pre-boot 4.1165 +- environment */ 4.1166 ++ 4.1167 + if (!outbuf) { 4.1168 + error("Could not allocate output bufer"); 4.1169 +- return -1; 4.1170 ++ return RETVAL_OUT_OF_MEMORY; 4.1171 + } 4.1172 + if (buf) 4.1173 + inbuf = buf; 4.1174 +@@ -694,6 +699,7 @@ 4.1175 + inbuf = malloc(BZIP2_IOBUF_SIZE); 4.1176 + if (!inbuf) { 4.1177 + error("Could not allocate input bufer"); 4.1178 ++ i = RETVAL_OUT_OF_MEMORY; 4.1179 + goto exit_0; 4.1180 + } 4.1181 + i = start_bunzip(&bd, inbuf, len, fill); 4.1182 +@@ -720,11 +726,14 @@ 4.1183 + } else if (i == RETVAL_UNEXPECTED_OUTPUT_EOF) { 4.1184 + error("Compressed file ends unexpectedly"); 4.1185 + } 4.1186 ++ if (!bd) 4.1187 ++ goto exit_1; 4.1188 + if (bd->dbuf) 4.1189 + large_free(bd->dbuf); 4.1190 + if (pos) 4.1191 + *pos = bd->inbufPos; 4.1192 + free(bd); 4.1193 ++exit_1: 4.1194 + if (!buf) 4.1195 + free(inbuf); 4.1196 + exit_0: 4.1197 +@@ -733,4 +742,14 @@ 4.1198 + return i; 4.1199 + } 4.1200 + 4.1201 +-#define decompress bunzip2 4.1202 ++#ifdef PREBOOT 4.1203 ++STATIC int INIT decompress(unsigned char *buf, int len, 4.1204 ++ int(*fill)(void*, unsigned int), 4.1205 ++ int(*flush)(void*, unsigned int), 4.1206 ++ unsigned char *outbuf, 4.1207 ++ int *pos, 4.1208 ++ void(*error_fn)(char *x)) 4.1209 ++{ 4.1210 ++ return bunzip2(buf, len - 4, fill, flush, outbuf, pos, error_fn); 4.1211 ++} 4.1212 ++#endif 4.1213 + 4.1214 +--- linux-2.6.30.6/lib/decompress_inflate.c 4.1215 ++++ linux-2.6.30.6/lib/decompress_inflate.c 4.1216 +@@ -19,14 +19,20 @@ 4.1217 + #include "zlib_inflate/inflate.h" 4.1218 + 4.1219 + #include "zlib_inflate/infutil.h" 4.1220 ++#include <linux/slab.h> 4.1221 + 4.1222 + #endif /* STATIC */ 4.1223 + 4.1224 ++#include <linux/decompress/inflate_mm.h> 4.1225 + #include <linux/decompress/mm.h> 4.1226 +-#include <linux/slab.h> 4.1227 + 4.1228 +-#define INBUF_LEN (16*1024) 4.1229 ++#define GZIP_IOBUF_SIZE (16*1024) 4.1230 + 4.1231 ++static int nofill(void *buffer, unsigned int len) 4.1232 ++{ 4.1233 ++ return -1; 4.1234 ++} 4.1235 ++ 4.1236 + /* Included from initramfs et al code */ 4.1237 + STATIC int INIT gunzip(unsigned char *buf, int len, 4.1238 + int(*fill)(void*, unsigned int), 4.1239 +@@ -55,7 +61,7 @@ 4.1240 + if (buf) 4.1241 + zbuf = buf; 4.1242 + else { 4.1243 +- zbuf = malloc(INBUF_LEN); 4.1244 ++ zbuf = malloc(GZIP_IOBUF_SIZE); 4.1245 + len = 0; 4.1246 + } 4.1247 + if (!zbuf) { 4.1248 +@@ -76,8 +82,11 @@ 4.1249 + goto gunzip_nomem4; 4.1250 + } 4.1251 + 4.1252 ++ if (!fill) 4.1253 ++ fill = nofill; 4.1254 ++ 4.1255 + if (len == 0) 4.1256 +- len = fill(zbuf, INBUF_LEN); 4.1257 ++ len = fill(zbuf, GZIP_IOBUF_SIZE); 4.1258 + 4.1259 + /* verify the gzip header */ 4.1260 + if (len < 10 || 4.1261 +@@ -113,7 +122,7 @@ 4.1262 + while (rc == Z_OK) { 4.1263 + if (strm->avail_in == 0) { 4.1264 + /* TODO: handle case where both pos and fill are set */ 4.1265 +- len = fill(zbuf, INBUF_LEN); 4.1266 ++ len = fill(zbuf, GZIP_IOBUF_SIZE); 4.1267 + if (len < 0) { 4.1268 + rc = -1; 4.1269 + error("read error"); 4.1270 + 4.1271 +--- linux-2.6.30.6/lib/decompress_unlzma.c 4.1272 ++++ linux-2.6.30.6/lib/decompress_unlzma.c 4.1273 +@@ -29,12 +29,15 @@ 4.1274 + *Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 4.1275 + */ 4.1276 + 4.1277 +-#ifndef STATIC 4.1278 ++#ifdef STATIC 4.1279 ++#define PREBOOT 4.1280 ++#else 4.1281 + #include <linux/decompress/unlzma.h> 4.1282 ++#include <linux/slab.h> 4.1283 + #endif /* STATIC */ 4.1284 + 4.1285 ++#include <linux/decompress/unlzma_mm.h> 4.1286 + #include <linux/decompress/mm.h> 4.1287 +-#include <linux/slab.h> 4.1288 + 4.1289 + #define MIN(a, b) (((a) < (b)) ? (a) : (b)) 4.1290 + 4.1291 +@@ -80,8 +83,13 @@ 4.1292 + #define RC_MODEL_TOTAL_BITS 11 4.1293 + 4.1294 + 4.1295 ++static int nofill(void *buffer, unsigned int len) 4.1296 ++{ 4.1297 ++ return -1; 4.1298 ++} 4.1299 ++ 4.1300 + /* Called twice: once at startup and once in rc_normalize() */ 4.1301 +-static void INIT rc_read(struct rc *rc) 4.1302 ++static void INIT rc_read(struct rc *rc, void(*error)(char *x)) 4.1303 + { 4.1304 + rc->buffer_size = rc->fill((char *)rc->buffer, LZMA_IOBUF_SIZE); 4.1305 + if (rc->buffer_size <= 0) 4.1306 +@@ -95,7 +103,10 @@ 4.1307 + int (*fill)(void*, unsigned int), 4.1308 + char *buffer, int buffer_size) 4.1309 + { 4.1310 +- rc->fill = fill; 4.1311 ++ if (fill) 4.1312 ++ rc->fill = fill; 4.1313 ++ else 4.1314 ++ rc->fill = nofill; 4.1315 + rc->buffer = (uint8_t *)buffer; 4.1316 + rc->buffer_size = buffer_size; 4.1317 + rc->buffer_end = rc->buffer + rc->buffer_size; 4.1318 +@@ -105,13 +116,13 @@ 4.1319 + rc->range = 0xFFFFFFFF; 4.1320 + } 4.1321 + 4.1322 +-static inline void INIT rc_init_code(struct rc *rc) 4.1323 ++static inline void INIT rc_init_code(struct rc *rc, void(*error)(char *x)) 4.1324 + { 4.1325 + int i; 4.1326 + 4.1327 + for (i = 0; i < 5; i++) { 4.1328 + if (rc->ptr >= rc->buffer_end) 4.1329 +- rc_read(rc); 4.1330 ++ rc_read(rc, error); 4.1331 + rc->code = (rc->code << 8) | *rc->ptr++; 4.1332 + } 4.1333 + } 4.1334 +@@ -124,32 +135,33 @@ 4.1335 + } 4.1336 + 4.1337 + /* Called twice, but one callsite is in inline'd rc_is_bit_0_helper() */ 4.1338 +-static void INIT rc_do_normalize(struct rc *rc) 4.1339 ++static void INIT rc_do_normalize(struct rc *rc, void(*error)(char *x)) 4.1340 + { 4.1341 + if (rc->ptr >= rc->buffer_end) 4.1342 +- rc_read(rc); 4.1343 ++ rc_read(rc, error); 4.1344 + rc->range <<= 8; 4.1345 + rc->code = (rc->code << 8) | *rc->ptr++; 4.1346 + } 4.1347 +-static inline void INIT rc_normalize(struct rc *rc) 4.1348 ++static inline void INIT rc_normalize(struct rc *rc, void(*error)(char *x)) 4.1349 + { 4.1350 + if (rc->range < (1 << RC_TOP_BITS)) 4.1351 +- rc_do_normalize(rc); 4.1352 ++ rc_do_normalize(rc, error); 4.1353 + } 4.1354 + 4.1355 + /* Called 9 times */ 4.1356 + /* Why rc_is_bit_0_helper exists? 4.1357 + *Because we want to always expose (rc->code < rc->bound) to optimizer 4.1358 + */ 4.1359 +-static inline uint32_t INIT rc_is_bit_0_helper(struct rc *rc, uint16_t *p) 4.1360 ++static inline uint32_t INIT rc_is_bit_0_helper(struct rc *rc, uint16_t *p, 4.1361 ++ void (*error)(char *x)) 4.1362 + { 4.1363 +- rc_normalize(rc); 4.1364 ++ rc_normalize(rc, error); 4.1365 + rc->bound = *p * (rc->range >> RC_MODEL_TOTAL_BITS); 4.1366 + return rc->bound; 4.1367 + } 4.1368 +-static inline int INIT rc_is_bit_0(struct rc *rc, uint16_t *p) 4.1369 ++static inline int INIT rc_is_bit_0(struct rc *rc, uint16_t *p, void(*error)(char *x)) 4.1370 + { 4.1371 +- uint32_t t = rc_is_bit_0_helper(rc, p); 4.1372 ++ uint32_t t = rc_is_bit_0_helper(rc, p, error); 4.1373 + return rc->code < t; 4.1374 + } 4.1375 + 4.1376 +@@ -167,9 +179,9 @@ 4.1377 + } 4.1378 + 4.1379 + /* Called 4 times in unlzma loop */ 4.1380 +-static int INIT rc_get_bit(struct rc *rc, uint16_t *p, int *symbol) 4.1381 ++static int INIT rc_get_bit(struct rc *rc, uint16_t *p, int *symbol, void(*error)(char *x)) 4.1382 + { 4.1383 +- if (rc_is_bit_0(rc, p)) { 4.1384 ++ if (rc_is_bit_0(rc, p, error)) { 4.1385 + rc_update_bit_0(rc, p); 4.1386 + *symbol *= 2; 4.1387 + return 0; 4.1388 +@@ -181,9 +193,9 @@ 4.1389 + } 4.1390 + 4.1391 + /* Called once */ 4.1392 +-static inline int INIT rc_direct_bit(struct rc *rc) 4.1393 ++static inline int INIT rc_direct_bit(struct rc *rc , void(*error)(char *x)) 4.1394 + { 4.1395 +- rc_normalize(rc); 4.1396 ++ rc_normalize(rc, error); 4.1397 + rc->range >>= 1; 4.1398 + if (rc->code >= rc->range) { 4.1399 + rc->code -= rc->range; 4.1400 +@@ -194,13 +206,14 @@ 4.1401 + 4.1402 + /* Called twice */ 4.1403 + static inline void INIT 4.1404 +-rc_bit_tree_decode(struct rc *rc, uint16_t *p, int num_levels, int *symbol) 4.1405 ++rc_bit_tree_decode(struct rc *rc, uint16_t *p, int num_levels, int *symbol, 4.1406 ++ void(*error)(char *x)) 4.1407 + { 4.1408 + int i = num_levels; 4.1409 + 4.1410 + *symbol = 1; 4.1411 + while (i--) 4.1412 +- rc_get_bit(rc, p + *symbol, symbol); 4.1413 ++ rc_get_bit(rc, p + *symbol, symbol, error); 4.1414 + *symbol -= 1 << num_levels; 4.1415 + } 4.1416 + 4.1417 +@@ -278,10 +291,6 @@ 4.1418 + size_t global_pos; 4.1419 + int(*flush)(void*, unsigned int); 4.1420 + struct lzma_header *header; 4.1421 +- int is_cpio_flush; 4.1422 +- uint8_t **buffer_index; 4.1423 +- int next_index; 4.1424 +- int max_index; 4.1425 + }; 4.1426 + 4.1427 + struct cstate { 4.1428 +@@ -298,14 +307,6 @@ 4.1429 + static inline uint8_t INIT peek_old_byte(struct writer *wr, 4.1430 + uint32_t offs) 4.1431 + { 4.1432 +- if (wr->is_cpio_flush) { 4.1433 +- int32_t pos; 4.1434 +- while (offs > wr->header->dict_size) 4.1435 +- offs -= wr->header->dict_size; 4.1436 +- pos = wr->buffer_pos - offs; 4.1437 +- return wr->buffer_index[pos / LZMA_IOBUF_SIZE] 4.1438 +- [pos % LZMA_IOBUF_SIZE]; 4.1439 +- } 4.1440 + if (!wr->flush) { 4.1441 + int32_t pos; 4.1442 + while (offs > wr->header->dict_size) 4.1443 +@@ -321,41 +322,8 @@ 4.1444 + 4.1445 + } 4.1446 + 4.1447 +-static inline void INIT write_byte_if_cpio(struct writer *wr, uint8_t byte) 4.1448 +-{ 4.1449 +- if (wr->buffer_pos % LZMA_IOBUF_SIZE == 0) { 4.1450 +- // if the following large_malloc fails, the initramfs 4.1451 +- // whould not be load with is_cpio_flush forced 0 too. 4.1452 +- // Remember we do not allocate historic buffer. 4.1453 +- // Let's assume it will never fail ! 4.1454 +- if (wr->next_index >= wr->max_index) { 4.1455 +- // realloc wr->buffer_index 4.1456 +- uint8_t **p = wr->buffer_index; 4.1457 +- wr->buffer_index = (uint8_t **) 4.1458 +- large_malloc(LZMA_IOBUF_SIZE + 4.1459 +- sizeof(*p) * wr->max_index); 4.1460 +- if (wr->max_index) { 4.1461 +- memcpy(wr->buffer_index, p, 4.1462 +- sizeof(*p) * wr->max_index); 4.1463 +- free(p); 4.1464 +- } 4.1465 +- wr->max_index += LZMA_IOBUF_SIZE / sizeof(*p); 4.1466 +- } 4.1467 +- wr->buffer_index[wr->next_index++] = 4.1468 +- (uint8_t *) large_malloc(LZMA_IOBUF_SIZE); 4.1469 +- } 4.1470 +- wr->buffer_index[wr->buffer_pos / LZMA_IOBUF_SIZE] 4.1471 +- [wr->buffer_pos % LZMA_IOBUF_SIZE] = 4.1472 +- wr->previous_byte = byte; 4.1473 +- wr->buffer_pos++; 4.1474 +-} 4.1475 +- 4.1476 + static inline void INIT write_byte(struct writer *wr, uint8_t byte) 4.1477 + { 4.1478 +- if (wr->is_cpio_flush) { 4.1479 +- write_byte_if_cpio(wr, byte); 4.1480 +- return; 4.1481 +- } 4.1482 + wr->buffer[wr->buffer_pos++] = wr->previous_byte = byte; 4.1483 + if (wr->flush && wr->buffer_pos == wr->header->dict_size) { 4.1484 + wr->buffer_pos = 0; 4.1485 +@@ -373,21 +341,7 @@ 4.1486 + static inline void INIT copy_bytes(struct writer *wr, 4.1487 + uint32_t rep0, int len) 4.1488 + { 4.1489 +- if (wr->is_cpio_flush) { 4.1490 +- int32_t pos; 4.1491 +- uint32_t offs = rep0; 4.1492 +- while (offs > wr->header->dict_size) 4.1493 +- offs -= wr->header->dict_size; 4.1494 +- pos = wr->buffer_pos - offs; 4.1495 +- do { 4.1496 +- write_byte_if_cpio(wr, 4.1497 +- wr->buffer_index[pos / LZMA_IOBUF_SIZE] 4.1498 +- [pos % LZMA_IOBUF_SIZE]); 4.1499 +- pos++; 4.1500 +- len--; 4.1501 +- } while (len != 0 && wr->buffer_pos < wr->header->dst_size); 4.1502 +- } 4.1503 +- else do { 4.1504 ++ do { 4.1505 + copy_byte(wr, rep0); 4.1506 + len--; 4.1507 + } while (len != 0 && wr->buffer_pos < wr->header->dst_size); 4.1508 +@@ -396,11 +350,9 @@ 4.1509 + static inline void INIT process_bit0(struct writer *wr, struct rc *rc, 4.1510 + struct cstate *cst, uint16_t *p, 4.1511 + int pos_state, uint16_t *prob, 4.1512 +- int lc, uint32_t literal_pos_mask) { 4.1513 ++ int lc, uint32_t literal_pos_mask, 4.1514 ++ void(*error)(char *x)) { 4.1515 + int mi = 1; 4.1516 +- static const int state[LZMA_NUM_STATES] = 4.1517 +- { 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5 }; 4.1518 +- 4.1519 + rc_update_bit_0(rc, prob); 4.1520 + prob = (p + LZMA_LITERAL + 4.1521 + (LZMA_LIT_SIZE 4.1522 +@@ -417,7 +369,7 @@ 4.1523 + match_byte <<= 1; 4.1524 + bit = match_byte & 0x100; 4.1525 + prob_lit = prob + 0x100 + bit + mi; 4.1526 +- if (rc_get_bit(rc, prob_lit, &mi)) { 4.1527 ++ if (rc_get_bit(rc, prob_lit, &mi, error)) { 4.1528 + if (!bit) 4.1529 + break; 4.1530 + } else { 4.1531 +@@ -428,23 +380,29 @@ 4.1532 + } 4.1533 + while (mi < 0x100) { 4.1534 + uint16_t *prob_lit = prob + mi; 4.1535 +- rc_get_bit(rc, prob_lit, &mi); 4.1536 ++ rc_get_bit(rc, prob_lit, &mi, error); 4.1537 + } 4.1538 + write_byte(wr, mi); 4.1539 +- cst->state = state[cst->state]; 4.1540 ++ if (cst->state < 4) 4.1541 ++ cst->state = 0; 4.1542 ++ else if (cst->state < 10) 4.1543 ++ cst->state -= 3; 4.1544 ++ else 4.1545 ++ cst->state -= 6; 4.1546 + } 4.1547 + 4.1548 + static inline void INIT process_bit1(struct writer *wr, struct rc *rc, 4.1549 + struct cstate *cst, uint16_t *p, 4.1550 +- int pos_state, uint16_t *prob) { 4.1551 +- int offset; 4.1552 ++ int pos_state, uint16_t *prob, 4.1553 ++ void(*error)(char *x)) { 4.1554 ++ int offset; 4.1555 + uint16_t *prob_len; 4.1556 + int num_bits; 4.1557 + int len; 4.1558 + 4.1559 + rc_update_bit_1(rc, prob); 4.1560 + prob = p + LZMA_IS_REP + cst->state; 4.1561 +- if (rc_is_bit_0(rc, prob)) { 4.1562 ++ if (rc_is_bit_0(rc, prob, error)) { 4.1563 + rc_update_bit_0(rc, prob); 4.1564 + cst->rep3 = cst->rep2; 4.1565 + cst->rep2 = cst->rep1; 4.1566 +@@ -453,14 +411,14 @@ 4.1567 + prob = p + LZMA_LEN_CODER; 4.1568 + } else { 4.1569 + rc_update_bit_1(rc, prob); 4.1570 +- prob += LZMA_IS_REP_G0 - LZMA_IS_REP; 4.1571 +- if (rc_is_bit_0(rc, prob)) { 4.1572 ++ prob = p + LZMA_IS_REP_G0 + cst->state; 4.1573 ++ if (rc_is_bit_0(rc, prob, error)) { 4.1574 + rc_update_bit_0(rc, prob); 4.1575 + prob = (p + LZMA_IS_REP_0_LONG 4.1576 + + (cst->state << 4.1577 + LZMA_NUM_POS_BITS_MAX) + 4.1578 + pos_state); 4.1579 +- if (rc_is_bit_0(rc, prob)) { 4.1580 ++ if (rc_is_bit_0(rc, prob, error)) { 4.1581 + rc_update_bit_0(rc, prob); 4.1582 + 4.1583 + cst->state = cst->state < LZMA_NUM_LIT_STATES ? 4.1584 +@@ -474,14 +432,14 @@ 4.1585 + uint32_t distance; 4.1586 + 4.1587 + rc_update_bit_1(rc, prob); 4.1588 +- prob += LZMA_IS_REP_G1 - LZMA_IS_REP_G0; 4.1589 +- if (rc_is_bit_0(rc, prob)) { 4.1590 ++ prob = p + LZMA_IS_REP_G1 + cst->state; 4.1591 ++ if (rc_is_bit_0(rc, prob, error)) { 4.1592 + rc_update_bit_0(rc, prob); 4.1593 + distance = cst->rep1; 4.1594 + } else { 4.1595 + rc_update_bit_1(rc, prob); 4.1596 +- prob += LZMA_IS_REP_G2 - LZMA_IS_REP_G1; 4.1597 +- if (rc_is_bit_0(rc, prob)) { 4.1598 ++ prob = p + LZMA_IS_REP_G2 + cst->state; 4.1599 ++ if (rc_is_bit_0(rc, prob, error)) { 4.1600 + rc_update_bit_0(rc, prob); 4.1601 + distance = cst->rep2; 4.1602 + } else { 4.1603 +@@ -499,33 +457,33 @@ 4.1604 + } 4.1605 + 4.1606 + prob_len = prob + LZMA_LEN_CHOICE; 4.1607 +- if (rc_is_bit_0(rc, prob_len)) { 4.1608 ++ if (rc_is_bit_0(rc, prob_len, error)) { 4.1609 + rc_update_bit_0(rc, prob_len); 4.1610 +- prob_len += LZMA_LEN_LOW - LZMA_LEN_CHOICE 4.1611 ++ prob_len = (prob + LZMA_LEN_LOW 4.1612 + + (pos_state << 4.1613 +- LZMA_LEN_NUM_LOW_BITS); 4.1614 ++ LZMA_LEN_NUM_LOW_BITS)); 4.1615 + offset = 0; 4.1616 + num_bits = LZMA_LEN_NUM_LOW_BITS; 4.1617 + } else { 4.1618 + rc_update_bit_1(rc, prob_len); 4.1619 +- prob_len += LZMA_LEN_CHOICE_2 - LZMA_LEN_CHOICE; 4.1620 +- if (rc_is_bit_0(rc, prob_len)) { 4.1621 ++ prob_len = prob + LZMA_LEN_CHOICE_2; 4.1622 ++ if (rc_is_bit_0(rc, prob_len, error)) { 4.1623 + rc_update_bit_0(rc, prob_len); 4.1624 +- prob_len += LZMA_LEN_MID - LZMA_LEN_CHOICE_2 4.1625 ++ prob_len = (prob + LZMA_LEN_MID 4.1626 + + (pos_state << 4.1627 +- LZMA_LEN_NUM_MID_BITS); 4.1628 ++ LZMA_LEN_NUM_MID_BITS)); 4.1629 + offset = 1 << LZMA_LEN_NUM_LOW_BITS; 4.1630 + num_bits = LZMA_LEN_NUM_MID_BITS; 4.1631 + } else { 4.1632 + rc_update_bit_1(rc, prob_len); 4.1633 +- prob_len += LZMA_LEN_HIGH - LZMA_LEN_CHOICE_2; 4.1634 ++ prob_len = prob + LZMA_LEN_HIGH; 4.1635 + offset = ((1 << LZMA_LEN_NUM_LOW_BITS) 4.1636 + + (1 << LZMA_LEN_NUM_MID_BITS)); 4.1637 + num_bits = LZMA_LEN_NUM_HIGH_BITS; 4.1638 + } 4.1639 + } 4.1640 + 4.1641 +- rc_bit_tree_decode(rc, prob_len, num_bits, &len); 4.1642 ++ rc_bit_tree_decode(rc, prob_len, num_bits, &len, error); 4.1643 + len += offset; 4.1644 + 4.1645 + if (cst->state < 4) { 4.1646 +@@ -540,7 +498,7 @@ 4.1647 + << LZMA_NUM_POS_SLOT_BITS); 4.1648 + rc_bit_tree_decode(rc, prob, 4.1649 + LZMA_NUM_POS_SLOT_BITS, 4.1650 +- &pos_slot); 4.1651 ++ &pos_slot, error); 4.1652 + if (pos_slot >= LZMA_START_POS_MODEL_INDEX) { 4.1653 + int i, mi; 4.1654 + num_bits = (pos_slot >> 1) - 1; 4.1655 +@@ -553,7 +511,7 @@ 4.1656 + num_bits -= LZMA_NUM_ALIGN_BITS; 4.1657 + while (num_bits--) 4.1658 + cst->rep0 = (cst->rep0 << 1) | 4.1659 +- rc_direct_bit(rc); 4.1660 ++ rc_direct_bit(rc, error); 4.1661 + prob = p + LZMA_ALIGN; 4.1662 + cst->rep0 <<= LZMA_NUM_ALIGN_BITS; 4.1663 + num_bits = LZMA_NUM_ALIGN_BITS; 4.1664 +@@ -561,7 +519,7 @@ 4.1665 + i = 1; 4.1666 + mi = 1; 4.1667 + while (num_bits--) { 4.1668 +- if (rc_get_bit(rc, prob + mi, &mi)) 4.1669 ++ if (rc_get_bit(rc, prob + mi, &mi, error)) 4.1670 + cst->rep0 |= i; 4.1671 + i <<= 1; 4.1672 + } 4.1673 +@@ -578,15 +536,14 @@ 4.1674 + 4.1675 + 4.1676 + 4.1677 +-STATIC inline int INIT unlzma(unsigned char *buf, int in_len, 4.1678 ++STATIC int INIT unlzma(unsigned char *buf, int in_len, 4.1679 + int(*fill)(void*, unsigned int), 4.1680 + int(*flush)(void*, unsigned int), 4.1681 + unsigned char *output, 4.1682 + int *posp, 4.1683 +- void(*error_fn)(char *x) 4.1684 ++ void(*error)(char *x) 4.1685 + ) 4.1686 + { 4.1687 +- extern int cpio_flush_buffer(void*, unsigned int); 4.1688 + struct lzma_header header; 4.1689 + int lc, pb, lp; 4.1690 + uint32_t pos_state_mask; 4.1691 +@@ -600,10 +557,6 @@ 4.1692 + unsigned char *inbuf; 4.1693 + int ret = -1; 4.1694 + 4.1695 +- set_error_fn(error_fn); 4.1696 +- if (!flush) 4.1697 +- in_len -= 4; /* Uncompressed size hack active in pre-boot 4.1698 +- environment */ 4.1699 + if (buf) 4.1700 + inbuf = buf; 4.1701 + else 4.1702 +@@ -621,16 +574,12 @@ 4.1703 + wr.global_pos = 0; 4.1704 + wr.previous_byte = 0; 4.1705 + wr.buffer_pos = 0; 4.1706 +- wr.is_cpio_flush = 0; 4.1707 +- if (flush == cpio_flush_buffer) 4.1708 +- wr.is_cpio_flush = 1; 4.1709 +- wr.buffer_index = NULL; 4.1710 + 4.1711 + rc_init(&rc, fill, inbuf, in_len); 4.1712 + 4.1713 + for (i = 0; i < sizeof(header); i++) { 4.1714 + if (rc.ptr >= rc.buffer_end) 4.1715 +- rc_read(&rc); 4.1716 ++ rc_read(&rc, error); 4.1717 + ((unsigned char *)&header)[i] = *rc.ptr++; 4.1718 + } 4.1719 + 4.1720 +@@ -658,34 +607,34 @@ 4.1721 + if (header.dict_size == 0) 4.1722 + header.dict_size = 1; 4.1723 + 4.1724 +- if (output || wr.is_cpio_flush) 4.1725 ++ if (output) 4.1726 + wr.buffer = output; 4.1727 + else { 4.1728 + wr.bufsize = MIN(header.dst_size, header.dict_size); 4.1729 + wr.buffer = large_malloc(wr.bufsize); 4.1730 + } 4.1731 +- if (wr.buffer == NULL && !wr.is_cpio_flush) 4.1732 ++ if (wr.buffer == NULL) 4.1733 + goto exit_1; 4.1734 + 4.1735 + num_probs = LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp)); 4.1736 + p = (uint16_t *) large_malloc(num_probs * sizeof(*p)); 4.1737 + if (p == 0) 4.1738 + goto exit_2; 4.1739 +- num_probs += LZMA_LITERAL - LZMA_BASE_SIZE; 4.1740 ++ num_probs = LZMA_LITERAL + (LZMA_LIT_SIZE << (lc + lp)); 4.1741 + for (i = 0; i < num_probs; i++) 4.1742 + p[i] = (1 << RC_MODEL_TOTAL_BITS) >> 1; 4.1743 +- wr.max_index = wr.next_index = 0; 4.1744 +- rc_init_code(&rc); 4.1745 + 4.1746 ++ rc_init_code(&rc, error); 4.1747 ++ 4.1748 + while (get_pos(&wr) < header.dst_size) { 4.1749 + int pos_state = get_pos(&wr) & pos_state_mask; 4.1750 + uint16_t *prob = p + LZMA_IS_MATCH + 4.1751 + (cst.state << LZMA_NUM_POS_BITS_MAX) + pos_state; 4.1752 +- if (rc_is_bit_0(&rc, prob)) 4.1753 ++ if (rc_is_bit_0(&rc, prob, error)) 4.1754 + process_bit0(&wr, &rc, &cst, p, pos_state, prob, 4.1755 +- lc, literal_pos_mask); 4.1756 ++ lc, literal_pos_mask, error); 4.1757 + else { 4.1758 +- process_bit1(&wr, &rc, &cst, p, pos_state, prob); 4.1759 ++ process_bit1(&wr, &rc, &cst, p, pos_state, prob, error); 4.1760 + if (cst.rep0 == 0) 4.1761 + break; 4.1762 + } 4.1763 +@@ -693,25 +642,12 @@ 4.1764 + 4.1765 + if (posp) 4.1766 + *posp = rc.ptr-rc.buffer; 4.1767 +- if (wr.is_cpio_flush) { 4.1768 +- int i; 4.1769 +- for (i = 0; i < wr.next_index -1; i++) { 4.1770 +- wr.flush(wr.buffer_index[i], LZMA_IOBUF_SIZE); 4.1771 +- large_free(wr.buffer_index[i]); 4.1772 +- } 4.1773 +- if (i < wr.next_index) { 4.1774 +- wr.flush(wr.buffer_index[i], 4.1775 +- wr.buffer_pos % LZMA_IOBUF_SIZE); 4.1776 +- large_free(wr.buffer_index[i]); 4.1777 +- } 4.1778 +- large_free(wr.buffer_index); 4.1779 +- } 4.1780 +- else if (wr.flush) 4.1781 ++ if (wr.flush) 4.1782 + wr.flush(wr.buffer, wr.buffer_pos); 4.1783 + ret = 0; 4.1784 + large_free(p); 4.1785 + exit_2: 4.1786 +- if (!output && !wr.is_cpio_flush) 4.1787 ++ if (!output) 4.1788 + large_free(wr.buffer); 4.1789 + exit_1: 4.1790 + if (!buf) 4.1791 +@@ -719,5 +655,19 @@ 4.1792 + exit_0: 4.1793 + return ret; 4.1794 + } 4.1795 ++#if defined(CONFIG_DECOMPRESS_LZMA_NEEDED) && !defined(PREBOOT) 4.1796 ++EXPORT_SYMBOL(unlzma); 4.1797 ++#endif 4.1798 + 4.1799 +-#define decompress unlzma 4.1800 ++#ifdef PREBOOT 4.1801 ++STATIC int INIT decompress(unsigned char *buf, int in_len, 4.1802 ++ int(*fill)(void*, unsigned int), 4.1803 ++ int(*flush)(void*, unsigned int), 4.1804 ++ unsigned char *output, 4.1805 ++ int *posp, 4.1806 ++ void(*error_fn)(char *x) 4.1807 ++ ) 4.1808 ++{ 4.1809 ++ return unlzma(buf, in_len - 4, fill, flush, output, posp, error_fn); 4.1810 ++} 4.1811 ++#endif
5.1 --- a/tazndis/receipt Sat Jan 02 14:50:04 2010 +0100 5.2 +++ b/tazndis/receipt Sun Jan 03 17:41:36 2010 +0100 5.3 @@ -6,7 +6,6 @@ 5.4 SHORT_DESC="ndiswrapper replacement for SliTaz with a GUI" 5.5 MAINTAINER="erjo@slitaz.org" 5.6 DEPENDS="perl-core wireless_tools ndiswrapper-driver" 5.7 -TARBALL="$PACKAGE-$VERSION.tar.gz" 5.8 WEB_SITE="http://www.slitaz.org" 5.9 5.10 # Rules to gen a SliTaz package suitable for Tazpkg.
6.1 --- a/xfce4/receipt Sat Jan 02 14:50:04 2010 +0100 6.2 +++ b/xfce4/receipt Sun Jan 03 17:41:36 2010 +0100 6.3 @@ -8,7 +8,6 @@ 6.4 DEPENDS="libxfce4util xfconf libxfcegui4 libxfce4menu libexo 6.5 xfce4-panel thunar xfce4-settings xfce4-session xfwm4 xfdesktop thunar-volman 6.6 thunar-archive-plugin xfce-utils xfce4-slitaz-config" 6.7 -TARBALL="$PACKAGE-$VERSION.tar.gz" 6.8 WEB_SITE="http://www.xfce.org" 6.9 6.10 # Rules to gen a SliTaz package suitable for Tazpkg.