BCH_CSUM_CHACHA20_POLY1305_128 = 4,
BCH_CSUM_CRC32C = 5,
BCH_CSUM_CRC64 = 6,
- BCH_CSUM_NR = 7,
+ BCH_CSUM_XXHASH = 7,
+ BCH_CSUM_NR = 8,
};
static const unsigned bch_crc_bytes[] = {
[BCH_CSUM_CRC32C] = 4,
[BCH_CSUM_CRC64_NONZERO] = 8,
[BCH_CSUM_CRC64] = 8,
+ [BCH_CSUM_XXHASH] = 8,
[BCH_CSUM_CHACHA20_POLY1305_80] = 10,
[BCH_CSUM_CHACHA20_POLY1305_128] = 16,
};
#define BCH_CSUM_OPTS() \
x(none, 0) \
x(crc32c, 1) \
- x(crc64, 2)
+ x(crc64, 2) \
+ x(xxhash, 3)
enum bch_csum_opts {
#define x(t, n) BCH_CSUM_OPT_##t = n,
#include <linux/crc32c.h>
#include <linux/crypto.h>
+#include <linux/xxhash.h>
#include <linux/key.h>
#include <linux/random.h>
#include <linux/scatterlist.h>
struct bch2_checksum_state {
union {
u64 seed;
+ struct xxh64_state h64state;
};
unsigned int type;
};
case BCH_CSUM_CRC64_NONZERO:
state->seed = U64_MAX;
break;
+ case BCH_CSUM_XXHASH:
+ xxh64_reset(&state->h64state, 0);
+ break;
default:
BUG();
}
return state->seed ^ U32_MAX;
case BCH_CSUM_CRC64_NONZERO:
return state->seed ^ U64_MAX;
+ case BCH_CSUM_XXHASH:
+ return xxh64_digest(&state->h64state);
default:
BUG();
}
case BCH_CSUM_CRC64:
state->seed = crc64_be(state->seed, data, len);
break;
+ case BCH_CSUM_XXHASH:
+ xxh64_update(&state->h64state, data, len);
+ break;
default:
BUG();
}
case BCH_CSUM_CRC32C_NONZERO:
case BCH_CSUM_CRC64_NONZERO:
case BCH_CSUM_CRC32C:
+ case BCH_CSUM_XXHASH:
case BCH_CSUM_CRC64: {
struct bch2_checksum_state state;
case BCH_CSUM_CRC32C_NONZERO:
case BCH_CSUM_CRC64_NONZERO:
case BCH_CSUM_CRC32C:
+ case BCH_CSUM_XXHASH:
case BCH_CSUM_CRC64: {
struct bch2_checksum_state state;
return data ? BCH_CSUM_CRC32C : BCH_CSUM_CRC32C_NONZERO;
case BCH_CSUM_OPT_crc64:
return data ? BCH_CSUM_CRC64 : BCH_CSUM_CRC64_NONZERO;
+ case BCH_CSUM_OPT_xxhash:
+ return BCH_CSUM_XXHASH;
default:
BUG();
}