mirror of
https://github.com/XTXMarkets/ternfs.git
synced 2026-02-10 20:39:04 -06:00
Initial version really by Pawel, but many changes in between. Big outstanding issues: * span cache reclamation (unbounded memory otherwise...) * bad block service detection and workarounds * corrupted blocks detection and workaround Co-authored-by: Paweł Dziepak <pawel.dziepak@xtxmarkets.com>
25 lines
667 B
C
25 lines
667 B
C
#define ISCSI_POLY 0x82F63B78u
|
|
|
|
// Return a(x) multiplied by b(x) modulo ISCSI_POLY, For speed, this requires
|
|
// that a(x) not be zero.
|
|
static u32 crc32c_mult_mod_p(u32 a, u32 b) {
|
|
// m goes from x^0 to x^31
|
|
u32 m = 1u << 31;
|
|
u32 p = 0;
|
|
for (;;) {
|
|
// If a(x) contains x^n, add b(x)*x^n
|
|
if (a & m) {
|
|
p ^= b;
|
|
// Exit when there are no higher bits in a(x)
|
|
if ((a & (m - 1)) == 0) {
|
|
break;
|
|
}
|
|
}
|
|
// Go from x^n to x^(n+1)
|
|
m >>= 1;
|
|
// Go from b(x)*x^n to b(x)*x^(n+1)
|
|
b = (b & 1) ? ((b >> 1) ^ ISCSI_POLY) : b >> 1;
|
|
}
|
|
return p;
|
|
}
|