wok-current diff linux-libre/stuff/linux-squashfs-lzma-2.6.34.u @ rev 20045
Improvements
author | Leonardo Laporte <hackdorte@yandex.com> |
---|---|
date | Thu Aug 31 04:02:39 2017 -0300 (2017-08-31) |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/linux-libre/stuff/linux-squashfs-lzma-2.6.34.u Thu Aug 31 04:02:39 2017 -0300 1.3 @@ -0,0 +1,649 @@ 1.4 +--- linux-2.6.30.6/include/linux/decompress/bunzip2_mm.h 1.5 ++++ linux-2.6.30.6/include/linux/decompress/bunzip2_mm.h 1.6 +@@ -0,0 +1,13 @@ 1.7 ++#ifndef BUNZIP2_MM_H 1.8 ++#define BUNZIP2_MM_H 1.9 ++ 1.10 ++#ifdef STATIC 1.11 ++/* Code active when included from pre-boot environment: */ 1.12 ++#define INIT 1.13 ++#else 1.14 ++/* Compile for initramfs/initrd code only */ 1.15 ++#define INIT __init 1.16 ++static void(*error)(char *m); 1.17 ++#endif 1.18 ++ 1.19 ++#endif 1.20 + 1.21 +--- linux-2.6.30.6/include/linux/decompress/inflate_mm.h 1.22 ++++ linux-2.6.30.6/include/linux/decompress/inflate_mm.h 1.23 +@@ -0,0 +1,13 @@ 1.24 ++#ifndef INFLATE_MM_H 1.25 ++#define INFLATE_MM_H 1.26 ++ 1.27 ++#ifdef STATIC 1.28 ++/* Code active when included from pre-boot environment: */ 1.29 ++#define INIT 1.30 ++#else 1.31 ++/* Compile for initramfs/initrd code only */ 1.32 ++#define INIT __init 1.33 ++static void(*error)(char *m); 1.34 ++#endif 1.35 ++ 1.36 ++#endif 1.37 + 1.38 +#--- linux-2.6.30.6/include/linux/decompress/mm.h 1.39 +#+++ linux-2.6.30.6/include/linux/decompress/mm.h 1.40 +@@ -63,8 +63,6 @@ 1.41 + 1.42 + #define set_error_fn(x) 1.43 + 1.44 +-#define INIT 1.45 +- 1.46 + #else /* STATIC */ 1.47 + 1.48 + /* Code active when compiled standalone for use when loading ramdisk: */ 1.49 +@@ -84,10 +82,8 @@ 1.50 + #define large_malloc(a) vmalloc(a) 1.51 + #define large_free(a) vfree(a) 1.52 + 1.53 +-static void(*error)(char *m); 1.54 + #define set_error_fn(x) error = x; 1.55 + 1.56 +-#define INIT __init 1.57 + #define STATIC 1.58 + 1.59 + #include <linux/init.h> 1.60 + 1.61 +--- linux-2.6.30.6/include/linux/decompress/unlzma_mm.h 1.62 ++++ linux-2.6.30.6/include/linux/decompress/unlzma_mm.h 1.63 +@@ -0,0 +1,20 @@ 1.64 ++#ifndef UNLZMA_MM_H 1.65 ++#define UNLZMA_MM_H 1.66 ++ 1.67 ++#ifdef STATIC 1.68 ++ 1.69 ++/* Code active when included from pre-boot environment: */ 1.70 ++#define INIT 1.71 ++ 1.72 ++#elif defined(CONFIG_DECOMPRESS_LZMA_NEEDED) 1.73 ++ 1.74 ++/* Make it available to non initramfs/initrd code */ 1.75 ++#define INIT 1.76 ++#include <linux/module.h> 1.77 ++#else 1.78 ++ 1.79 ++/* Compile for initramfs/initrd code only */ 1.80 ++#define INIT __init 1.81 ++#endif 1.82 ++ 1.83 ++#endif 1.84 + 1.85 +--- linux-2.6.30.6/lib/Kconfig 1.86 ++++ linux-2.6.30.6/lib/Kconfig 1.87 +@@ -117,6 +117,9 @@ 1.88 + config DECOMPRESS_LZMA 1.89 + tristate 1.90 + 1.91 ++config DECOMPRESS_LZMA_NEEDED 1.92 ++ boolean 1.93 ++ 1.94 + config DECOMPRESS_LZO 1.95 + select LZO_DECOMPRESS 1.96 + tristate 1.97 + 1.98 +--- linux-2.6.30.6/lib/decompress_bunzip2.c 1.99 ++++ linux-2.6.30.6/lib/decompress_bunzip2.c 1.100 +@@ -52,6 +52,7 @@ 1.101 + #include <linux/slab.h> 1.102 + #endif /* STATIC */ 1.103 + 1.104 ++#include <linux/decompress/bunzip2_mm.h> 1.105 + #include <linux/decompress/mm.h> 1.106 + 1.107 + #ifndef INT_MAX 1.108 + 1.109 +--- linux-2.6.30.6/lib/decompress_inflate.c 1.110 ++++ linux-2.6.30.6/lib/decompress_inflate.c 1.111 +@@ -23,6 +23,7 @@ 1.112 + 1.113 + #endif /* STATIC */ 1.114 + 1.115 ++#include <linux/decompress/inflate_mm.h> 1.116 + #include <linux/decompress/mm.h> 1.117 + 1.118 + #define GZIP_IOBUF_SIZE (16*1024) 1.119 + 1.120 +--- linux-2.6.30.6/lib/decompress_unlzma.c 1.121 ++++ linux-2.6.30.6/lib/decompress_unlzma.c 1.122 +@@ -36,6 +36,7 @@ 1.123 + #include <linux/slab.h> 1.124 + #endif /* STATIC */ 1.125 + 1.126 ++#include <linux/decompress/unlzma_mm.h> 1.127 + #include <linux/decompress/mm.h> 1.128 + 1.129 + #define MIN(a, b) (((a) < (b)) ? (a) : (b)) 1.130 +@@ -88,7 +89,7 @@ 1.131 + } 1.132 + 1.133 + /* Called twice: once at startup and once in rc_normalize() */ 1.134 +-static void INIT rc_read(struct rc *rc) 1.135 ++static void INIT rc_read(struct rc *rc, void(*error)(char *x)) 1.136 + { 1.137 + rc->buffer_size = rc->fill((char *)rc->buffer, LZMA_IOBUF_SIZE); 1.138 + if (rc->buffer_size <= 0) 1.139 +@@ -115,13 +116,13 @@ 1.140 + rc->range = 0xFFFFFFFF; 1.141 + } 1.142 + 1.143 +-static inline void INIT rc_init_code(struct rc *rc) 1.144 ++static inline void INIT rc_init_code(struct rc *rc, void(*error)(char *x)) 1.145 + { 1.146 + int i; 1.147 + 1.148 + for (i = 0; i < 5; i++) { 1.149 + if (rc->ptr >= rc->buffer_end) 1.150 +- rc_read(rc); 1.151 ++ rc_read(rc, error); 1.152 + rc->code = (rc->code << 8) | *rc->ptr++; 1.153 + } 1.154 + } 1.155 +@@ -134,32 +135,33 @@ 1.156 + } 1.157 + 1.158 + /* Called twice, but one callsite is in inline'd rc_is_bit_0_helper() */ 1.159 +-static void INIT rc_do_normalize(struct rc *rc) 1.160 ++static void INIT rc_do_normalize(struct rc *rc, void(*error)(char *x)) 1.161 + { 1.162 + if (rc->ptr >= rc->buffer_end) 1.163 +- rc_read(rc); 1.164 ++ rc_read(rc, error); 1.165 + rc->range <<= 8; 1.166 + rc->code = (rc->code << 8) | *rc->ptr++; 1.167 + } 1.168 +-static inline void INIT rc_normalize(struct rc *rc) 1.169 ++static inline void INIT rc_normalize(struct rc *rc, void(*error)(char *x)) 1.170 + { 1.171 + if (rc->range < (1 << RC_TOP_BITS)) 1.172 +- rc_do_normalize(rc); 1.173 ++ rc_do_normalize(rc, error); 1.174 + } 1.175 + 1.176 + /* Called 9 times */ 1.177 + /* Why rc_is_bit_0_helper exists? 1.178 + *Because we want to always expose (rc->code < rc->bound) to optimizer 1.179 + */ 1.180 +-static inline uint32_t INIT rc_is_bit_0_helper(struct rc *rc, uint16_t *p) 1.181 ++static inline uint32_t INIT rc_is_bit_0_helper(struct rc *rc, uint16_t *p, 1.182 ++ void (*error)(char *x)) 1.183 + { 1.184 +- rc_normalize(rc); 1.185 ++ rc_normalize(rc, error); 1.186 + rc->bound = *p * (rc->range >> RC_MODEL_TOTAL_BITS); 1.187 + return rc->bound; 1.188 + } 1.189 +-static inline int INIT rc_is_bit_0(struct rc *rc, uint16_t *p) 1.190 ++static inline int INIT rc_is_bit_0(struct rc *rc, uint16_t *p, void(*error)(char *x)) 1.191 + { 1.192 +- uint32_t t = rc_is_bit_0_helper(rc, p); 1.193 ++ uint32_t t = rc_is_bit_0_helper(rc, p, error); 1.194 + return rc->code < t; 1.195 + } 1.196 + 1.197 +@@ -177,9 +179,9 @@ 1.198 + } 1.199 + 1.200 + /* Called 4 times in unlzma loop */ 1.201 +-static int INIT rc_get_bit(struct rc *rc, uint16_t *p, int *symbol) 1.202 ++static int INIT rc_get_bit(struct rc *rc, uint16_t *p, int *symbol, void(*error)(char *x)) 1.203 + { 1.204 +- if (rc_is_bit_0(rc, p)) { 1.205 ++ if (rc_is_bit_0(rc, p, error)) { 1.206 + rc_update_bit_0(rc, p); 1.207 + *symbol *= 2; 1.208 + return 0; 1.209 +@@ -191,9 +193,9 @@ 1.210 + } 1.211 + 1.212 + /* Called once */ 1.213 +-static inline int INIT rc_direct_bit(struct rc *rc) 1.214 ++static inline int INIT rc_direct_bit(struct rc *rc , void(*error)(char *x)) 1.215 + { 1.216 +- rc_normalize(rc); 1.217 ++ rc_normalize(rc, error); 1.218 + rc->range >>= 1; 1.219 + if (rc->code >= rc->range) { 1.220 + rc->code -= rc->range; 1.221 +@@ -204,13 +206,14 @@ 1.222 + 1.223 + /* Called twice */ 1.224 + static inline void INIT 1.225 +-rc_bit_tree_decode(struct rc *rc, uint16_t *p, int num_levels, int *symbol) 1.226 ++rc_bit_tree_decode(struct rc *rc, uint16_t *p, int num_levels, int *symbol, 1.227 ++ void(*error)(char *x)) 1.228 + { 1.229 + int i = num_levels; 1.230 + 1.231 + *symbol = 1; 1.232 + while (i--) 1.233 +- rc_get_bit(rc, p + *symbol, symbol); 1.234 ++ rc_get_bit(rc, p + *symbol, symbol, error); 1.235 + *symbol -= 1 << num_levels; 1.236 + } 1.237 + 1.238 +@@ -406,7 +409,8 @@ 1.239 + static inline void INIT process_bit0(struct writer *wr, struct rc *rc, 1.240 + struct cstate *cst, uint16_t *p, 1.241 + int pos_state, uint16_t *prob, 1.242 +- int lc, uint32_t literal_pos_mask) { 1.243 ++ int lc, uint32_t literal_pos_mask, 1.244 ++ void(*error)(char *x)) { 1.245 + int mi = 1; 1.246 + static const int state[LZMA_NUM_STATES] = 1.247 + { 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5 }; 1.248 +@@ -427,7 +431,7 @@ 1.249 + match_byte <<= 1; 1.250 + bit = match_byte & 0x100; 1.251 + prob_lit = prob + 0x100 + bit + mi; 1.252 +- if (rc_get_bit(rc, prob_lit, &mi)) { 1.253 ++ if (rc_get_bit(rc, prob_lit, &mi, error)) { 1.254 + if (!bit) 1.255 + break; 1.256 + } else { 1.257 +@@ -438,7 +442,7 @@ 1.258 + } 1.259 + while (mi < 0x100) { 1.260 + uint16_t *prob_lit = prob + mi; 1.261 +- rc_get_bit(rc, prob_lit, &mi); 1.262 ++ rc_get_bit(rc, prob_lit, &mi, error); 1.263 + } 1.264 + write_byte(wr, mi); 1.265 + cst->state = state[cst->state]; 1.266 +@@ -446,7 +453,8 @@ 1.267 + 1.268 + static inline void INIT process_bit1(struct writer *wr, struct rc *rc, 1.269 + struct cstate *cst, uint16_t *p, 1.270 +- int pos_state, uint16_t *prob) { 1.271 ++ int pos_state, uint16_t *prob, 1.272 ++ void(*error)(char *x)) { 1.273 + int offset; 1.274 + uint16_t *prob_len; 1.275 + int num_bits; 1.276 +@@ -454,7 +459,7 @@ 1.277 + 1.278 + rc_update_bit_1(rc, prob); 1.279 + prob = p + LZMA_IS_REP + cst->state; 1.280 +- if (rc_is_bit_0(rc, prob)) { 1.281 ++ if (rc_is_bit_0(rc, prob, error)) { 1.282 + rc_update_bit_0(rc, prob); 1.283 + cst->rep3 = cst->rep2; 1.284 + cst->rep2 = cst->rep1; 1.285 +@@ -464,13 +469,13 @@ 1.286 + } else { 1.287 + rc_update_bit_1(rc, prob); 1.288 + prob += LZMA_IS_REP_G0 - LZMA_IS_REP; 1.289 +- if (rc_is_bit_0(rc, prob)) { 1.290 ++ if (rc_is_bit_0(rc, prob, error)) { 1.291 + rc_update_bit_0(rc, prob); 1.292 + prob = (p + LZMA_IS_REP_0_LONG 1.293 + + (cst->state << 1.294 + LZMA_NUM_POS_BITS_MAX) + 1.295 + pos_state); 1.296 +- if (rc_is_bit_0(rc, prob)) { 1.297 ++ if (rc_is_bit_0(rc, prob, error)) { 1.298 + rc_update_bit_0(rc, prob); 1.299 + 1.300 + cst->state = cst->state < LZMA_NUM_LIT_STATES ? 1.301 +@@ -485,13 +490,13 @@ 1.302 + 1.303 + rc_update_bit_1(rc, prob); 1.304 + prob += LZMA_IS_REP_G1 - LZMA_IS_REP_G0; 1.305 +- if (rc_is_bit_0(rc, prob)) { 1.306 ++ if (rc_is_bit_0(rc, prob, error)) { 1.307 + rc_update_bit_0(rc, prob); 1.308 + distance = cst->rep1; 1.309 + } else { 1.310 + rc_update_bit_1(rc, prob); 1.311 + prob += LZMA_IS_REP_G2 - LZMA_IS_REP_G1; 1.312 +- if (rc_is_bit_0(rc, prob)) { 1.313 ++ if (rc_is_bit_0(rc, prob, error)) { 1.314 + rc_update_bit_0(rc, prob); 1.315 + distance = cst->rep2; 1.316 + } else { 1.317 +@@ -509,7 +514,7 @@ 1.318 + } 1.319 + 1.320 + prob_len = prob + LZMA_LEN_CHOICE; 1.321 +- if (rc_is_bit_0(rc, prob_len)) { 1.322 ++ if (rc_is_bit_0(rc, prob_len, error)) { 1.323 + rc_update_bit_0(rc, prob_len); 1.324 + prob_len += LZMA_LEN_LOW - LZMA_LEN_CHOICE 1.325 + + (pos_state << 1.326 +@@ -519,7 +524,7 @@ 1.327 + } else { 1.328 + rc_update_bit_1(rc, prob_len); 1.329 + prob_len += LZMA_LEN_CHOICE_2 - LZMA_LEN_CHOICE; 1.330 +- if (rc_is_bit_0(rc, prob_len)) { 1.331 ++ if (rc_is_bit_0(rc, prob_len, error)) { 1.332 + rc_update_bit_0(rc, prob_len); 1.333 + prob_len += LZMA_LEN_MID - LZMA_LEN_CHOICE_2 1.334 + + (pos_state << 1.335 +@@ -535,7 +540,7 @@ 1.336 + } 1.337 + } 1.338 + 1.339 +- rc_bit_tree_decode(rc, prob_len, num_bits, &len); 1.340 ++ rc_bit_tree_decode(rc, prob_len, num_bits, &len, error); 1.341 + len += offset; 1.342 + 1.343 + if (cst->state < 4) { 1.344 +@@ -550,7 +555,7 @@ 1.345 + << LZMA_NUM_POS_SLOT_BITS); 1.346 + rc_bit_tree_decode(rc, prob, 1.347 + LZMA_NUM_POS_SLOT_BITS, 1.348 +- &pos_slot); 1.349 ++ &pos_slot, error); 1.350 + if (pos_slot >= LZMA_START_POS_MODEL_INDEX) { 1.351 + int i, mi; 1.352 + num_bits = (pos_slot >> 1) - 1; 1.353 +@@ -563,7 +568,7 @@ 1.354 + num_bits -= LZMA_NUM_ALIGN_BITS; 1.355 + while (num_bits--) 1.356 + cst->rep0 = (cst->rep0 << 1) | 1.357 +- rc_direct_bit(rc); 1.358 ++ rc_direct_bit(rc, error); 1.359 + prob = p + LZMA_ALIGN; 1.360 + cst->rep0 <<= LZMA_NUM_ALIGN_BITS; 1.361 + num_bits = LZMA_NUM_ALIGN_BITS; 1.362 +@@ -571,7 +576,7 @@ 1.363 + i = 1; 1.364 + mi = 1; 1.365 + while (num_bits--) { 1.366 +- if (rc_get_bit(rc, prob + mi, &mi)) 1.367 ++ if (rc_get_bit(rc, prob + mi, &mi, error)) 1.368 + cst->rep0 |= i; 1.369 + i <<= 1; 1.370 + } 1.371 +@@ -588,12 +593,12 @@ 1.372 + 1.373 + 1.374 + 1.375 +-STATIC inline int INIT unlzma(unsigned char *buf, int in_len, 1.376 ++STATIC int INIT unlzma(unsigned char *buf, int in_len, 1.377 + int(*fill)(void*, unsigned int), 1.378 + int(*flush)(void*, unsigned int), 1.379 + unsigned char *output, 1.380 + int *posp, 1.381 +- void(*error_fn)(char *x) 1.382 ++ void(*error)(char *x) 1.383 + ) 1.384 + { 1.385 + extern int cpio_flush_buffer(void*, unsigned int); 1.386 +@@ -610,7 +615,6 @@ 1.387 + unsigned char *inbuf; 1.388 + int ret = -1; 1.389 + 1.390 +- set_error_fn(error_fn); 1.391 + 1.392 + if (buf) 1.393 + inbuf = buf; 1.394 +@@ -638,7 +642,7 @@ 1.395 + 1.396 + for (i = 0; i < sizeof(header); i++) { 1.397 + if (rc.ptr >= rc.buffer_end) 1.398 +- rc_read(&rc); 1.399 ++ rc_read(&rc, error); 1.400 + ((unsigned char *)&header)[i] = *rc.ptr++; 1.401 + } 1.402 + 1.403 +@@ -683,17 +687,17 @@ 1.404 + for (i = 0; i < num_probs; i++) 1.405 + p[i] = (1 << RC_MODEL_TOTAL_BITS) >> 1; 1.406 + wr.max_index = wr.next_index = 0; 1.407 +- rc_init_code(&rc); 1.408 ++ rc_init_code(&rc, error); 1.409 + 1.410 + while (get_pos(&wr) < header.dst_size) { 1.411 + int pos_state = get_pos(&wr) & pos_state_mask; 1.412 + uint16_t *prob = p + LZMA_IS_MATCH + 1.413 + (cst.state << LZMA_NUM_POS_BITS_MAX) + pos_state; 1.414 +- if (rc_is_bit_0(&rc, prob)) 1.415 ++ if (rc_is_bit_0(&rc, prob, error)) 1.416 + process_bit0(&wr, &rc, &cst, p, pos_state, prob, 1.417 +- lc, literal_pos_mask); 1.418 ++ lc, literal_pos_mask, error); 1.419 + else { 1.420 +- process_bit1(&wr, &rc, &cst, p, pos_state, prob); 1.421 ++ process_bit1(&wr, &rc, &cst, p, pos_state, prob, error); 1.422 + if (cst.rep0 == 0) 1.423 + break; 1.424 + } 1.425 +@@ -727,6 +731,9 @@ 1.426 + exit_0: 1.427 + return ret; 1.428 + } 1.429 ++#if defined(CONFIG_DECOMPRESS_LZMA_NEEDED) && !defined(PREBOOT) 1.430 ++EXPORT_SYMBOL(unlzma); 1.431 ++#endif 1.432 + 1.433 + #ifdef PREBOOT 1.434 + STATIC int INIT decompress(unsigned char *buf, int in_len, 1.435 + 1.436 +--- linux-2.6.34/fs/squashfs/Kconfig 1.437 ++++ linux-2.6.34/fs/squashfs/Kconfig 1.438 +@@ -26,6 +26,12 @@ 1.439 + 1.440 + If unsure, say N. 1.441 + 1.442 ++config SQUASHFS_LZMA 1.443 ++ bool "Include support for LZMA compressed file systems" 1.444 ++ depends on SQUASHFS 1.445 ++ select DECOMPRESS_LZMA 1.446 ++ select DECOMPRESS_LZMA_NEEDED 1.447 ++ 1.448 + config SQUASHFS_EMBEDDED 1.449 + 1.450 + bool "Additional option for memory-constrained systems" 1.451 + 1.452 +--- linux-2.6.34/fs/squashfs/Makefile 1.453 ++++ linux-2.6.34/fs/squashfs/Makefile 1.454 +@@ -5,3 +5,4 @@ 1.455 + obj-$(CONFIG_SQUASHFS) += squashfs.o 1.456 + squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o 1.457 + squashfs-y += namei.o super.o symlink.o zlib_wrapper.o decompressor.o 1.458 ++squashfs-$(CONFIG_SQUASHFS_LZMA) += lzma_wrapper.o 1.459 + 1.460 +--- linux-2.6.34/fs/squashfs/decompressor.c 1.461 ++++ linux-2.6.34/fs/squashfs/decompressor.c 1.462 +@@ -50,7 +50,11 @@ 1.463 + 1.464 + static const struct squashfs_decompressor *decompressor[] = { 1.465 + &squashfs_zlib_comp_ops, 1.466 ++#ifdef CONFIG_SQUASHFS_LZMA 1.467 ++ &squashfs_lzma_comp_ops, 1.468 ++#else 1.469 + &squashfs_lzma_unsupported_comp_ops, 1.470 ++#endif 1.471 + &squashfs_lzo_unsupported_comp_ops, 1.472 + &squashfs_unknown_comp_ops 1.473 + }; 1.474 + 1.475 +--- linux-2.6.34/fs/squashfs/lzma_wrapper.c 1.476 ++++ linux-2.6.34/fs/squashfs/lzma_wrapper.c 1.477 +@@ -0,0 +1,152 @@ 1.478 ++/* 1.479 ++ * Squashfs - a compressed read only filesystem for Linux 1.480 ++ * 1.481 ++ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 1.482 ++ * Phillip Lougher <phillip@lougher.demon.co.uk> 1.483 ++ * 1.484 ++ * This program is free software; you can redistribute it and/or 1.485 ++ * modify it under the terms of the GNU General Public License 1.486 ++ * as published by the Free Software Foundation; either version 2, 1.487 ++ * or (at your option) any later version. 1.488 ++ * 1.489 ++ * This program is distributed in the hope that it will be useful, 1.490 ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of 1.491 ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1.492 ++ * GNU General Public License for more details. 1.493 ++ * 1.494 ++ * You should have received a copy of the GNU General Public License 1.495 ++ * along with this program; if not, write to the Free Software 1.496 ++ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 1.497 ++ * 1.498 ++ * lzma_wrapper.c 1.499 ++ */ 1.500 ++ 1.501 ++#include <asm/unaligned.h> 1.502 ++#include <linux/slab.h> 1.503 ++#include <linux/buffer_head.h> 1.504 ++#include <linux/mutex.h> 1.505 ++#include <linux/vmalloc.h> 1.506 ++#include <linux/decompress/unlzma.h> 1.507 ++ 1.508 ++#include "squashfs_fs.h" 1.509 ++#include "squashfs_fs_sb.h" 1.510 ++#include "squashfs_fs_i.h" 1.511 ++#include "squashfs.h" 1.512 ++#include "decompressor.h" 1.513 ++ 1.514 ++struct squashfs_lzma { 1.515 ++ void *input; 1.516 ++ void *output; 1.517 ++}; 1.518 ++ 1.519 ++/* decompress_unlzma.c is currently non re-entrant... */ 1.520 ++DEFINE_MUTEX(lzma_mutex); 1.521 ++ 1.522 ++/* decompress_unlzma.c doesn't provide any context in its callbacks... */ 1.523 ++static int lzma_error; 1.524 ++ 1.525 ++static void error(char *m) 1.526 ++{ 1.527 ++ ERROR("unlzma error: %s\n", m); 1.528 ++ lzma_error = 1; 1.529 ++} 1.530 ++ 1.531 ++ 1.532 ++static void *lzma_init(struct squashfs_sb_info *msblk) 1.533 ++{ 1.534 ++ struct squashfs_lzma *stream = kzalloc(sizeof(*stream), GFP_KERNEL); 1.535 ++ if (stream == NULL) 1.536 ++ goto failed; 1.537 ++ stream->input = vmalloc(msblk->block_size); 1.538 ++ if (stream->input == NULL) 1.539 ++ goto failed; 1.540 ++ stream->output = vmalloc(msblk->block_size); 1.541 ++ if (stream->output == NULL) 1.542 ++ goto failed2; 1.543 ++ 1.544 ++ return stream; 1.545 ++ 1.546 ++failed2: 1.547 ++ vfree(stream->input); 1.548 ++failed: 1.549 ++ ERROR("failed to allocate lzma workspace\n"); 1.550 ++ kfree(stream); 1.551 ++ return NULL; 1.552 ++} 1.553 ++ 1.554 ++ 1.555 ++static void lzma_free(void *strm) 1.556 ++{ 1.557 ++ struct squashfs_lzma *stream = strm; 1.558 ++ 1.559 ++ if (stream) { 1.560 ++ vfree(stream->input); 1.561 ++ vfree(stream->output); 1.562 ++ } 1.563 ++ kfree(stream); 1.564 ++} 1.565 ++ 1.566 ++ 1.567 ++static int lzma_uncompress(struct squashfs_sb_info *msblk, void **buffer, 1.568 ++ struct buffer_head **bh, int b, int offset, int length, int srclength, 1.569 ++ int pages) 1.570 ++{ 1.571 ++ struct squashfs_lzma *stream = msblk->stream; 1.572 ++ void *buff = stream->input; 1.573 ++ int avail, i, bytes = length, res; 1.574 ++ 1.575 ++ mutex_lock(&lzma_mutex); 1.576 ++ 1.577 ++ for (i = 0; i < b; i++) { 1.578 ++ wait_on_buffer(bh[i]); 1.579 ++ if (!buffer_uptodate(bh[i])) 1.580 ++ goto block_release; 1.581 ++ 1.582 ++ avail = min(bytes, msblk->devblksize - offset); 1.583 ++ memcpy(buff, bh[i]->b_data + offset, avail); 1.584 ++ buff += avail; 1.585 ++ bytes -= avail; 1.586 ++ offset = 0; 1.587 ++ put_bh(bh[i]); 1.588 ++ } 1.589 ++ 1.590 ++ lzma_error = 0; 1.591 ++ res = unlzma(stream->input, length, NULL, NULL, stream->output, NULL, 1.592 ++ error); 1.593 ++ if (res || lzma_error) 1.594 ++ goto failed; 1.595 ++ 1.596 ++ /* uncompressed size is stored in the LZMA header (5 byte offset) */ 1.597 ++ res = bytes = get_unaligned_le32(stream->input + 5); 1.598 ++ for (i = 0, buff = stream->output; bytes && i < pages; i++) { 1.599 ++ avail = min_t(int, bytes, PAGE_CACHE_SIZE); 1.600 ++ memcpy(buffer[i], buff, avail); 1.601 ++ buff += avail; 1.602 ++ bytes -= avail; 1.603 ++ } 1.604 ++ if (bytes) 1.605 ++ goto failed; 1.606 ++ 1.607 ++ mutex_unlock(&lzma_mutex); 1.608 ++ return res; 1.609 ++ 1.610 ++block_release: 1.611 ++ for (; i < b; i++) 1.612 ++ put_bh(bh[i]); 1.613 ++ 1.614 ++failed: 1.615 ++ mutex_unlock(&lzma_mutex); 1.616 ++ 1.617 ++ ERROR("lzma decompression failed, data probably corrupt\n"); 1.618 ++ return -EIO; 1.619 ++} 1.620 ++ 1.621 ++const struct squashfs_decompressor squashfs_lzma_comp_ops = { 1.622 ++ .init = lzma_init, 1.623 ++ .free = lzma_free, 1.624 ++ .decompress = lzma_uncompress, 1.625 ++ .id = LZMA_COMPRESSION, 1.626 ++ .name = "lzma", 1.627 ++ .supported = 1 1.628 ++}; 1.629 ++ 1.630 + 1.631 +--- linux-2.6.34/fs/squashfs/squashfs.h 1.632 ++++ linux-2.6.34/fs/squashfs/squashfs.h 1.633 +@@ -94,3 +94,6 @@ 1.634 + 1.635 + /* zlib_wrapper.c */ 1.636 + extern const struct squashfs_decompressor squashfs_zlib_comp_ops; 1.637 ++ 1.638 ++/* lzma wrapper.c */ 1.639 ++extern const struct squashfs_decompressor squashfs_lzma_comp_ops; 1.640 + 1.641 +--- linux-2.6.34/lib/Makefile 1.642 ++++ linux-2.6.34/lib/Makefile 1.643 +@@ -69,7 +69,7 @@ obj-$(CONFIG_LZO_DECOMPRESS) += lzo/ 1.644 + 1.645 + lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o 1.646 + lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o 1.647 +-lib-$(CONFIG_DECOMPRESS_LZMA) += decompress_unlzma.o 1.648 ++obj-$(CONFIG_DECOMPRESS_LZMA) += decompress_unlzma.o 1.649 + lib-$(CONFIG_DECOMPRESS_LZO) += decompress_unlzo.o 1.650 + 1.651 + obj-$(CONFIG_TEXTSEARCH) += textsearch.o 1.652 +