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 26const char raid6_empty_zero_page[PAGE_SIZE] __attribute__((aligned(256))); 27struct raid6_calls raid6_call; 28 29char *dataptrs[NDISKS]; 30char data[NDISKS][PAGE_SIZE]; 31char recovi[PAGE_SIZE], recovj[PAGE_SIZE]; 32 33void 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 45int 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} 104