Skip to content

Commit 3e26a69

Browse files
rsalvaterragregkh
authored andcommitted
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>
1 parent 87243de commit 3e26a69

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

lib/lz4/lz4defs.h

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
/*
1212
* Detects 64 bits mode
1313
*/
14-
#if (defined(__x86_64__) || defined(__x86_64) || defined(__amd64__) \
15-
|| defined(__ppc64__) || defined(__LP64__))
14+
#if defined(CONFIG_64BIT)
1615
#define LZ4_ARCH64 1
1716
#else
1817
#define LZ4_ARCH64 0
@@ -35,6 +34,10 @@ typedef struct _U64_S { u64 v; } U64_S;
3534

3635
#define PUT4(s, d) (A32(d) = A32(s))
3736
#define PUT8(s, d) (A64(d) = A64(s))
37+
38+
#define LZ4_READ_LITTLEENDIAN_16(d, s, p) \
39+
(d = s - A16(p))
40+
3841
#define LZ4_WRITE_LITTLEENDIAN_16(p, v) \
3942
do { \
4043
A16(p) = v; \
@@ -51,10 +54,13 @@ typedef struct _U64_S { u64 v; } U64_S;
5154
#define PUT8(s, d) \
5255
put_unaligned(get_unaligned((const u64 *) s), (u64 *) d)
5356

54-
#define LZ4_WRITE_LITTLEENDIAN_16(p, v) \
55-
do { \
56-
put_unaligned(v, (u16 *)(p)); \
57-
p += 2; \
57+
#define LZ4_READ_LITTLEENDIAN_16(d, s, p) \
58+
(d = s - get_unaligned_le16(p))
59+
60+
#define LZ4_WRITE_LITTLEENDIAN_16(p, v) \
61+
do { \
62+
put_unaligned_le16(v, (u16 *)(p)); \
63+
p += 2; \
5864
} while (0)
5965
#endif
6066

@@ -140,9 +146,6 @@ typedef struct _U64_S { u64 v; } U64_S;
140146

141147
#endif
142148

143-
#define LZ4_READ_LITTLEENDIAN_16(d, s, p) \
144-
(d = s - get_unaligned_le16(p))
145-
146149
#define LZ4_WILDCOPY(s, d, e) \
147150
do { \
148151
LZ4_COPYPACKET(s, d); \

0 commit comments

Comments
 (0)