1 --- a/fs/squashfs/inode.c
2 +++ b/fs/squashfs/inode.c
4 * Copyright (c) 2002, 2003, 2004, 2005, 2006
5 * Phillip Lougher <phillip@lougher.org.uk>
7 + * LZMA decompressor support added by Oleg I. Vdovikin
8 + * Copyright (c) 2005 Oleg I.Vdovikin <oleg@cs.msu.su>
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2,
17 +#define SQUASHFS_LZMA
18 #include <linux/types.h>
19 #include <linux/squashfs_fs.h>
20 #include <linux/module.h>
26 +#include "LzmaDecode.h"
28 +/* default LZMA settings, should be in sync with mksquashfs */
33 +#define LZMA_WORKSPACE_SIZE ((LZMA_BASE_SIZE + \
34 + (LZMA_LIT_SIZE << (LZMA_LC + LZMA_LP))) * sizeof(CProb))
39 static struct super_block *squashfs_read_super(struct super_block *, void *, int);
40 static void squashfs_put_super(struct super_block *);
41 static int squashfs_statfs(struct super_block *, struct statfs *);
42 @@ -53,7 +71,11 @@ static long long read_blocklist(struct i
43 int readahead_blks, char *block_list,
44 unsigned short **block_p, unsigned int *bsize);
47 +static unsigned char lzma_workspace[LZMA_WORKSPACE_SIZE];
49 static z_stream stream;
52 static DECLARE_FSTYPE_DEV(squashfs_fs_type, "squashfs", squashfs_read_super);
54 @@ -229,6 +251,15 @@ SQSH_EXTERN unsigned int squashfs_read_d
59 + if ((zlib_err = LzmaDecode(lzma_workspace,
60 + LZMA_WORKSPACE_SIZE, LZMA_LC, LZMA_LP, LZMA_PB,
61 + c_buffer, c_byte, buffer, msblk->read_size, &bytes)) != LZMA_RESULT_OK)
63 + ERROR("lzma returned unexpected result 0x%x\n", zlib_err);
67 stream.next_in = c_buffer;
68 stream.avail_in = c_byte;
69 stream.next_out = buffer;
70 @@ -243,6 +274,7 @@ SQSH_EXTERN unsigned int squashfs_read_d
73 bytes = stream.total_out;
76 up(&msblk->read_data_mutex);
78 @@ -2004,17 +2036,21 @@ static int __init init_squashfs_fs(void)
79 printk(KERN_INFO "squashfs: version 3.0 (2006/03/15) "
82 +#ifndef SQUASHFS_LZMA
83 if (!(stream.workspace = vmalloc(zlib_inflate_workspacesize()))) {
84 ERROR("Failed to allocate zlib workspace\n");
88 return register_filesystem(&squashfs_fs_type);
92 static void __exit exit_squashfs_fs(void)
94 +#ifndef SQUASHFS_LZMA
95 vfree(stream.workspace);
97 unregister_filesystem(&squashfs_fs_type);
101 +++ b/fs/squashfs/LzmaDecode.c
107 + LZMA SDK 4.05 Copyright (c) 1999-2004 Igor Pavlov (2004-08-25)
108 + http://www.7-zip.org/
110 + LZMA SDK is licensed under two licenses:
111 + 1) GNU Lesser General Public License (GNU LGPL)
112 + 2) Common Public License (CPL)
113 + It means that you can select one of these two licenses and
114 + follow rules of that license.
117 + Igor Pavlov, as the author of this code, expressly permits you to
118 + statically or dynamically link your code (or bind by name) to the
119 + interfaces of this file without subjecting your linked code to the
120 + terms of the CPL or GNU LGPL. Any modifications or additions
121 + to this file, however, are subject to the LGPL or CPL terms.
124 +#include "LzmaDecode.h"
127 +#define Byte unsigned char
130 +#define kNumTopBits 24
131 +#define kTopValue ((UInt32)1 << kNumTopBits)
133 +#define kNumBitModelTotalBits 11
134 +#define kBitModelTotal (1 << kNumBitModelTotalBits)
135 +#define kNumMoveBits 5
137 +typedef struct _CRangeDecoder
144 + ILzmaInCallback *InCallback;
150 +Byte RangeDecoderReadByte(CRangeDecoder *rd)
152 + if (rd->Buffer == rd->BufferLim)
156 + rd->Result = rd->InCallback->Read(rd->InCallback, &rd->Buffer, &size);
157 + rd->BufferLim = rd->Buffer + size;
161 + rd->ExtraBytes = 1;
165 + return (*rd->Buffer++);
168 +/* #define ReadByte (*rd->Buffer++) */
169 +#define ReadByte (RangeDecoderReadByte(rd))
171 +void RangeDecoderInit(CRangeDecoder *rd,
173 + ILzmaInCallback *inCallback
175 + Byte *stream, UInt32 bufferSize
181 + rd->InCallback = inCallback;
182 + rd->Buffer = rd->BufferLim = 0;
184 + rd->Buffer = stream;
185 + rd->BufferLim = stream + bufferSize;
187 + rd->ExtraBytes = 0;
189 + rd->Range = (0xFFFFFFFF);
190 + for(i = 0; i < 5; i++)
191 + rd->Code = (rd->Code << 8) | ReadByte;
194 +#define RC_INIT_VAR UInt32 range = rd->Range; UInt32 code = rd->Code;
195 +#define RC_FLUSH_VAR rd->Range = range; rd->Code = code;
196 +#define RC_NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | ReadByte; }
198 +UInt32 RangeDecoderDecodeDirectBits(CRangeDecoder *rd, int numTotalBits)
203 + for (i = numTotalBits; i > 0; i--)
215 + t = (code - range) >> 31;
217 + code -= range & (t - 1);
218 + result = (result + result) | (1 - t);
226 +int RangeDecoderBitDecode(CProb *prob, CRangeDecoder *rd)
228 + UInt32 bound = (rd->Range >> kNumBitModelTotalBits) * *prob;
229 + if (rd->Code < bound)
232 + *prob += (kBitModelTotal - *prob) >> kNumMoveBits;
233 + if (rd->Range < kTopValue)
235 + rd->Code = (rd->Code << 8) | ReadByte;
242 + rd->Range -= bound;
244 + *prob -= (*prob) >> kNumMoveBits;
245 + if (rd->Range < kTopValue)
247 + rd->Code = (rd->Code << 8) | ReadByte;
254 +#define RC_GET_BIT2(prob, mi, A0, A1) \
255 + UInt32 bound = (range >> kNumBitModelTotalBits) * *prob; \
256 + if (code < bound) \
257 + { A0; range = bound; *prob += (kBitModelTotal - *prob) >> kNumMoveBits; mi <<= 1; } \
259 + { A1; range -= bound; code -= bound; *prob -= (*prob) >> kNumMoveBits; mi = (mi + mi) + 1; } \
262 +#define RC_GET_BIT(prob, mi) RC_GET_BIT2(prob, mi, ; , ;)
264 +int RangeDecoderBitTreeDecode(CProb *probs, int numLevels, CRangeDecoder *rd)
268 + #ifdef _LZMA_LOC_OPT
271 + for(i = numLevels; i > 0; i--)
273 + #ifdef _LZMA_LOC_OPT
274 + CProb *prob = probs + mi;
275 + RC_GET_BIT(prob, mi)
277 + mi = (mi + mi) + RangeDecoderBitDecode(probs + mi, rd);
280 + #ifdef _LZMA_LOC_OPT
283 + return mi - (1 << numLevels);
286 +int RangeDecoderReverseBitTreeDecode(CProb *probs, int numLevels, CRangeDecoder *rd)
291 + #ifdef _LZMA_LOC_OPT
294 + for(i = 0; i < numLevels; i++)
296 + #ifdef _LZMA_LOC_OPT
297 + CProb *prob = probs + mi;
298 + RC_GET_BIT2(prob, mi, ; , symbol |= (1 << i))
300 + int bit = RangeDecoderBitDecode(probs + mi, rd);
301 + mi = mi + mi + bit;
302 + symbol |= (bit << i);
305 + #ifdef _LZMA_LOC_OPT
311 +Byte LzmaLiteralDecode(CProb *probs, CRangeDecoder *rd)
314 + #ifdef _LZMA_LOC_OPT
319 + #ifdef _LZMA_LOC_OPT
320 + CProb *prob = probs + symbol;
321 + RC_GET_BIT(prob, symbol)
323 + symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd);
326 + while (symbol < 0x100);
327 + #ifdef _LZMA_LOC_OPT
333 +Byte LzmaLiteralDecodeMatch(CProb *probs, CRangeDecoder *rd, Byte matchByte)
336 + #ifdef _LZMA_LOC_OPT
342 + int matchBit = (matchByte >> 7) & 1;
344 + #ifdef _LZMA_LOC_OPT
346 + CProb *prob = probs + ((1 + matchBit) << 8) + symbol;
347 + RC_GET_BIT2(prob, symbol, bit = 0, bit = 1)
350 + bit = RangeDecoderBitDecode(probs + ((1 + matchBit) << 8) + symbol, rd);
351 + symbol = (symbol << 1) | bit;
353 + if (matchBit != bit)
355 + while (symbol < 0x100)
357 + #ifdef _LZMA_LOC_OPT
358 + CProb *prob = probs + symbol;
359 + RC_GET_BIT(prob, symbol)
361 + symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd);
367 + while (symbol < 0x100);
368 + #ifdef _LZMA_LOC_OPT
374 +#define kNumPosBitsMax 4
375 +#define kNumPosStatesMax (1 << kNumPosBitsMax)
377 +#define kLenNumLowBits 3
378 +#define kLenNumLowSymbols (1 << kLenNumLowBits)
379 +#define kLenNumMidBits 3
380 +#define kLenNumMidSymbols (1 << kLenNumMidBits)
381 +#define kLenNumHighBits 8
382 +#define kLenNumHighSymbols (1 << kLenNumHighBits)
385 +#define LenChoice2 (LenChoice + 1)
386 +#define LenLow (LenChoice2 + 1)
387 +#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
388 +#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
389 +#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
391 +int LzmaLenDecode(CProb *p, CRangeDecoder *rd, int posState)
393 + if(RangeDecoderBitDecode(p + LenChoice, rd) == 0)
394 + return RangeDecoderBitTreeDecode(p + LenLow +
395 + (posState << kLenNumLowBits), kLenNumLowBits, rd);
396 + if(RangeDecoderBitDecode(p + LenChoice2, rd) == 0)
397 + return kLenNumLowSymbols + RangeDecoderBitTreeDecode(p + LenMid +
398 + (posState << kLenNumMidBits), kLenNumMidBits, rd);
399 + return kLenNumLowSymbols + kLenNumMidSymbols +
400 + RangeDecoderBitTreeDecode(p + LenHigh, kLenNumHighBits, rd);
403 +#define kNumStates 12
405 +#define kStartPosModelIndex 4
406 +#define kEndPosModelIndex 14
407 +#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
409 +#define kNumPosSlotBits 6
410 +#define kNumLenToPosStates 4
412 +#define kNumAlignBits 4
413 +#define kAlignTableSize (1 << kNumAlignBits)
415 +#define kMatchMinLen 2
418 +#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
419 +#define IsRepG0 (IsRep + kNumStates)
420 +#define IsRepG1 (IsRepG0 + kNumStates)
421 +#define IsRepG2 (IsRepG1 + kNumStates)
422 +#define IsRep0Long (IsRepG2 + kNumStates)
423 +#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
424 +#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
425 +#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
426 +#define LenCoder (Align + kAlignTableSize)
427 +#define RepLenCoder (LenCoder + kNumLenProbs)
428 +#define Literal (RepLenCoder + kNumLenProbs)
430 +#if Literal != LZMA_BASE_SIZE
434 +#ifdef _LZMA_OUT_READ
436 +typedef struct _LzmaVarState
438 + CRangeDecoder RangeDecoder;
440 + UInt32 DictionarySize;
441 + UInt32 DictionaryPos;
448 + int PreviousIsMatch;
452 +int LzmaDecoderInit(
453 + unsigned char *buffer, UInt32 bufferSize,
454 + int lc, int lp, int pb,
455 + unsigned char *dictionary, UInt32 dictionarySize,
457 + ILzmaInCallback *inCallback
459 + unsigned char *inStream, UInt32 inSize
463 + LzmaVarState *vs = (LzmaVarState *)buffer;
464 + CProb *p = (CProb *)(buffer + sizeof(LzmaVarState));
465 + UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + lp));
467 + if (bufferSize < numProbs * sizeof(CProb) + sizeof(LzmaVarState))
468 + return LZMA_RESULT_NOT_ENOUGH_MEM;
469 + vs->Dictionary = dictionary;
470 + vs->DictionarySize = dictionarySize;
471 + vs->DictionaryPos = 0;
473 + vs->Reps[0] = vs->Reps[1] = vs->Reps[2] = vs->Reps[3] = 1;
478 + vs->PreviousIsMatch = 0;
480 + dictionary[dictionarySize - 1] = 0;
481 + for (i = 0; i < numProbs; i++)
482 + p[i] = kBitModelTotal >> 1;
483 + RangeDecoderInit(&vs->RangeDecoder,
490 + return LZMA_RESULT_OK;
493 +int LzmaDecode(unsigned char *buffer,
494 + unsigned char *outStream, UInt32 outSize,
495 + UInt32 *outSizeProcessed)
497 + LzmaVarState *vs = (LzmaVarState *)buffer;
498 + CProb *p = (CProb *)(buffer + sizeof(LzmaVarState));
499 + CRangeDecoder rd = vs->RangeDecoder;
500 + int state = vs->State;
501 + int previousIsMatch = vs->PreviousIsMatch;
503 + UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3];
505 + UInt32 posStateMask = (1 << (vs->pb)) - 1;
506 + UInt32 literalPosMask = (1 << (vs->lp)) - 1;
508 + int len = vs->RemainLen;
509 + UInt32 globalPos = vs->GlobalPos;
511 + Byte *dictionary = vs->Dictionary;
512 + UInt32 dictionarySize = vs->DictionarySize;
513 + UInt32 dictionaryPos = vs->DictionaryPos;
517 + *outSizeProcessed = 0;
518 + return LZMA_RESULT_OK;
521 + while(len > 0 && nowPos < outSize)
523 + UInt32 pos = dictionaryPos - rep0;
524 + if (pos >= dictionarySize)
525 + pos += dictionarySize;
526 + outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos];
527 + if (++dictionaryPos == dictionarySize)
531 + if (dictionaryPos == 0)
532 + previousByte = dictionary[dictionarySize - 1];
534 + previousByte = dictionary[dictionaryPos - 1];
538 + Byte *buffer, UInt32 bufferSize,
539 + int lc, int lp, int pb,
541 + ILzmaInCallback *inCallback,
543 + unsigned char *inStream, UInt32 inSize,
545 + unsigned char *outStream, UInt32 outSize,
546 + UInt32 *outSizeProcessed)
548 + UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + lp));
549 + CProb *p = (CProb *)buffer;
553 + int previousIsMatch = 0;
554 + Byte previousByte = 0;
555 + UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1;
557 + UInt32 posStateMask = (1 << pb) - 1;
558 + UInt32 literalPosMask = (1 << lp) - 1;
560 + if (bufferSize < numProbs * sizeof(CProb))
561 + return LZMA_RESULT_NOT_ENOUGH_MEM;
562 + for (i = 0; i < numProbs; i++)
563 + p[i] = kBitModelTotal >> 1;
564 + RangeDecoderInit(&rd,
573 + *outSizeProcessed = 0;
574 + while(nowPos < outSize)
576 + int posState = (int)(
578 + #ifdef _LZMA_OUT_READ
584 + if (rd.Result != LZMA_RESULT_OK)
587 + if (rd.ExtraBytes != 0)
588 + return LZMA_RESULT_DATA_ERROR;
589 + if (RangeDecoderBitDecode(p + IsMatch + (state << kNumPosBitsMax) + posState, &rd) == 0)
591 + CProb *probs = p + Literal + (LZMA_LIT_SIZE *
594 + #ifdef _LZMA_OUT_READ
598 + & literalPosMask) << lc) + (previousByte >> (8 - lc))));
600 + if (state < 4) state = 0;
601 + else if (state < 10) state -= 3;
603 + if (previousIsMatch)
606 + #ifdef _LZMA_OUT_READ
607 + UInt32 pos = dictionaryPos - rep0;
608 + if (pos >= dictionarySize)
609 + pos += dictionarySize;
610 + matchByte = dictionary[pos];
612 + matchByte = outStream[nowPos - rep0];
614 + previousByte = LzmaLiteralDecodeMatch(probs, &rd, matchByte);
615 + previousIsMatch = 0;
618 + previousByte = LzmaLiteralDecode(probs, &rd);
619 + outStream[nowPos++] = previousByte;
620 + #ifdef _LZMA_OUT_READ
621 + dictionary[dictionaryPos] = previousByte;
622 + if (++dictionaryPos == dictionarySize)
628 + previousIsMatch = 1;
629 + if (RangeDecoderBitDecode(p + IsRep + state, &rd) == 1)
631 + if (RangeDecoderBitDecode(p + IsRepG0 + state, &rd) == 0)
633 + if (RangeDecoderBitDecode(p + IsRep0Long + (state << kNumPosBitsMax) + posState, &rd) == 0)
635 + #ifdef _LZMA_OUT_READ
640 + #ifdef _LZMA_OUT_READ
645 + return LZMA_RESULT_DATA_ERROR;
646 + state = state < 7 ? 9 : 11;
647 + #ifdef _LZMA_OUT_READ
648 + pos = dictionaryPos - rep0;
649 + if (pos >= dictionarySize)
650 + pos += dictionarySize;
651 + previousByte = dictionary[pos];
652 + dictionary[dictionaryPos] = previousByte;
653 + if (++dictionaryPos == dictionarySize)
656 + previousByte = outStream[nowPos - rep0];
658 + outStream[nowPos++] = previousByte;
665 + if(RangeDecoderBitDecode(p + IsRepG1 + state, &rd) == 0)
669 + if(RangeDecoderBitDecode(p + IsRepG2 + state, &rd) == 0)
681 + len = LzmaLenDecode(p + RepLenCoder, &rd, posState);
682 + state = state < 7 ? 8 : 11;
690 + state = state < 7 ? 7 : 10;
691 + len = LzmaLenDecode(p + LenCoder, &rd, posState);
692 + posSlot = RangeDecoderBitTreeDecode(p + PosSlot +
693 + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
694 + kNumPosSlotBits), kNumPosSlotBits, &rd);
695 + if (posSlot >= kStartPosModelIndex)
697 + int numDirectBits = ((posSlot >> 1) - 1);
698 + rep0 = ((2 | ((UInt32)posSlot & 1)) << numDirectBits);
699 + if (posSlot < kEndPosModelIndex)
701 + rep0 += RangeDecoderReverseBitTreeDecode(
702 + p + SpecPos + rep0 - posSlot - 1, numDirectBits, &rd);
706 + rep0 += RangeDecoderDecodeDirectBits(&rd,
707 + numDirectBits - kNumAlignBits) << kNumAlignBits;
708 + rep0 += RangeDecoderReverseBitTreeDecode(p + Align, kNumAlignBits, &rd);
715 + if (rep0 == (UInt32)(0))
717 + /* it's for stream version */
722 + #ifdef _LZMA_OUT_READ
727 + return LZMA_RESULT_DATA_ERROR;
729 + len += kMatchMinLen;
732 + #ifdef _LZMA_OUT_READ
733 + UInt32 pos = dictionaryPos - rep0;
734 + if (pos >= dictionarySize)
735 + pos += dictionarySize;
736 + previousByte = dictionary[pos];
737 + dictionary[dictionaryPos] = previousByte;
738 + if (++dictionaryPos == dictionarySize)
741 + previousByte = outStream[nowPos - rep0];
743 + outStream[nowPos++] = previousByte;
746 + while(len > 0 && nowPos < outSize);
750 + #ifdef _LZMA_OUT_READ
751 + vs->RangeDecoder = rd;
752 + vs->DictionaryPos = dictionaryPos;
753 + vs->GlobalPos = globalPos + nowPos;
754 + vs->Reps[0] = rep0;
755 + vs->Reps[1] = rep1;
756 + vs->Reps[2] = rep2;
757 + vs->Reps[3] = rep3;
759 + vs->PreviousIsMatch = previousIsMatch;
760 + vs->RemainLen = len;
763 + *outSizeProcessed = nowPos;
764 + return LZMA_RESULT_OK;
767 +++ b/fs/squashfs/LzmaDecode.h
771 + LZMA Decoder interface
773 + LZMA SDK 4.05 Copyright (c) 1999-2004 Igor Pavlov (2004-08-25)
774 + http://www.7-zip.org/
776 + LZMA SDK is licensed under two licenses:
777 + 1) GNU Lesser General Public License (GNU LGPL)
778 + 2) Common Public License (CPL)
779 + It means that you can select one of these two licenses and
780 + follow rules of that license.
783 + Igor Pavlov, as the author of this code, expressly permits you to
784 + statically or dynamically link your code (or bind by name) to the
785 + interfaces of this file without subjecting your linked code to the
786 + terms of the CPL or GNU LGPL. Any modifications or additions
787 + to this file, however, are subject to the LGPL or CPL terms.
790 +#ifndef __LZMADECODE_H
791 +#define __LZMADECODE_H
793 +/* #define _LZMA_IN_CB */
794 +/* Use callback for input data */
796 +/* #define _LZMA_OUT_READ */
797 +/* Use read function for output data */
799 +/* #define _LZMA_PROB32 */
800 +/* It can increase speed on some 32-bit CPUs,
801 + but memory usage will be doubled in that case */
803 +/* #define _LZMA_LOC_OPT */
804 +/* Enable local speed optimizations inside code */
807 +#ifdef _LZMA_UINT32_IS_ULONG
808 +#define UInt32 unsigned long
810 +#define UInt32 unsigned int
815 +#define CProb UInt32
817 +#define CProb unsigned short
820 +#define LZMA_RESULT_OK 0
821 +#define LZMA_RESULT_DATA_ERROR 1
822 +#define LZMA_RESULT_NOT_ENOUGH_MEM 2
825 +typedef struct _ILzmaInCallback
827 + int (*Read)(void *object, unsigned char **buffer, UInt32 *bufferSize);
831 +#define LZMA_BASE_SIZE 1846
832 +#define LZMA_LIT_SIZE 768
835 +bufferSize = (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp)))* sizeof(CProb)
836 +bufferSize += 100 in case of _LZMA_OUT_READ
837 +by default CProb is unsigned short,
838 +but if specify _LZMA_PROB_32, CProb will be UInt32(unsigned int)
841 +#ifdef _LZMA_OUT_READ
842 +int LzmaDecoderInit(
843 + unsigned char *buffer, UInt32 bufferSize,
844 + int lc, int lp, int pb,
845 + unsigned char *dictionary, UInt32 dictionarySize,
847 + ILzmaInCallback *inCallback
849 + unsigned char *inStream, UInt32 inSize
855 + unsigned char *buffer,
856 + #ifndef _LZMA_OUT_READ
858 + int lc, int lp, int pb,
860 + ILzmaInCallback *inCallback,
862 + unsigned char *inStream, UInt32 inSize,
865 + unsigned char *outStream, UInt32 outSize,
866 + UInt32 *outSizeProcessed);
869 --- a/fs/squashfs/Makefile
870 +++ b/fs/squashfs/Makefile
873 O_TARGET := squashfs.o
875 -obj-y := inode.o squashfs2_0.o
876 +obj-y := inode.o squashfs2_0.o LzmaDecode.o