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(void)
35 for (i
= 0; i
< NDISKS
; 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
;
99 for (ra
= raid6_recov_algos
; *ra
; ra
++) {
100 if ((*ra
)->valid
&& !(*ra
)->valid())
102 raid6_2data_recov
= (*ra
)->data2
;
103 raid6_datap_recov
= (*ra
)->datap
;
105 printf("using recovery %s\n", (*ra
)->name
);
107 for (algo
= raid6_algos
; *algo
; algo
++) {
108 if (!(*algo
)->valid
|| (*algo
)->valid()) {
112 memset(data
[NDISKS
-2], 0xee, 2*PAGE_SIZE
);
114 /* Generate assumed good syndrome */
115 raid6_call
.gen_syndrome(NDISKS
, PAGE_SIZE
,
118 for (i
= 0; i
< NDISKS
-1; i
++)
119 for (j
= i
+1; j
< NDISKS
; j
++)
120 err
+= test_disks(i
, j
);
127 /* Pick the best algorithm test */
131 printf("\n*** ERRORS FOUND ***\n");