}
};
+ struct crc32c_16 {
+ typedef __le16 value_t;
+
+ // we have no execution context/state.
+ typedef int state_t;
+ static void init(state_t *state) {
+ }
+ static void fini(state_t *state) {
+ }
+
+ static value_t calc(
+ state_t state,
+ size_t len,
+ bufferlist::const_iterator& p
+ ) {
+ return p.crc32c(len, -1) & 0xffff;
+ }
+ };
+
+ struct crc32c_8 {
+ typedef __u8 value_t;
+
+ // we have no execution context/state.
+ typedef int state_t;
+ static void init(state_t *state) {
+ }
+ static void fini(state_t *state) {
+ }
+
+ static value_t calc(
+ state_t state,
+ size_t len,
+ bufferlist::const_iterator& p
+ ) {
+ return p.crc32c(len, -1) & 0xff;
+ }
+ };
+
struct xxhash32 {
typedef __le32 value_t;
Checksummer::calculate<Checksummer::crc32c>(
get_csum_chunk_size(), b_off, bl.length(), bl, &csum_data);
break;
+ case CSUM_CRC32C_16:
+ Checksummer::calculate<Checksummer::crc32c_16>(
+ get_csum_chunk_size(), b_off, bl.length(), bl, &csum_data);
+ break;
+ case CSUM_CRC32C_8:
+ Checksummer::calculate<Checksummer::crc32c_8>(
+ get_csum_chunk_size(), b_off, bl.length(), bl, &csum_data);
+ break;
}
}
*b_bad_off = Checksummer::verify<Checksummer::crc32c>(
get_csum_chunk_size(), b_off, bl.length(), bl, csum_data);
break;
+ case CSUM_CRC32C_16:
+ *b_bad_off = Checksummer::verify<Checksummer::crc32c_16>(
+ get_csum_chunk_size(), b_off, bl.length(), bl, csum_data);
+ break;
+ case CSUM_CRC32C_8:
+ *b_bad_off = Checksummer::verify<Checksummer::crc32c_8>(
+ get_csum_chunk_size(), b_off, bl.length(), bl, csum_data);
+ break;
default:
r = -EOPNOTSUPP;
break;
enum CSumType {
CSUM_NONE = 0,
- CSUM_CRC32C = 1,
- CSUM_XXHASH32 = 2,
- CSUM_XXHASH64 = 3,
+ CSUM_XXHASH32 = 1,
+ CSUM_XXHASH64 = 2,
+ CSUM_CRC32C = 3,
+ CSUM_CRC32C_16 = 4, // low 16 bits of crc32c
+ CSUM_CRC32C_8 = 5, // low 8 bits of crc32c
CSUM_MAX,
- CSUM_CRC16, // ** not yet implemented **
};
static const char *get_csum_type_string(unsigned t) {
switch (t) {
case CSUM_XXHASH32: return "xxhash32";
case CSUM_XXHASH64: return "xxhash64";
case CSUM_CRC32C: return "crc32c";
- case CSUM_CRC16: return "crc16";
+ case CSUM_CRC32C_16: return "crc32c_16";
+ case CSUM_CRC32C_8: return "crc32c_8";
default: return "???";
}
}
return CSUM_XXHASH64;
if (s == "crc32c")
return CSUM_CRC32C;
- if (s == "crc16")
- return CSUM_CRC16;
+ if (s == "crc32c_16")
+ return CSUM_CRC32C_16;
+ if (s == "crc32c_8")
+ return CSUM_CRC32C_8;
return -EINVAL;
}
case CSUM_XXHASH32: return 4;
case CSUM_XXHASH64: return 8;
case CSUM_CRC32C: return 4;
- case CSUM_CRC16: return 2;
+ case CSUM_CRC32C_16: return 2;
+ case CSUM_CRC32C_8: return 1;
default: return 0;
}
}