lib/lzo: separate lzo-rle from lzo
To prevent any issues with persistent data, separate lzo-rle from lzo so that it is treated as a separate algorithm, and lzo is still available. Link: http://lkml.kernel.org/r/20190205155944.16007-3-dave.rodgman@arm.com Signed-off-by: Dave Rodgman <dave.rodgman@arm.com> Cc: David S. Miller <davem@davemloft.net> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Herbert Xu <herbert@gondor.apana.org.au> Cc: Markus F.X.J. Oberhumer <markus@oberhumer.com> Cc: Matt Sealey <matt.sealey@arm.com> Cc: Minchan Kim <minchan@kernel.org> Cc: Nitin Gupta <nitingupta910@gmail.com> Cc: Richard Purdie <rpurdie@openedhand.com> Cc: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com> Cc: Sonny Rao <sonnyrao@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
5ee4014af9
commit
45ec975efb
@@ -20,7 +20,8 @@
|
||||
static noinline size_t
|
||||
lzo1x_1_do_compress(const unsigned char *in, size_t in_len,
|
||||
unsigned char *out, size_t *out_len,
|
||||
size_t ti, void *wrkmem, signed char *state_offset)
|
||||
size_t ti, void *wrkmem, signed char *state_offset,
|
||||
const unsigned char bitstream_version)
|
||||
{
|
||||
const unsigned char *ip;
|
||||
unsigned char *op;
|
||||
@@ -46,7 +47,7 @@ next:
|
||||
break;
|
||||
dv = get_unaligned_le32(ip);
|
||||
|
||||
if (dv == 0) {
|
||||
if (dv == 0 && bitstream_version) {
|
||||
const unsigned char *ir = ip + 4;
|
||||
const unsigned char *limit = ip_end
|
||||
< (ip + MAX_ZERO_RUN_LENGTH + 1)
|
||||
@@ -284,30 +285,36 @@ finished_writing_instruction:
|
||||
return in_end - (ii - ti);
|
||||
}
|
||||
|
||||
int lzo1x_1_compress(const unsigned char *in, size_t in_len,
|
||||
int lzogeneric1x_1_compress(const unsigned char *in, size_t in_len,
|
||||
unsigned char *out, size_t *out_len,
|
||||
void *wrkmem)
|
||||
void *wrkmem, const unsigned char bitstream_version)
|
||||
{
|
||||
const unsigned char *ip = in;
|
||||
unsigned char *op = out;
|
||||
size_t l = in_len;
|
||||
size_t t = 0;
|
||||
signed char state_offset = -2;
|
||||
unsigned int m4_max_offset;
|
||||
|
||||
// LZO v0 will never write 17 as first byte,
|
||||
// so this is used to version the bitstream
|
||||
*op++ = 17;
|
||||
*op++ = LZO_VERSION;
|
||||
if (bitstream_version > 0) {
|
||||
*op++ = 17;
|
||||
*op++ = bitstream_version;
|
||||
m4_max_offset = M4_MAX_OFFSET_V1;
|
||||
} else {
|
||||
m4_max_offset = M4_MAX_OFFSET_V0;
|
||||
}
|
||||
|
||||
while (l > 20) {
|
||||
size_t ll = l <= (M4_MAX_OFFSET + 1) ? l : (M4_MAX_OFFSET + 1);
|
||||
size_t ll = l <= (m4_max_offset + 1) ? l : (m4_max_offset + 1);
|
||||
uintptr_t ll_end = (uintptr_t) ip + ll;
|
||||
if ((ll_end + ((t + ll) >> 5)) <= ll_end)
|
||||
break;
|
||||
BUILD_BUG_ON(D_SIZE * sizeof(lzo_dict_t) > LZO1X_1_MEM_COMPRESS);
|
||||
memset(wrkmem, 0, D_SIZE * sizeof(lzo_dict_t));
|
||||
t = lzo1x_1_do_compress(ip, ll, op, out_len,
|
||||
t, wrkmem, &state_offset);
|
||||
t = lzo1x_1_do_compress(ip, ll, op, out_len, t, wrkmem,
|
||||
&state_offset, bitstream_version);
|
||||
ip += ll;
|
||||
op += *out_len;
|
||||
l -= ll;
|
||||
@@ -351,7 +358,24 @@ int lzo1x_1_compress(const unsigned char *in, size_t in_len,
|
||||
*out_len = op - out;
|
||||
return LZO_E_OK;
|
||||
}
|
||||
|
||||
int lzo1x_1_compress(const unsigned char *in, size_t in_len,
|
||||
unsigned char *out, size_t *out_len,
|
||||
void *wrkmem)
|
||||
{
|
||||
return lzogeneric1x_1_compress(in, in_len, out, out_len, wrkmem, 0);
|
||||
}
|
||||
|
||||
int lzorle1x_1_compress(const unsigned char *in, size_t in_len,
|
||||
unsigned char *out, size_t *out_len,
|
||||
void *wrkmem)
|
||||
{
|
||||
return lzogeneric1x_1_compress(in, in_len, out, out_len,
|
||||
wrkmem, LZO_VERSION);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(lzo1x_1_compress);
|
||||
EXPORT_SYMBOL_GPL(lzorle1x_1_compress);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("LZO1X-1 Compressor");
|
||||
|
Reference in New Issue
Block a user