]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.4.9/lib-lz4-fixed-zram-with-lz4-on-big-endian-machines.patch
4.14-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 4.4.9 / lib-lz4-fixed-zram-with-lz4-on-big-endian-machines.patch
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
5
6 From: Rui Salvaterra <rsalvaterra@gmail.com>
7
8 commit 3e26a691fe3fe1e02a76e5bab0c143ace4b137b4 upstream.
9
10 Based on Sergey's test patch [1], this fixes zram with lz4 compression
11 on big endian cpus.
12
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).
17
18 Tested on ppc64 with no regression on x86_64.
19
20 [1] http://marc.info/?l=linux-kernel&m=145994470805853&w=4
21
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>
26
27 ---
28 lib/lz4/lz4defs.h | 21 ++++++++++++---------
29 1 file changed, 12 insertions(+), 9 deletions(-)
30
31 --- a/lib/lz4/lz4defs.h
32 +++ b/lib/lz4/lz4defs.h
33 @@ -11,8 +11,7 @@
34 /*
35 * Detects 64 bits mode
36 */
37 -#if (defined(__x86_64__) || defined(__x86_64) || defined(__amd64__) \
38 - || defined(__ppc64__) || defined(__LP64__))
39 +#if defined(CONFIG_64BIT)
40 #define LZ4_ARCH64 1
41 #else
42 #define LZ4_ARCH64 0
43 @@ -35,6 +34,10 @@ typedef struct _U64_S { u64 v; } U64_S;
44
45 #define PUT4(s, d) (A32(d) = A32(s))
46 #define PUT8(s, d) (A64(d) = A64(s))
47 +
48 +#define LZ4_READ_LITTLEENDIAN_16(d, s, p) \
49 + (d = s - A16(p))
50 +
51 #define LZ4_WRITE_LITTLEENDIAN_16(p, v) \
52 do { \
53 A16(p) = v; \
54 @@ -51,10 +54,13 @@ typedef struct _U64_S { u64 v; } U64_S;
55 #define PUT8(s, d) \
56 put_unaligned(get_unaligned((const u64 *) s), (u64 *) d)
57
58 -#define LZ4_WRITE_LITTLEENDIAN_16(p, v) \
59 - do { \
60 - put_unaligned(v, (u16 *)(p)); \
61 - p += 2; \
62 +#define LZ4_READ_LITTLEENDIAN_16(d, s, p) \
63 + (d = s - get_unaligned_le16(p))
64 +
65 +#define LZ4_WRITE_LITTLEENDIAN_16(p, v) \
66 + do { \
67 + put_unaligned_le16(v, (u16 *)(p)); \
68 + p += 2; \
69 } while (0)
70 #endif
71
72 @@ -140,9 +146,6 @@ typedef struct _U64_S { u64 v; } U64_S;
73
74 #endif
75
76 -#define LZ4_READ_LITTLEENDIAN_16(d, s, p) \
77 - (d = s - get_unaligned_le16(p))
78 -
79 #define LZ4_WILDCOPY(s, d, e) \
80 do { \
81 LZ4_COPYPACKET(s, d); \