Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* -*- linux-c -*- ------------------------------------------------------- * |
2 | * | |
3 | * Copyright 2002 H. Peter Anvin - All Rights Reserved | |
4 | * | |
5 | * This program is free software; you can redistribute it and/or modify | |
6 | * it under the terms of the GNU General Public License as published by | |
7 | * the Free Software Foundation, Inc., 53 Temple Place Ste 330, | |
8 | * Bostom MA 02111-1307, USA; either version 2 of the License, or | |
9 | * (at your option) any later version; incorporated herein by reference. | |
10 | * | |
11 | * ----------------------------------------------------------------------- */ | |
12 | ||
13 | /* | |
14 | * raid6test.c | |
15 | * | |
16 | * Test RAID-6 recovery with various algorithms | |
17 | */ | |
18 | ||
19 | #include <stdlib.h> | |
20 | #include <stdio.h> | |
21 | #include <string.h> | |
22 | #include "raid6.h" | |
23 | ||
24 | #define NDISKS 16 /* Including P and Q */ | |
25 | ||
26 | const char raid6_empty_zero_page[PAGE_SIZE] __attribute__((aligned(256))); | |
27 | struct raid6_calls raid6_call; | |
28 | ||
29 | char *dataptrs[NDISKS]; | |
30 | char data[NDISKS][PAGE_SIZE]; | |
31 | char recovi[PAGE_SIZE], recovj[PAGE_SIZE]; | |
32 | ||
33 | void makedata(void) | |
34 | { | |
35 | int i, j; | |
36 | ||
37 | for ( i = 0 ; i < NDISKS ; i++ ) { | |
38 | for ( j = 0 ; j < PAGE_SIZE ; j++ ) { | |
39 | data[i][j] = rand(); | |
40 | } | |
41 | dataptrs[i] = data[i]; | |
42 | } | |
43 | } | |
44 | ||
45 | int main(int argc, char *argv[]) | |
46 | { | |
47 | const struct raid6_calls * const * algo; | |
48 | int i, j; | |
49 | int erra, errb; | |
50 | ||
51 | makedata(); | |
52 | ||
53 | for ( algo = raid6_algos ; *algo ; algo++ ) { | |
54 | if ( !(*algo)->valid || (*algo)->valid() ) { | |
55 | raid6_call = **algo; | |
56 | ||
57 | /* Nuke syndromes */ | |
58 | memset(data[NDISKS-2], 0xee, 2*PAGE_SIZE); | |
59 | ||
60 | /* Generate assumed good syndrome */ | |
61 | raid6_call.gen_syndrome(NDISKS, PAGE_SIZE, (void **)&dataptrs); | |
62 | ||
63 | for ( i = 0 ; i < NDISKS-1 ; i++ ) { | |
64 | for ( j = i+1 ; j < NDISKS ; j++ ) { | |
65 | memset(recovi, 0xf0, PAGE_SIZE); | |
66 | memset(recovj, 0xba, PAGE_SIZE); | |
67 | ||
68 | dataptrs[i] = recovi; | |
69 | dataptrs[j] = recovj; | |
70 | ||
71 | raid6_dual_recov(NDISKS, PAGE_SIZE, i, j, (void **)&dataptrs); | |
72 | ||
73 | erra = memcmp(data[i], recovi, PAGE_SIZE); | |
74 | errb = memcmp(data[j], recovj, PAGE_SIZE); | |
75 | ||
76 | if ( i < NDISKS-2 && j == NDISKS-1 ) { | |
77 | /* We don't implement the DQ failure scenario, since it's | |
78 | equivalent to a RAID-5 failure (XOR, then recompute Q) */ | |
79 | } else { | |
80 | printf("algo=%-8s faila=%3d(%c) failb=%3d(%c) %s\n", | |
81 | raid6_call.name, | |
82 | i, (i==NDISKS-2)?'P':'D', | |
83 | j, (j==NDISKS-1)?'Q':(j==NDISKS-2)?'P':'D', | |
84 | (!erra && !errb) ? "OK" : | |
85 | !erra ? "ERRB" : | |
86 | !errb ? "ERRA" : | |
87 | "ERRAB"); | |
88 | } | |
89 | ||
90 | dataptrs[i] = data[i]; | |
91 | dataptrs[j] = data[j]; | |
92 | } | |
93 | } | |
94 | } | |
95 | printf("\n"); | |
96 | } | |
97 | ||
98 | printf("\n"); | |
99 | /* Pick the best algorithm test */ | |
100 | raid6_select_algo(); | |
101 | ||
102 | return 0; | |
103 | } |