diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /drivers/md/raid6test/test.c |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'drivers/md/raid6test/test.c')
-rw-r--r-- | drivers/md/raid6test/test.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/drivers/md/raid6test/test.c b/drivers/md/raid6test/test.c new file mode 100644 index 000000000000..0d5cd57accd7 --- /dev/null +++ b/drivers/md/raid6test/test.c | |||
@@ -0,0 +1,103 @@ | |||
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 | } | ||