[PATCH] xfsprogs: fix crc32 build on big endian While kernelspace can test #ifdef __LITTLE_ENDIAN, this doesn't work in userspace. __LITTLE_ENDIAN is defined - as is __BIG_ENDIAN. So we build on all boxes as __LITTLE_ENDIAN, and the self-test (thankfully!) fails on big endian boxes. Fix this by testing __BYTE_ORDER values. And add an else which should never be hit, but just in case... Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner --- diff --git a/libxfs/crc32.c b/libxfs/crc32.c index 1c0d958..0f847d2 100644 --- a/libxfs/crc32.c +++ b/libxfs/crc32.c @@ -63,18 +63,20 @@ typedef __u32 u64; static inline u32 crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256]) { -# ifdef __LITTLE_ENDIAN +#if __BYTE_ORDER == __LITTLE_ENDIAN # define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8) # define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \ t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255]) # define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \ t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255]) -# else +# elif __BYTE_ORDER == __BIG_ENDIAN # define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8) # define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \ t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255]) # define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \ t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255]) +# else +# error What endian are you? # endif const u32 *b; size_t rem_len;