1 /* -*- linux-c -*- ------------------------------------------------------- *
3 * Copyright 2002-2007 H. Peter Anvin - All Rights Reserved
5 * This file is part of the Linux kernel, and is made available under
6 * the terms of the GNU General Public License version 2 or (at your
7 * option) any later version; incorporated herein by reference.
9 * ----------------------------------------------------------------------- */
14 * Test RAID-6 recovery with various algorithms
20 #include <linux/raid/pq.h>
22 #define NDISKS 16 /* Including P and Q */
24 const char raid6_empty_zero_page
[PAGE_SIZE
] __attribute__((aligned(256)));
25 struct raid6_calls raid6_call
;
27 char *dataptrs
[NDISKS
];
28 char data
[NDISKS
][PAGE_SIZE
];
29 char recovi
[PAGE_SIZE
], recovj
[PAGE_SIZE
];
31 static void makedata(int start
, int stop
)
35 for (i
= start
; i
<= stop
; i
++) {
36 for (j
= 0; j
< PAGE_SIZE
; j
++)
39 dataptrs
[i
] = data
[i
];
43 static char disk_type(int d
)
55 static int test_disks(int i
, int j
)
59 memset(recovi
, 0xf0, PAGE_SIZE
);
60 memset(recovj
, 0xba, PAGE_SIZE
);
65 raid6_dual_recov(NDISKS
, PAGE_SIZE
, i
, j
, (void **)&dataptrs
);
67 erra
= memcmp(data
[i
], recovi
, PAGE_SIZE
);
68 errb
= memcmp(data
[j
], recovj
, PAGE_SIZE
);
70 if (i
< NDISKS
-2 && j
== NDISKS
-1) {
71 /* We don't implement the DQ failure scenario, since it's
72 equivalent to a RAID-5 failure (XOR, then recompute Q) */
75 printf("algo=%-8s faila=%3d(%c) failb=%3d(%c) %s\n",
79 (!erra
&& !errb
) ? "OK" :
81 !errb
? "ERRA" : "ERRAB");
84 dataptrs
[i
] = data
[i
];
85 dataptrs
[j
] = data
[j
];
90 int main(int argc
, char *argv
[])
92 const struct raid6_calls
*const *algo
;
93 const struct raid6_recov_calls
*const *ra
;
97 makedata(0, NDISKS
-1);
99 for (ra
= raid6_recov_algos
; *ra
; ra
++) {
100 if ((*ra
)->valid
&& !(*ra
)->valid())
103 raid6_2data_recov
= (*ra
)->data2
;
104 raid6_datap_recov
= (*ra
)->datap
;
106 printf("using recovery %s\n", (*ra
)->name
);
108 for (algo
= raid6_algos
; *algo
; algo
++) {
109 if ((*algo
)->valid
&& !(*algo
)->valid())
115 memset(data
[NDISKS
-2], 0xee, 2*PAGE_SIZE
);
117 /* Generate assumed good syndrome */
118 raid6_call
.gen_syndrome(NDISKS
, PAGE_SIZE
,
121 for (i
= 0; i
< NDISKS
-1; i
++)
122 for (j
= i
+1; j
< NDISKS
; j
++)
123 err
+= test_disks(i
, j
);
125 if (!raid6_call
.xor_syndrome
)
128 for (p1
= 0; p1
< NDISKS
-2; p1
++)
129 for (p2
= p1
; p2
< NDISKS
-2; p2
++) {
131 /* Simulate rmw run */
132 raid6_call
.xor_syndrome(NDISKS
, p1
, p2
, PAGE_SIZE
,
135 raid6_call
.xor_syndrome(NDISKS
, p1
, p2
, PAGE_SIZE
,
138 for (i
= 0; i
< NDISKS
-1; i
++)
139 for (j
= i
+1; j
< NDISKS
; j
++)
140 err
+= test_disks(i
, j
);
148 /* Pick the best algorithm test */
152 printf("\n*** ERRORS FOUND ***\n");