diff options
Diffstat (limited to 'drivers/md/raid6test')
-rw-r--r-- | drivers/md/raid6test/Makefile | 58 | ||||
-rw-r--r-- | drivers/md/raid6test/test.c | 103 |
2 files changed, 161 insertions, 0 deletions
diff --git a/drivers/md/raid6test/Makefile b/drivers/md/raid6test/Makefile new file mode 100644 index 000000000000..557806728609 --- /dev/null +++ b/drivers/md/raid6test/Makefile | |||
@@ -0,0 +1,58 @@ | |||
1 | # | ||
2 | # This is a simple Makefile to test some of the RAID-6 code | ||
3 | # from userspace. | ||
4 | # | ||
5 | |||
6 | CC = gcc | ||
7 | OPTFLAGS = -O2 # Adjust as desired | ||
8 | CFLAGS = -I.. -g $(OPTFLAGS) | ||
9 | LD = ld | ||
10 | PERL = perl | ||
11 | |||
12 | .c.o: | ||
13 | $(CC) $(CFLAGS) -c -o $@ $< | ||
14 | |||
15 | %.c: ../%.c | ||
16 | cp -f $< $@ | ||
17 | |||
18 | %.uc: ../%.uc | ||
19 | cp -f $< $@ | ||
20 | |||
21 | all: raid6.o raid6test | ||
22 | |||
23 | raid6.o: raid6int1.o raid6int2.o raid6int4.o raid6int8.o raid6int16.o \ | ||
24 | raid6int32.o \ | ||
25 | raid6mmx.o raid6sse1.o raid6sse2.o \ | ||
26 | raid6recov.o raid6algos.o \ | ||
27 | raid6tables.o | ||
28 | $(LD) -r -o $@ $^ | ||
29 | |||
30 | raid6test: raid6.o test.c | ||
31 | $(CC) $(CFLAGS) -o raid6test $^ | ||
32 | |||
33 | raid6int1.c: raid6int.uc ../unroll.pl | ||
34 | $(PERL) ../unroll.pl 1 < raid6int.uc > $@ | ||
35 | |||
36 | raid6int2.c: raid6int.uc ../unroll.pl | ||
37 | $(PERL) ../unroll.pl 2 < raid6int.uc > $@ | ||
38 | |||
39 | raid6int4.c: raid6int.uc ../unroll.pl | ||
40 | $(PERL) ../unroll.pl 4 < raid6int.uc > $@ | ||
41 | |||
42 | raid6int8.c: raid6int.uc ../unroll.pl | ||
43 | $(PERL) ../unroll.pl 8 < raid6int.uc > $@ | ||
44 | |||
45 | raid6int16.c: raid6int.uc ../unroll.pl | ||
46 | $(PERL) ../unroll.pl 16 < raid6int.uc > $@ | ||
47 | |||
48 | raid6int32.c: raid6int.uc ../unroll.pl | ||
49 | $(PERL) ../unroll.pl 32 < raid6int.uc > $@ | ||
50 | |||
51 | raid6tables.c: mktables | ||
52 | ./mktables > raid6tables.c | ||
53 | |||
54 | clean: | ||
55 | rm -f *.o mktables mktables.c raid6int.uc raid6*.c raid6test | ||
56 | |||
57 | spotless: clean | ||
58 | rm -f *~ | ||
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 | } | ||