restripe.c (mdadm-4.1) | : | restripe.c (mdadm-4.2) | ||
---|---|---|---|---|
skipping to change at line 336 | skipping to change at line 336 | |||
/* Compute inverse table x^-1 == x^254 */ | /* Compute inverse table x^-1 == x^254 */ | |||
for (i = 0; i < 256; i++) | for (i = 0; i < 256; i++) | |||
raid6_gfinv[i] = gfpow(i, 254); | raid6_gfinv[i] = gfpow(i, 254); | |||
/* Compute inv(2^x + 1) (exponent-xor-inverse) table */ | /* Compute inv(2^x + 1) (exponent-xor-inverse) table */ | |||
for (i = 0; i < 256; i ++) | for (i = 0; i < 256; i ++) | |||
raid6_gfexi[i] = raid6_gfinv[raid6_gfexp[i] ^ 1]; | raid6_gfexi[i] = raid6_gfinv[raid6_gfexp[i] ^ 1]; | |||
/* Compute log and inverse log */ | /* Compute log and inverse log */ | |||
/* Modified code from: | /* Modified code from: | |||
* http://web.eecs.utk.edu/~plank/plank/papers/CS-96-332.html | * https://web.eecs.utk.edu/~plank/plank/papers/CS-96-332.html | |||
*/ | */ | |||
b = 1; | b = 1; | |||
raid6_gflog[0] = 0; | raid6_gflog[0] = 0; | |||
raid6_gfilog[255] = 0; | raid6_gfilog[255] = 0; | |||
for (log = 0; log < 255; log++) { | for (log = 0; log < 255; log++) { | |||
raid6_gflog[b] = (uint8_t) log; | raid6_gflog[b] = (uint8_t) log; | |||
raid6_gfilog[log] = (uint8_t) b; | raid6_gfilog[log] = (uint8_t) b; | |||
b = b << 1; | b = b << 1; | |||
if (b & 256) b = b ^ 0435; | if (b & 256) b = b ^ 0435; | |||
skipping to change at line 869 | skipping to change at line 869 | |||
if (!tables_ready) | if (!tables_ready) | |||
make_tables(); | make_tables(); | |||
for ( i = 0 ; i < raid_disks ; i++) | for ( i = 0 ; i < raid_disks ; i++) | |||
stripes[i] = stripe_buf + i * chunk_size; | stripes[i] = stripe_buf + i * chunk_size; | |||
while (length > 0) { | while (length > 0) { | |||
int disk; | int disk; | |||
for (i = 0 ; i < raid_disks ; i++) { | for (i = 0 ; i < raid_disks ; i++) { | |||
lseek64(source[i], offsets[i]+start, 0); | if ((lseek64(source[i], offsets[i]+start, 0) < 0) || | |||
read(source[i], stripes[i], chunk_size); | (read(source[i], stripes[i], chunk_size) != | |||
chunk_size)) { | ||||
free(q); | ||||
free(p); | ||||
free(blocks); | ||||
free(stripes); | ||||
free(stripe_buf); | ||||
return -1; | ||||
} | ||||
} | } | |||
for (i = 0 ; i < data_disks ; i++) { | for (i = 0 ; i < data_disks ; i++) { | |||
int disk = geo_map(i, start/chunk_size, raid_disks, | int disk = geo_map(i, start/chunk_size, raid_disks, | |||
level, layout); | level, layout); | |||
blocks[i] = stripes[disk]; | blocks[i] = stripes[disk]; | |||
printf("%d->%d\n", i, disk); | printf("%d->%d\n", i, disk); | |||
} | } | |||
switch(level) { | switch(level) { | |||
case 6: | case 6: | |||
qsyndrome(p, q, (uint8_t**)blocks, data_disks, chunk_size ); | qsyndrome(p, q, (uint8_t**)blocks, data_disks, chunk_size ); | |||
End of changes. 2 change blocks. | ||||
3 lines changed or deleted | 11 lines changed or added |