1 From 3e26a691fe3fe1e02a76e5bab0c143ace4b137b4 Mon Sep 17 00:00:00 2001
2 From: Rui Salvaterra <rsalvaterra@gmail.com>
3 Date: Sat, 9 Apr 2016 22:05:34 +0100
4 Subject: lib: lz4: fixed zram with lz4 on big endian machines
6 From: Rui Salvaterra <rsalvaterra@gmail.com>
8 commit 3e26a691fe3fe1e02a76e5bab0c143ace4b137b4 upstream.
10 Based on Sergey's test patch [1], this fixes zram with lz4 compression
13 Note that the 64-bit preprocessor test is not a cleanup, it's part of
14 the fix, since those identifiers are bogus (for example, __ppc64__
15 isn't defined anywhere else in the kernel, which means we'd fall into
16 the 32-bit definitions on ppc64).
18 Tested on ppc64 with no regression on x86_64.
20 [1] http://marc.info/?l=linux-kernel&m=145994470805853&w=4
22 Suggested-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
23 Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
24 Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
25 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
28 lib/lz4/lz4defs.h | 21 ++++++++++++---------
29 1 file changed, 12 insertions(+), 9 deletions(-)
31 --- a/lib/lz4/lz4defs.h
32 +++ b/lib/lz4/lz4defs.h
35 * Detects 64 bits mode
37 -#if (defined(__x86_64__) || defined(__x86_64) || defined(__amd64__) \
38 - || defined(__ppc64__) || defined(__LP64__))
39 +#if defined(CONFIG_64BIT)
43 @@ -35,6 +34,10 @@ typedef struct _U64_S { u64 v; } U64_S;
45 #define PUT4(s, d) (A32(d) = A32(s))
46 #define PUT8(s, d) (A64(d) = A64(s))
48 +#define LZ4_READ_LITTLEENDIAN_16(d, s, p) \
51 #define LZ4_WRITE_LITTLEENDIAN_16(p, v) \
54 @@ -51,10 +54,13 @@ typedef struct _U64_S { u64 v; } U64_S;
56 put_unaligned(get_unaligned((const u64 *) s), (u64 *) d)
58 -#define LZ4_WRITE_LITTLEENDIAN_16(p, v) \
60 - put_unaligned(v, (u16 *)(p)); \
62 +#define LZ4_READ_LITTLEENDIAN_16(d, s, p) \
63 + (d = s - get_unaligned_le16(p))
65 +#define LZ4_WRITE_LITTLEENDIAN_16(p, v) \
67 + put_unaligned_le16(v, (u16 *)(p)); \
72 @@ -140,9 +146,6 @@ typedef struct _U64_S { u64 v; } U64_S;
76 -#define LZ4_READ_LITTLEENDIAN_16(d, s, p) \
77 - (d = s - get_unaligned_le16(p))
79 #define LZ4_WILDCOPY(s, d, e) \
81 LZ4_COPYPACKET(s, d); \