diff options
author | Rui Salvaterra <rsalvaterra@gmail.com> | 2016-04-09 17:05:34 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-04-13 12:22:49 -0400 |
commit | 3e26a691fe3fe1e02a76e5bab0c143ace4b137b4 (patch) | |
tree | 23d5c193d4729cc1ca7d691fab6e4524df8c8674 /lib/lz4 | |
parent | 87243deb88671f70def4c52dfa7ca7830707bd31 (diff) |
lib: lz4: fixed zram with lz4 on big endian machines
Based on Sergey's test patch [1], this fixes zram with lz4 compression
on big endian cpus.
Note that the 64-bit preprocessor test is not a cleanup, it's part of
the fix, since those identifiers are bogus (for example, __ppc64__
isn't defined anywhere else in the kernel, which means we'd fall into
the 32-bit definitions on ppc64).
Tested on ppc64 with no regression on x86_64.
[1] http://marc.info/?l=linux-kernel&m=145994470805853&w=4
Cc: stable@vger.kernel.org
Suggested-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'lib/lz4')
-rw-r--r-- | lib/lz4/lz4defs.h | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/lib/lz4/lz4defs.h b/lib/lz4/lz4defs.h index abcecdc2d0f2..0710a62ad2f6 100644 --- a/lib/lz4/lz4defs.h +++ b/lib/lz4/lz4defs.h | |||
@@ -11,8 +11,7 @@ | |||
11 | /* | 11 | /* |
12 | * Detects 64 bits mode | 12 | * Detects 64 bits mode |
13 | */ | 13 | */ |
14 | #if (defined(__x86_64__) || defined(__x86_64) || defined(__amd64__) \ | 14 | #if defined(CONFIG_64BIT) |
15 | || defined(__ppc64__) || defined(__LP64__)) | ||
16 | #define LZ4_ARCH64 1 | 15 | #define LZ4_ARCH64 1 |
17 | #else | 16 | #else |
18 | #define LZ4_ARCH64 0 | 17 | #define LZ4_ARCH64 0 |
@@ -35,6 +34,10 @@ typedef struct _U64_S { u64 v; } U64_S; | |||
35 | 34 | ||
36 | #define PUT4(s, d) (A32(d) = A32(s)) | 35 | #define PUT4(s, d) (A32(d) = A32(s)) |
37 | #define PUT8(s, d) (A64(d) = A64(s)) | 36 | #define PUT8(s, d) (A64(d) = A64(s)) |
37 | |||
38 | #define LZ4_READ_LITTLEENDIAN_16(d, s, p) \ | ||
39 | (d = s - A16(p)) | ||
40 | |||
38 | #define LZ4_WRITE_LITTLEENDIAN_16(p, v) \ | 41 | #define LZ4_WRITE_LITTLEENDIAN_16(p, v) \ |
39 | do { \ | 42 | do { \ |
40 | A16(p) = v; \ | 43 | A16(p) = v; \ |
@@ -51,10 +54,13 @@ typedef struct _U64_S { u64 v; } U64_S; | |||
51 | #define PUT8(s, d) \ | 54 | #define PUT8(s, d) \ |
52 | put_unaligned(get_unaligned((const u64 *) s), (u64 *) d) | 55 | put_unaligned(get_unaligned((const u64 *) s), (u64 *) d) |
53 | 56 | ||
54 | #define LZ4_WRITE_LITTLEENDIAN_16(p, v) \ | 57 | #define LZ4_READ_LITTLEENDIAN_16(d, s, p) \ |
55 | do { \ | 58 | (d = s - get_unaligned_le16(p)) |
56 | put_unaligned(v, (u16 *)(p)); \ | 59 | |
57 | p += 2; \ | 60 | #define LZ4_WRITE_LITTLEENDIAN_16(p, v) \ |
61 | do { \ | ||
62 | put_unaligned_le16(v, (u16 *)(p)); \ | ||
63 | p += 2; \ | ||
58 | } while (0) | 64 | } while (0) |
59 | #endif | 65 | #endif |
60 | 66 | ||
@@ -140,9 +146,6 @@ typedef struct _U64_S { u64 v; } U64_S; | |||
140 | 146 | ||
141 | #endif | 147 | #endif |
142 | 148 | ||
143 | #define LZ4_READ_LITTLEENDIAN_16(d, s, p) \ | ||
144 | (d = s - get_unaligned_le16(p)) | ||
145 | |||
146 | #define LZ4_WILDCOPY(s, d, e) \ | 149 | #define LZ4_WILDCOPY(s, d, e) \ |
147 | do { \ | 150 | do { \ |
148 | LZ4_COPYPACKET(s, d); \ | 151 | LZ4_COPYPACKET(s, d); \ |