diff --git a/check.c b/check.c index e795238c..a9277c0a 100644 --- a/check.c +++ b/check.c @@ -112,7 +112,7 @@ static int is_hash_matching(struct snapraid_state* state, int rehash, unsigned d /* if we checked something, and no block failed the check */ if (hash_checked && j==failed_count) { /* recompute all the redundancy information */ - raid_par(state->level, buffer, diskmax, state->block_size); + raid_par(state->level, diskmax, state->block_size, buffer); return 1; } @@ -125,12 +125,12 @@ static int is_hash_matching(struct snapraid_state* state, int rehash, unsigned d static int is_parity_matching(struct snapraid_state* state, unsigned diskmax, unsigned i, unsigned char** buffer, unsigned char** buffer_recov) { /* recompute parity, note that we don't need parity over i */ - raid_par(i + 1, buffer, diskmax, state->block_size); + raid_par(i + 1, diskmax, state->block_size, buffer); /* if the recovered parity block matches */ if (memcmp(buffer[diskmax+i], buffer_recov[i], state->block_size) == 0) { /* recompute all the redundancy information */ - raid_par(state->level, buffer, diskmax, state->block_size); + raid_par(state->level, diskmax, state->block_size, buffer); return 1; } @@ -153,7 +153,7 @@ static int repair_step(struct snapraid_state* state, int rehash, unsigned pos, u /* no fix required */ if (failed_count == 0) { /* recompute only the parity */ - raid_par(state->level, buffer, diskmax, state->block_size); + raid_par(state->level, diskmax, state->block_size, buffer); return 0; } @@ -199,7 +199,7 @@ static int repair_step(struct snapraid_state* state, int rehash, unsigned pos, u memcpy(buffer[diskmax+p[i]], buffer_recov[p[i]], state->block_size); /* recover using one less parity, the p[r-1] one */ - raid_rec(r-1, d, p, buffer, diskmax, buffer_zero, state->block_size); + raid_rec(r-1, d, p, diskmax, state->block_size, buffer, buffer_zero); /* use the remaining p[r-1] parity to check the result */ if (is_parity_matching(state, diskmax, p[r-1], buffer, buffer_recov)) @@ -239,7 +239,7 @@ static int repair_step(struct snapraid_state* state, int rehash, unsigned pos, u memcpy(buffer[diskmax+p[i]], buffer_recov[p[i]], state->block_size); /* recover */ - raid_rec(r, d, p, buffer, diskmax, buffer_zero, state->block_size); + raid_rec(r, d, p, diskmax, state->block_size, buffer, buffer_zero); /* use the hash to check the result */ if (is_hash_matching(state, rehash, diskmax, failed, failed_map, failed_count, buffer, buffer_zero)) @@ -324,7 +324,7 @@ static int repair(struct snapraid_state* state, int rehash, unsigned pos, unsign /* if nothing to fix */ if (!something_to_recover) { /* recompute only the parity */ - raid_par(state->level, buffer, diskmax, state->block_size); + raid_par(state->level, diskmax, state->block_size, buffer); return 0; } diff --git a/raid.c b/raid.c index a62134df..14b876b5 100644 --- a/raid.c +++ b/raid.c @@ -217,7 +217,7 @@ /* * PAR1 (RAID5 with xor) 32bit C implementation */ -void raid_par1_int32(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par1_int32(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; int d, l; @@ -246,7 +246,7 @@ void raid_par1_int32(unsigned char** vbuf, unsigned ndata, unsigned size) /* * PAR1 (RAID5 with xor) 64bit C implementation */ -void raid_par1_int64(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par1_int64(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; int d, l; @@ -281,7 +281,7 @@ void raid_par1_int64(unsigned char** vbuf, unsigned ndata, unsigned size) * the typical cache block, and processing 128 bytes doesn't increase * performance. */ -void raid_par1_sse2(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par1_sse2(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; int d, l; @@ -372,7 +372,7 @@ static inline uint64_t d2_64(uint64_t v) /* * PAR2 (RAID6 with powers of 2) 32bit C implementation */ -void raid_par2_int32(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par2_int32(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -412,7 +412,7 @@ void raid_par2_int32(unsigned char** vbuf, unsigned ndata, unsigned size) /* * PAR2 (RAID6 with powers of 2) 64bit C implementation */ -void raid_par2_int64(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par2_int64(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -465,7 +465,7 @@ static const struct gfconst16 { /* * PAR2 (RAID6 with powers of 2) SSE2 implementation */ -void raid_par2_sse2(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par2_sse2(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -518,7 +518,7 @@ void raid_par2_sse2(unsigned char** vbuf, unsigned ndata, unsigned size) * * Note that it uses 16 registers, meaning that x64 is required. */ -void raid_par2_sse2ext(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par2_sse2ext(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -592,7 +592,7 @@ void raid_par2_sse2ext(unsigned char** vbuf, unsigned ndata, unsigned size) /* * PARz (triple parity with powers of 2^-1) 32bit C implementation */ -void raid_parz_int32(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_parz_int32(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -642,7 +642,7 @@ void raid_parz_int32(unsigned char** vbuf, unsigned ndata, unsigned size) /* * PARz (triple parity with powers of 2^-1) 64bit C implementation */ -void raid_parz_int64(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_parz_int64(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -693,7 +693,7 @@ void raid_parz_int64(unsigned char** vbuf, unsigned ndata, unsigned size) /* * PARz (triple parity with powers of 2^-1) SSE2 implementation */ -void raid_parz_sse2(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_parz_sse2(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -750,7 +750,7 @@ void raid_parz_sse2(unsigned char** vbuf, unsigned ndata, unsigned size) * * Note that it uses 16 registers, meaning that x64 is required. */ -void raid_parz_sse2ext(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_parz_sse2ext(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -831,7 +831,7 @@ void raid_parz_sse2ext(unsigned char** vbuf, unsigned ndata, unsigned size) * But this is only a kind of reference function, and we are not really * interested in speed. */ -void raid_par3_int8(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par3_int8(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -873,7 +873,7 @@ void raid_par3_int8(unsigned char** vbuf, unsigned ndata, unsigned size) /* * PAR3 (triple parity with Cauchy matrix) SSSE3 implementation */ -void raid_par3_ssse3(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par3_ssse3(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -969,7 +969,7 @@ void raid_par3_ssse3(unsigned char** vbuf, unsigned ndata, unsigned size) * * Note that it uses 16 registers, meaning that x64 is required. */ -void raid_par3_ssse3ext(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par3_ssse3ext(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -1109,7 +1109,7 @@ void raid_par3_ssse3ext(unsigned char** vbuf, unsigned ndata, unsigned size) * But this is only a kind of reference function, and we are not really * interested in speed. */ -void raid_par4_int8(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par4_int8(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -1156,7 +1156,7 @@ void raid_par4_int8(unsigned char** vbuf, unsigned ndata, unsigned size) /* * PAR4 (quad parity with Cauchy matrix) SSSE3 implementation */ -void raid_par4_ssse3(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par4_ssse3(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -1271,7 +1271,7 @@ void raid_par4_ssse3(unsigned char** vbuf, unsigned ndata, unsigned size) * * Note that it uses 16 registers, meaning that x64 is required. */ -void raid_par4_ssse3ext(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par4_ssse3ext(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -1443,7 +1443,7 @@ void raid_par4_ssse3ext(unsigned char** vbuf, unsigned ndata, unsigned size) * But this is only a kind of reference function, and we are not really * interested in speed. */ -void raid_par5_int8(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par5_int8(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -1499,7 +1499,7 @@ void raid_par5_int8(unsigned char** vbuf, unsigned ndata, unsigned size) /* ensures that stack is aligned at 16 bytes because we allocate SSE registers in it */ __attribute__((force_align_arg_pointer)) #endif -void raid_par5_ssse3(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par5_ssse3(unsigned ndata, unsigned size, unsigned char** vbuf) /* ensures that stack is aligned at 16 bytes because we allocate SSE registers in it */ { unsigned char* p; @@ -1635,7 +1635,7 @@ void raid_par5_ssse3(unsigned char** vbuf, unsigned ndata, unsigned size) * * Note that it uses 16 registers, meaning that x64 is required. */ -void raid_par5_ssse3ext(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par5_ssse3ext(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -1767,7 +1767,7 @@ void raid_par5_ssse3ext(unsigned char** vbuf, unsigned ndata, unsigned size) * But this is only a kind of reference function, and we are not really * interested in speed. */ -void raid_par6_int8(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par6_int8(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -1828,7 +1828,7 @@ void raid_par6_int8(unsigned char** vbuf, unsigned ndata, unsigned size) /* ensures that stack is aligned at 16 bytes because we allocate SSE registers in it */ __attribute__((force_align_arg_pointer)) #endif -void raid_par6_ssse3(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par6_ssse3(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -1985,7 +1985,7 @@ void raid_par6_ssse3(unsigned char** vbuf, unsigned ndata, unsigned size) * * Note that it uses 16 registers, meaning that x64 is required. */ -void raid_par6_ssse3ext(unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par6_ssse3ext(unsigned ndata, unsigned size, unsigned char** vbuf) { unsigned char* p; unsigned char* q; @@ -2140,28 +2140,28 @@ void raid_set(unsigned mode) /* parity generation */ /* internal forwarder */ -static void (*raid_par1_ptr)(unsigned char** vbuf, unsigned ndata, unsigned size); -static void (*raid_par2_ptr)(unsigned char** vbuf, unsigned ndata, unsigned size); -static void (*raid_parz_ptr)(unsigned char** vbuf, unsigned ndata, unsigned size); -static void (*raid_par3_ptr)(unsigned char** vbuf, unsigned ndata, unsigned size); -static void (*raid_par4_ptr)(unsigned char** vbuf, unsigned ndata, unsigned size); -static void (*raid_par5_ptr)(unsigned char** vbuf, unsigned ndata, unsigned size); -static void (*raid_par6_ptr)(unsigned char** vbuf, unsigned ndata, unsigned size); +static void (*raid_par1_ptr)(unsigned ndata, unsigned size, unsigned char** vbuf); +static void (*raid_par2_ptr)(unsigned ndata, unsigned size, unsigned char** vbuf); +static void (*raid_parz_ptr)(unsigned ndata, unsigned size, unsigned char** vbuf); +static void (*raid_par3_ptr)(unsigned ndata, unsigned size, unsigned char** vbuf); +static void (*raid_par4_ptr)(unsigned ndata, unsigned size, unsigned char** vbuf); +static void (*raid_par5_ptr)(unsigned ndata, unsigned size, unsigned char** vbuf); +static void (*raid_par6_ptr)(unsigned ndata, unsigned size, unsigned char** vbuf); -void raid_par(unsigned npar, unsigned char** vbuf, unsigned ndata, unsigned size) +void raid_par(unsigned npar, unsigned ndata, unsigned size, unsigned char** vbuf) { switch (npar) { - case 1 : raid_par1_ptr(vbuf, ndata, size); break; - case 2 : raid_par2_ptr(vbuf, ndata, size); break; + case 1 : raid_par1_ptr(ndata, size, vbuf); break; + case 2 : raid_par2_ptr(ndata, size, vbuf); break; case 3 : if (raid_mode == RAID_MODE_CAUCHY) - raid_par3_ptr(vbuf, ndata, size); + raid_par3_ptr(ndata, size, vbuf); else - raid_parz_ptr(vbuf, ndata, size); + raid_parz_ptr(ndata, size, vbuf); break; - case 4 : raid_par4_ptr(vbuf, ndata, size); break; - case 5 : raid_par5_ptr(vbuf, ndata, size); break; - case 6 : raid_par6_ptr(vbuf, ndata, size); break; + case 4 : raid_par4_ptr(ndata, size, vbuf); break; + case 5 : raid_par5_ptr(ndata, size, vbuf); break; + case 6 : raid_par6_ptr(ndata, size, vbuf); break; default: fprintf(stderr, "Invalid raid gen level\n"); exit(EXIT_FAILURE); @@ -2228,7 +2228,7 @@ static inline const unsigned char* table(unsigned char v) * Note that all the other parities not in the c[] vector * are destroyed. */ -static inline void raid_delta_gen(unsigned nrec, const int* d, const int* c, unsigned char** vbuf, unsigned ndata, unsigned char* zero, unsigned size) +static inline void raid_delta_gen(unsigned nrec, const int* d, const int* c, unsigned ndata, unsigned size, unsigned char** vbuf, unsigned char* zero) { unsigned char* p[RAID_PARITY_CAUCHY_MAX]; unsigned char* pa[RAID_PARITY_CAUCHY_MAX]; @@ -2251,7 +2251,7 @@ static inline void raid_delta_gen(unsigned nrec, const int* d, const int* c, uns } /* compute only for the nrec we really need */ - raid_par(c[nrec - 1] + 1, vbuf, ndata, size); + raid_par(c[nrec - 1] + 1, ndata, size, vbuf); for(i=0;ilevel, buffer, diskmax, state->block_size); + raid_par(state->level, diskmax, state->block_size, buffer); /* compare the parity */ for(l=0;llevel;++l) { diff --git a/selftest.c b/selftest.c index 2365f6e7..65476d3d 100644 --- a/selftest.c +++ b/selftest.c @@ -93,30 +93,30 @@ static void recovtest(unsigned mode, unsigned ndata, unsigned block_size) unsigned char* waste; unsigned buffermax; int d[LEV_MAX]; - int p[LEV_MAX]; + int c[LEV_MAX]; unsigned i; unsigned j; - unsigned r; - void (*map[LEV_MAX][4])(unsigned level, const int* d, const int* c, unsigned char** vbuf, unsigned data, unsigned char* zero, unsigned size); - unsigned mac[LEV_MAX]; unsigned nrec; + void (*map[LEV_MAX][4])(unsigned nrec, const int* d, const int* c, unsigned ndata, unsigned size, unsigned char** vbuf, unsigned char* zero); + unsigned mac[LEV_MAX]; + unsigned npar; raid_set(mode); if (mode == RAID_MODE_CAUCHY) - nrec = RAID_PARITY_CAUCHY_MAX; + npar = RAID_PARITY_CAUCHY_MAX; else - nrec = RAID_PARITY_VANDERMONDE_MAX; + npar = RAID_PARITY_VANDERMONDE_MAX; - buffermax = ndata + nrec * 2 + 2; + buffermax = ndata + npar * 2 + 2; buffer = malloc_nofail_vector_align(ndata, buffermax, block_size, &buffer_alloc); mtest_vector(buffer, buffermax, block_size); data = buffer; parity = buffer + ndata; - test = buffer + ndata + nrec; + test = buffer + ndata + npar; - for(i=0;ilevel, buffer, diskmax, state->block_size); + raid_par(state->level, diskmax, state->block_size, buffer); /* write the parity */ for(l=0;llevel;++l) {