2011-03-01 22:19:30 +01:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
< html lang = "en" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" >
< title > LCOV - lcov.info - raid/module.c< / title >
< link rel = "stylesheet" type = "text/css" href = "../gcov.css" >
< / head >
< body >
< table width = "100%" border = 0 cellspacing = 0 cellpadding = 0 >
< tr > < td class = "title" > LCOV - code coverage report< / td > < / tr >
< tr > < td class = "ruler" > < img src = "../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< tr >
< td width = "100%" >
< table cellpadding = 1 border = 0 width = "100%" >
< tr >
< td width = "10%" class = "headerItem" > Current view:< / td >
< td width = "35%" class = "headerValue" > < a href = "../index.html" > top level< / a > - < a href = "index.html" > raid< / a > - module.c< span style = "font-size: 80%;" > (source / < a href = "module.c.func.html" > functions< / a > )< / span > < / td >
< td width = "5%" > < / td >
< td width = "15%" > < / td >
< td width = "10%" class = "headerCovTableHead" > Hit< / td >
< td width = "10%" class = "headerCovTableHead" > Total< / td >
< td width = "15%" class = "headerCovTableHead" > Coverage< / td >
< / tr >
< tr >
< td class = "headerItem" > Test:< / td >
< td class = "headerValue" > lcov.info< / td >
< td > < / td >
< td class = "headerItem" > Lines:< / td >
< td class = "headerCovTableEntry" > 159< / td >
2016-11-06 18:46:14 +01:00
< td class = "headerCovTableEntry" > 159< / td >
< td class = "headerCovTableEntryHi" > 100.0 %< / td >
2011-03-01 22:19:30 +01:00
< / tr >
< tr >
< td class = "headerItem" > Date:< / td >
2016-11-21 19:48:21 +01:00
< td class = "headerValue" > 2016-11-21< / td >
2011-03-01 22:19:30 +01:00
< td > < / td >
< td class = "headerItem" > Functions:< / td >
< td class = "headerCovTableEntry" > 7< / td >
< td class = "headerCovTableEntry" > 7< / td >
< td class = "headerCovTableEntryHi" > 100.0 %< / td >
< / tr >
< tr > < td > < img src = "../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< / table >
< / td >
< / tr >
< tr > < td class = "ruler" > < img src = "../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< / table >
< table cellpadding = 0 cellspacing = 0 border = 0 >
< tr >
< td > < br > < / td >
< / tr >
< tr >
< td >
< pre class = "sourceHeading" > Line data Source code< / pre >
< pre class = "source" >
< a name = "1" > < span class = "lineNum" > 1 < / span > : /*< / a >
< span class = "lineNum" > 2 < / span > : * Copyright (C) 2013 Andrea Mazzoleni
< span class = "lineNum" > 3 < / span > : *
< span class = "lineNum" > 4 < / span > : * This program is free software: you can redistribute it and/or modify
< span class = "lineNum" > 5 < / span > : * it under the terms of the GNU General Public License as published by
< span class = "lineNum" > 6 < / span > : * the Free Software Foundation, either version 2 of the License, or
< span class = "lineNum" > 7 < / span > : * (at your option) any later version.
< span class = "lineNum" > 8 < / span > : *
< span class = "lineNum" > 9 < / span > : * This program is distributed in the hope that it will be useful,
< span class = "lineNum" > 10 < / span > : * but WITHOUT ANY WARRANTY; without even the implied warranty of
< span class = "lineNum" > 11 < / span > : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
< span class = "lineNum" > 12 < / span > : * GNU General Public License for more details.
< span class = "lineNum" > 13 < / span > : */
< span class = "lineNum" > 14 < / span > :
< span class = "lineNum" > 15 < / span > : #include " internal.h"
< span class = "lineNum" > 16 < / span > : #include " memory.h"
< span class = "lineNum" > 17 < / span > : #include " cpu.h"
< span class = "lineNum" > 18 < / span > :
< span class = "lineNum" > 19 < / span > : /*
< a name = "20" > < span class = "lineNum" > 20 < / span > : * Initializes and selects the best algorithm.< / a >
< span class = "lineNum" > 21 < / span > : */
2016-11-21 19:48:21 +01:00
< span class = "lineNum" > 22 < / span > < span class = "lineCov" > 271 : void raid_init(void)< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 23 < / span > : {
2016-11-21 19:48:21 +01:00
< span class = "lineNum" > 24 < / span > < span class = "lineCov" > 271 : raid_gen3_ptr = raid_gen3_int8;< / span >
< span class = "lineNum" > 25 < / span > < span class = "lineCov" > 271 : raid_gen_ptr[3] = raid_gen4_int8;< / span >
< span class = "lineNum" > 26 < / span > < span class = "lineCov" > 271 : raid_gen_ptr[4] = raid_gen5_int8;< / span >
< span class = "lineNum" > 27 < / span > < span class = "lineCov" > 271 : raid_gen_ptr[5] = raid_gen6_int8;< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 28 < / span > :
< span class = "lineNum" > 29 < / span > : if (sizeof(void *) == 4) {
2016-11-21 19:48:21 +01:00
< span class = "lineNum" > 30 < / span > < span class = "lineCov" > 271 : raid_gen_ptr[0] = raid_gen1_int32;< / span >
< span class = "lineNum" > 31 < / span > < span class = "lineCov" > 271 : raid_gen_ptr[1] = raid_gen2_int32;< / span >
< span class = "lineNum" > 32 < / span > < span class = "lineCov" > 271 : raid_genz_ptr = raid_genz_int32;< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 33 < / span > : } else {
< span class = "lineNum" > 34 < / span > : raid_gen_ptr[0] = raid_gen1_int64;
< span class = "lineNum" > 35 < / span > : raid_gen_ptr[1] = raid_gen2_int64;
< span class = "lineNum" > 36 < / span > : raid_genz_ptr = raid_genz_int64;
< span class = "lineNum" > 37 < / span > : }
< span class = "lineNum" > 38 < / span > :
2016-11-21 19:48:21 +01:00
< span class = "lineNum" > 39 < / span > < span class = "lineCov" > 271 : raid_rec_ptr[0] = raid_rec1_int8;< / span >
< span class = "lineNum" > 40 < / span > < span class = "lineCov" > 271 : raid_rec_ptr[1] = raid_rec2_int8;< / span >
< span class = "lineNum" > 41 < / span > < span class = "lineCov" > 271 : raid_rec_ptr[2] = raid_recX_int8;< / span >
< span class = "lineNum" > 42 < / span > < span class = "lineCov" > 271 : raid_rec_ptr[3] = raid_recX_int8;< / span >
< span class = "lineNum" > 43 < / span > < span class = "lineCov" > 271 : raid_rec_ptr[4] = raid_recX_int8;< / span >
< span class = "lineNum" > 44 < / span > < span class = "lineCov" > 271 : raid_rec_ptr[5] = raid_recX_int8;< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 45 < / span > :
< span class = "lineNum" > 46 < / span > : #ifdef CONFIG_X86
< span class = "lineNum" > 47 < / span > : #ifdef CONFIG_SSE2
2016-11-21 19:48:21 +01:00
< span class = "lineNum" > 48 < / span > < span class = "lineCov" > 271 : if (raid_cpu_has_sse2()) {< / span >
< span class = "lineNum" > 49 < / span > < span class = "lineCov" > 271 : raid_gen_ptr[0] = raid_gen1_sse2;< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 50 < / span > : #ifdef CONFIG_X86_64
< span class = "lineNum" > 51 < / span > : if (raid_cpu_has_slowextendedreg()) {
< span class = "lineNum" > 52 < / span > : raid_gen_ptr[1] = raid_gen2_sse2;
2015-11-13 22:48:15 +01:00
< span class = "lineNum" > 53 < / span > : } else {
< span class = "lineNum" > 54 < / span > : raid_gen_ptr[1] = raid_gen2_sse2ext;
< span class = "lineNum" > 55 < / span > : }
< span class = "lineNum" > 56 < / span > : /* note that raid_cpu_has_slowextendedreg() doesn't affect parz */
< span class = "lineNum" > 57 < / span > : raid_genz_ptr = raid_genz_sse2ext;
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 58 < / span > : #else
2016-11-21 19:48:21 +01:00
< span class = "lineNum" > 59 < / span > < span class = "lineCov" > 271 : raid_gen_ptr[1] = raid_gen2_sse2;< / span >
< span class = "lineNum" > 60 < / span > < span class = "lineCov" > 271 : raid_genz_ptr = raid_genz_sse2;< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 61 < / span > : #endif
< span class = "lineNum" > 62 < / span > : }
< span class = "lineNum" > 63 < / span > : #endif
< span class = "lineNum" > 64 < / span > :
< span class = "lineNum" > 65 < / span > : #ifdef CONFIG_SSSE3
2016-11-21 19:48:21 +01:00
< span class = "lineNum" > 66 < / span > < span class = "lineCov" > 271 : if (raid_cpu_has_ssse3()) {< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 67 < / span > : #ifdef CONFIG_X86_64
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 68 < / span > : if (raid_cpu_has_slowextendedreg()) {
< span class = "lineNum" > 69 < / span > : raid_gen3_ptr = raid_gen3_ssse3;
< span class = "lineNum" > 70 < / span > : raid_gen_ptr[3] = raid_gen4_ssse3;
< span class = "lineNum" > 71 < / span > : raid_gen_ptr[4] = raid_gen5_ssse3;
< span class = "lineNum" > 72 < / span > : raid_gen_ptr[5] = raid_gen6_ssse3;
< span class = "lineNum" > 73 < / span > : } else {
< span class = "lineNum" > 74 < / span > : raid_gen3_ptr = raid_gen3_ssse3ext;
< span class = "lineNum" > 75 < / span > : raid_gen_ptr[3] = raid_gen4_ssse3ext;
< span class = "lineNum" > 76 < / span > : raid_gen_ptr[4] = raid_gen5_ssse3ext;
< span class = "lineNum" > 77 < / span > : raid_gen_ptr[5] = raid_gen6_ssse3ext;
< span class = "lineNum" > 78 < / span > : }
< span class = "lineNum" > 79 < / span > : #else
2016-11-21 19:48:21 +01:00
< span class = "lineNum" > 80 < / span > < span class = "lineCov" > 270 : raid_gen3_ptr = raid_gen3_ssse3;< / span >
< span class = "lineNum" > 81 < / span > < span class = "lineCov" > 270 : raid_gen_ptr[3] = raid_gen4_ssse3;< / span >
< span class = "lineNum" > 82 < / span > < span class = "lineCov" > 270 : raid_gen_ptr[4] = raid_gen5_ssse3;< / span >
< span class = "lineNum" > 83 < / span > < span class = "lineCov" > 270 : raid_gen_ptr[5] = raid_gen6_ssse3;< / span >
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 84 < / span > : #endif
2016-11-21 19:48:21 +01:00
< span class = "lineNum" > 85 < / span > < span class = "lineCov" > 270 : raid_rec_ptr[0] = raid_rec1_ssse3;< / span >
< span class = "lineNum" > 86 < / span > < span class = "lineCov" > 270 : raid_rec_ptr[1] = raid_rec2_ssse3;< / span >
< span class = "lineNum" > 87 < / span > < span class = "lineCov" > 270 : raid_rec_ptr[2] = raid_recX_ssse3;< / span >
< span class = "lineNum" > 88 < / span > < span class = "lineCov" > 270 : raid_rec_ptr[3] = raid_recX_ssse3;< / span >
< span class = "lineNum" > 89 < / span > < span class = "lineCov" > 270 : raid_rec_ptr[4] = raid_recX_ssse3;< / span >
< span class = "lineNum" > 90 < / span > < span class = "lineCov" > 270 : raid_rec_ptr[5] = raid_recX_ssse3;< / span >
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 91 < / span > : }
< span class = "lineNum" > 92 < / span > : #endif
< span class = "lineNum" > 93 < / span > :
< span class = "lineNum" > 94 < / span > : #ifdef CONFIG_AVX2
2016-11-21 19:48:21 +01:00
< span class = "lineNum" > 95 < / span > < span class = "lineCov" > 271 : if (raid_cpu_has_avx2()) {< / span >
2016-11-06 18:46:14 +01:00
< span class = "lineNum" > 96 < / span > < span class = "lineCov" > 2 : raid_gen_ptr[0] = raid_gen1_avx2;< / span >
< span class = "lineNum" > 97 < / span > < span class = "lineCov" > 2 : raid_gen_ptr[1] = raid_gen2_avx2;< / span >
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 98 < / span > : #ifdef CONFIG_X86_64
< span class = "lineNum" > 99 < / span > : raid_gen3_ptr = raid_gen3_avx2ext;
< span class = "lineNum" > 100 < / span > : raid_genz_ptr = raid_genz_avx2ext;
< span class = "lineNum" > 101 < / span > : raid_gen_ptr[3] = raid_gen4_avx2ext;
< span class = "lineNum" > 102 < / span > : raid_gen_ptr[4] = raid_gen5_avx2ext;
< span class = "lineNum" > 103 < / span > : raid_gen_ptr[5] = raid_gen6_avx2ext;
< span class = "lineNum" > 104 < / span > : #endif
2016-11-06 18:46:14 +01:00
< span class = "lineNum" > 105 < / span > < span class = "lineCov" > 2 : raid_rec_ptr[0] = raid_rec1_avx2;< / span >
< span class = "lineNum" > 106 < / span > < span class = "lineCov" > 2 : raid_rec_ptr[1] = raid_rec2_avx2;< / span >
< span class = "lineNum" > 107 < / span > < span class = "lineCov" > 2 : raid_rec_ptr[2] = raid_recX_avx2;< / span >
< span class = "lineNum" > 108 < / span > < span class = "lineCov" > 2 : raid_rec_ptr[3] = raid_recX_avx2;< / span >
< span class = "lineNum" > 109 < / span > < span class = "lineCov" > 2 : raid_rec_ptr[4] = raid_recX_avx2;< / span >
< span class = "lineNum" > 110 < / span > < span class = "lineCov" > 2 : raid_rec_ptr[5] = raid_recX_avx2;< / span >
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 111 < / span > : }
< span class = "lineNum" > 112 < / span > : #endif
< span class = "lineNum" > 113 < / span > : #endif /* CONFIG_X86 */
< span class = "lineNum" > 114 < / span > :
< span class = "lineNum" > 115 < / span > : /* set the default mode */
2016-11-21 19:48:21 +01:00
< span class = "lineNum" > 116 < / span > < span class = "lineCov" > 271 : raid_mode(RAID_MODE_CAUCHY);< / span >
< span class = "lineNum" > 117 < / span > < span class = "lineCov" > 271 : }< / span >
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 118 < / span > :
< span class = "lineNum" > 119 < / span > : /*
< a name = "120" > < span class = "lineNum" > 120 < / span > : * Reference parity computation.< / a >
< span class = "lineNum" > 121 < / span > : */
< span class = "lineNum" > 122 < / span > < span class = "lineCov" > 6 : void raid_gen_ref(int nd, int np, size_t size, void **vv)< / span >
< span class = "lineNum" > 123 < / span > : {
< span class = "lineNum" > 124 < / span > < span class = "lineCov" > 6 : uint8_t **v = (uint8_t **)vv;< / span >
< span class = "lineNum" > 125 < / span > : size_t i;
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 126 < / span > :
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 127 < / span > < span class = "lineCov" > 5382 : for (i = 0; i < size; ++i) {< / span >
< span class = "lineNum" > 128 < / span > : uint8_t p[RAID_PARITY_MAX];
< span class = "lineNum" > 129 < / span > : int j, d;
< span class = "lineNum" > 130 < / span > :
< span class = "lineNum" > 131 < / span > < span class = "lineCov" > 36096 : for (j = 0; j < np; ++j)< / span >
< span class = "lineNum" > 132 < / span > < span class = "lineCov" > 30720 : p[j] = 0;< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 133 < / span > :
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 134 < / span > < span class = "lineCov" > 93696 : for (d = 0; d < nd; ++d) {< / span >
< span class = "lineNum" > 135 < / span > < span class = "lineCov" > 88320 : uint8_t b = v[d][i];< / span >
< span class = "lineNum" > 136 < / span > :
< span class = "lineNum" > 137 < / span > < span class = "lineCov" > 584448 : for (j = 0; j < np; ++j)< / span >
< span class = "lineNum" > 138 < / span > < span class = "lineCov" > 496128 : p[j] ^= gfmul[b][gfgen[j][d]];< / span >
< span class = "lineNum" > 139 < / span > : }
< span class = "lineNum" > 140 < / span > :
< span class = "lineNum" > 141 < / span > < span class = "lineCov" > 36096 : for (j = 0; j < np; ++j)< / span >
< span class = "lineNum" > 142 < / span > < span class = "lineCov" > 30720 : v[nd + j][i] = p[j];< / span >
< span class = "lineNum" > 143 < / span > : }
< span class = "lineNum" > 144 < / span > < span class = "lineCov" > 6 : }< / span >
< span class = "lineNum" > 145 < / span > :
< span class = "lineNum" > 146 < / span > : /*
< span class = "lineNum" > 147 < / span > : * Size of the blocks to test.
< span class = "lineNum" > 148 < / span > : */
< span class = "lineNum" > 149 < / span > : #define TEST_SIZE 4096
< span class = "lineNum" > 150 < / span > :
< span class = "lineNum" > 151 < / span > : /*
< span class = "lineNum" > 152 < / span > : * Number of data blocks to test.
< span class = "lineNum" > 153 < / span > : */
< span class = "lineNum" > 154 < / span > : #define TEST_COUNT (65536 / TEST_SIZE)
< span class = "lineNum" > 155 < / span > :
< span class = "lineNum" > 156 < / span > : /*
< a name = "157" > < span class = "lineNum" > 157 < / span > : * Parity generation test.< / a >
< span class = "lineNum" > 158 < / span > : */
< span class = "lineNum" > 159 < / span > < span class = "lineCov" > 6 : static int raid_test_par(int nd, int np, size_t size, void **v, void **ref)< / span >
< span class = "lineNum" > 160 < / span > : {
< span class = "lineNum" > 161 < / span > : int i;
< span class = "lineNum" > 162 < / span > : void *t[TEST_COUNT + RAID_PARITY_MAX];
< span class = "lineNum" > 163 < / span > :
< span class = "lineNum" > 164 < / span > : /* setup data */
< span class = "lineNum" > 165 < / span > < span class = "lineCov" > 102 : for (i = 0; i < nd; ++i)< / span >
< span class = "lineNum" > 166 < / span > < span class = "lineCov" > 96 : t[i] = ref[i];< / span >
< span class = "lineNum" > 167 < / span > :
< span class = "lineNum" > 168 < / span > : /* setup parity */
< span class = "lineNum" > 169 < / span > < span class = "lineCov" > 27 : for (i = 0; i < np; ++i)< / span >
< span class = "lineNum" > 170 < / span > < span class = "lineCov" > 21 : t[nd + i] = v[nd + i];< / span >
< span class = "lineNum" > 171 < / span > :
< span class = "lineNum" > 172 < / span > < span class = "lineCov" > 6 : raid_gen(nd, np, size, t);< / span >
< span class = "lineNum" > 173 < / span > :
< span class = "lineNum" > 174 < / span > : /* compare parity */
< span class = "lineNum" > 175 < / span > < span class = "lineCov" > 27 : for (i = 0; i < np; ++i) {< / span >
< span class = "lineNum" > 176 < / span > < span class = "lineCov" > 21 : if (memcmp(t[nd + i], ref[nd + i], size) != 0) {< / span >
< span class = "lineNum" > 177 < / span > : /* LCOV_EXCL_START */
< span class = "lineNum" > 178 < / span > : return -1;
< span class = "lineNum" > 179 < / span > : /* LCOV_EXCL_STOP */
< span class = "lineNum" > 180 < / span > : }
< span class = "lineNum" > 181 < / span > : }
< span class = "lineNum" > 182 < / span > :
< span class = "lineNum" > 183 < / span > < span class = "lineCov" > 6 : return 0;< / span >
< span class = "lineNum" > 184 < / span > : }
< span class = "lineNum" > 185 < / span > :
< span class = "lineNum" > 186 < / span > : /*
< a name = "187" > < span class = "lineNum" > 187 < / span > : * Recovering test.< / a >
< span class = "lineNum" > 188 < / span > : */
< span class = "lineNum" > 189 < / span > < span class = "lineCov" > 18 : static int raid_test_rec(int nr, int *ir, int nd, int np, size_t size, void **v, void **ref)< / span >
< span class = "lineNum" > 190 < / span > : {
< span class = "lineNum" > 191 < / span > : int i, j;
< span class = "lineNum" > 192 < / span > : void *t[TEST_COUNT + RAID_PARITY_MAX];
< span class = "lineNum" > 193 < / span > :
< span class = "lineNum" > 194 < / span > : /* setup data and parity vector */
< span class = "lineNum" > 195 < / span > < span class = "lineCov" > 369 : for (i = 0, j = 0; i < nd + np; ++i) {< / span >
< span class = "lineNum" > 196 < / span > < span class = "lineCov" > 351 : if (j < nr & & ir[j] == i) {< / span >
< span class = "lineNum" > 197 < / span > : /* this block has to be recovered */
< span class = "lineNum" > 198 < / span > < span class = "lineCov" > 63 : t[i] = v[i];< / span >
< span class = "lineNum" > 199 < / span > < span class = "lineCov" > 63 : ++j;< / span >
< span class = "lineNum" > 200 < / span > : } else {
< span class = "lineNum" > 201 < / span > : /* this block is used for recovering */
< span class = "lineNum" > 202 < / span > < span class = "lineCov" > 288 : t[i] = ref[i];< / span >
< span class = "lineNum" > 203 < / span > : }
< span class = "lineNum" > 204 < / span > : }
< span class = "lineNum" > 205 < / span > :
< span class = "lineNum" > 206 < / span > < span class = "lineCov" > 18 : raid_rec(nr, ir, nd, np, size, t);< / span >
< span class = "lineNum" > 207 < / span > :
< span class = "lineNum" > 208 < / span > : /* compare all data and parity */
< span class = "lineNum" > 209 < / span > < span class = "lineCov" > 369 : for (i = 0; i < nd + np; ++i) {< / span >
< span class = "lineNum" > 210 < / span > < span class = "lineCov" > 351 : if (t[i] != ref[i]< / span >
< span class = "lineNum" > 211 < / span > < span class = "lineCov" > 63 : & & memcmp(t[i], ref[i], size) != 0) {< / span >
< span class = "lineNum" > 212 < / span > : /* LCOV_EXCL_START */
< span class = "lineNum" > 213 < / span > : return -1;
< span class = "lineNum" > 214 < / span > : /* LCOV_EXCL_STOP */
< span class = "lineNum" > 215 < / span > : }
< span class = "lineNum" > 216 < / span > : }
< span class = "lineNum" > 217 < / span > :
< span class = "lineNum" > 218 < / span > < span class = "lineCov" > 18 : return 0;< / span >
< span class = "lineNum" > 219 < / span > : }
< span class = "lineNum" > 220 < / span > :
< span class = "lineNum" > 221 < / span > : /*
< a name = "222" > < span class = "lineNum" > 222 < / span > : * Recovering test for data.< / a >
< span class = "lineNum" > 223 < / span > : */
< span class = "lineNum" > 224 < / span > < span class = "lineCov" > 18 : static int raid_test_data(int nr, int *id, int *ip, int nd, int np, size_t size, void **v, void **ref)< / span >
< span class = "lineNum" > 225 < / span > : {
< span class = "lineNum" > 226 < / span > : int i, j;
< span class = "lineNum" > 227 < / span > : void *t[TEST_COUNT + RAID_PARITY_MAX];
< span class = "lineNum" > 228 < / span > :
< span class = "lineNum" > 229 < / span > : /* setup data vector */
< span class = "lineNum" > 230 < / span > < span class = "lineCov" > 306 : for (i = 0, j = 0; i < nd; ++i) {< / span >
< span class = "lineNum" > 231 < / span > < span class = "lineCov" > 288 : if (j < nr & & id[j] == i) {< / span >
< span class = "lineNum" > 232 < / span > : /* this block has to be recovered */
< span class = "lineNum" > 233 < / span > < span class = "lineCov" > 39 : t[i] = v[i];< / span >
< span class = "lineNum" > 234 < / span > < span class = "lineCov" > 39 : ++j;< / span >
< span class = "lineNum" > 235 < / span > : } else {
< span class = "lineNum" > 236 < / span > : /* this block is left unchanged */
< span class = "lineNum" > 237 < / span > < span class = "lineCov" > 249 : t[i] = ref[i];< / span >
< span class = "lineNum" > 238 < / span > : }
< span class = "lineNum" > 239 < / span > : }
< span class = "lineNum" > 240 < / span > :
< span class = "lineNum" > 241 < / span > : /* setup parity vector */
< span class = "lineNum" > 242 < / span > < span class = "lineCov" > 81 : for (i = 0, j = 0; i < np; ++i) {< / span >
< span class = "lineNum" > 243 < / span > < span class = "lineCov" > 63 : if (j < nr & & ip[j] == i) {< / span >
< span class = "lineNum" > 244 < / span > : /* this block is used for recovering */
< span class = "lineNum" > 245 < / span > < span class = "lineCov" > 39 : t[nd + i] = ref[nd + i];< / span >
< span class = "lineNum" > 246 < / span > < span class = "lineCov" > 39 : ++j;< / span >
< span class = "lineNum" > 247 < / span > : } else {
< span class = "lineNum" > 248 < / span > : /* this block should not be read or written */
< span class = "lineNum" > 249 < / span > < span class = "lineCov" > 24 : t[nd + i] = 0;< / span >
< span class = "lineNum" > 250 < / span > : }
< span class = "lineNum" > 251 < / span > : }
< span class = "lineNum" > 252 < / span > :
< span class = "lineNum" > 253 < / span > < span class = "lineCov" > 18 : raid_data(nr, id, ip, nd, size, t);< / span >
< span class = "lineNum" > 254 < / span > :
< span class = "lineNum" > 255 < / span > : /* compare all data and parity */
< span class = "lineNum" > 256 < / span > < span class = "lineCov" > 306 : for (i = 0; i < nd; ++i) {< / span >
< span class = "lineNum" > 257 < / span > < span class = "lineCov" > 288 : if (t[i] != ref[i]< / span >
< span class = "lineNum" > 258 < / span > < span class = "lineCov" > 39 : & & t[i] != 0< / span >
< span class = "lineNum" > 259 < / span > < span class = "lineCov" > 39 : & & memcmp(t[i], ref[i], size) != 0) {< / span >
< span class = "lineNum" > 260 < / span > : /* LCOV_EXCL_START */
< span class = "lineNum" > 261 < / span > : return -1;
< span class = "lineNum" > 262 < / span > : /* LCOV_EXCL_STOP */
< span class = "lineNum" > 263 < / span > : }
< span class = "lineNum" > 264 < / span > : }
< span class = "lineNum" > 265 < / span > :
< span class = "lineNum" > 266 < / span > < span class = "lineCov" > 18 : return 0;< / span >
< span class = "lineNum" > 267 < / span > : }
< span class = "lineNum" > 268 < / span > :
< span class = "lineNum" > 269 < / span > : /*
< a name = "270" > < span class = "lineNum" > 270 < / span > : * Scan test.< / a >
< span class = "lineNum" > 271 < / span > : */
< span class = "lineNum" > 272 < / span > < span class = "lineCov" > 7 : static int raid_test_scan(int nr, int *ir, int nd, int np, size_t size, void **v, void **ref)< / span >
< span class = "lineNum" > 273 < / span > : {
< span class = "lineNum" > 274 < / span > : int i, j, ret;
< span class = "lineNum" > 275 < / span > : void *t[TEST_COUNT + RAID_PARITY_MAX];
< span class = "lineNum" > 276 < / span > : int is[RAID_PARITY_MAX];
< span class = "lineNum" > 277 < / span > :
< span class = "lineNum" > 278 < / span > : /* setup data and parity vector */
< span class = "lineNum" > 279 < / span > < span class = "lineCov" > 140 : for (i = 0, j = 0; i < nd + np; ++i) {< / span >
< span class = "lineNum" > 280 < / span > < span class = "lineCov" > 133 : if (j < nr & & ir[j] == i) {< / span >
< span class = "lineNum" > 281 < / span > : /* this block is bad */
< span class = "lineNum" > 282 < / span > < span class = "lineCov" > 15 : t[i] = v[i];< / span >
< span class = "lineNum" > 283 < / span > < span class = "lineCov" > 15 : ++j;< / span >
< span class = "lineNum" > 284 < / span > : } else {
< span class = "lineNum" > 285 < / span > : /* this block is used for recovering */
< span class = "lineNum" > 286 < / span > < span class = "lineCov" > 118 : t[i] = ref[i];< / span >
< span class = "lineNum" > 287 < / span > : }
< span class = "lineNum" > 288 < / span > : }
< span class = "lineNum" > 289 < / span > :
< span class = "lineNum" > 290 < / span > < span class = "lineCov" > 7 : ret = raid_scan(is, nd, np, size, t);< / span >
< span class = "lineNum" > 291 < / span > :
< span class = "lineNum" > 292 < / span > : /* compare identified bad blocks */
< span class = "lineNum" > 293 < / span > < span class = "lineCov" > 7 : if (ret != nr)< / span >
< span class = "lineNum" > 294 < / span > < span class = "lineCov" > 1 : return -1;< / span >
< span class = "lineNum" > 295 < / span > < span class = "lineCov" > 21 : for (i = 0; i < nr; ++i) {< / span >
< span class = "lineNum" > 296 < / span > < span class = "lineCov" > 15 : if (ir[i] != is[i]) {< / span >
< span class = "lineNum" > 297 < / span > : /* LCOV_EXCL_START */
< span class = "lineNum" > 298 < / span > : return -1;
< span class = "lineNum" > 299 < / span > : /* LCOV_EXCL_STOP */
< span class = "lineNum" > 300 < / span > : }
< span class = "lineNum" > 301 < / span > : }
< span class = "lineNum" > 302 < / span > :
< span class = "lineNum" > 303 < / span > < span class = "lineCov" > 6 : return 0;< / span >
< span class = "lineNum" > 304 < / span > : }
< span class = "lineNum" > 305 < / span > :
< span class = "lineNum" > 306 < / span > : /*
< a name = "307" > < span class = "lineNum" > 307 < / span > : * Basic functionality self test.< / a >
< span class = "lineNum" > 308 < / span > : */
< span class = "lineNum" > 309 < / span > < span class = "lineCov" > 1 : int raid_selftest(void)< / span >
< span class = "lineNum" > 310 < / span > : {
< span class = "lineNum" > 311 < / span > < span class = "lineCov" > 1 : const int nd = TEST_COUNT;< / span >
< span class = "lineNum" > 312 < / span > < span class = "lineCov" > 1 : const size_t size = TEST_SIZE;< / span >
< span class = "lineNum" > 313 < / span > < span class = "lineCov" > 1 : const int nv = nd + RAID_PARITY_MAX * 2 + 1;< / span >
< span class = "lineNum" > 314 < / span > : void *v_alloc;
< span class = "lineNum" > 315 < / span > : void **v;
< span class = "lineNum" > 316 < / span > < span class = "lineCov" > 1 : void *ref[nd + RAID_PARITY_MAX];< / span >
< span class = "lineNum" > 317 < / span > : int ir[RAID_PARITY_MAX];
< span class = "lineNum" > 318 < / span > : int ip[RAID_PARITY_MAX];
< span class = "lineNum" > 319 < / span > : int i, np;
< span class = "lineNum" > 320 < / span > < span class = "lineCov" > 1 : int ret = 0;< / span >
< span class = "lineNum" > 321 < / span > :
< span class = "lineNum" > 322 < / span > : /* ensure to have enough space for data */
< span class = "lineNum" > 323 < / span > < span class = "lineCov" > 1 : BUG_ON(nd * size > 65536);< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 324 < / span > :
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 325 < / span > < span class = "lineCov" > 1 : v = raid_malloc_vector(nd, nv, size, & v_alloc);< / span >
< span class = "lineNum" > 326 < / span > < span class = "lineCov" > 1 : if (!v) {< / span >
< span class = "lineNum" > 327 < / span > : /* LCOV_EXCL_START */
< span class = "lineNum" > 328 < / span > : return -1;
< span class = "lineNum" > 329 < / span > : /* LCOV_EXCL_STOP */
< span class = "lineNum" > 330 < / span > : }
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 331 < / span > :
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 332 < / span > < span class = "lineCov" > 1 : memset(v[nv - 1], 0, size);< / span >
< span class = "lineNum" > 333 < / span > < span class = "lineCov" > 1 : raid_zero(v[nv - 1]);< / span >
< span class = "lineNum" > 334 < / span > :
< span class = "lineNum" > 335 < / span > : /* use the multiplication table as data */
< span class = "lineNum" > 336 < / span > < span class = "lineCov" > 17 : for (i = 0; i < nd; ++i)< / span >
< span class = "lineNum" > 337 < / span > < span class = "lineCov" > 16 : ref[i] = ((uint8_t *)gfmul) + size * i;< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 338 < / span > :
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 339 < / span > : /* setup reference parity */
< span class = "lineNum" > 340 < / span > < span class = "lineCov" > 7 : for (i = 0; i < RAID_PARITY_MAX; ++i)< / span >
< span class = "lineNum" > 341 < / span > < span class = "lineCov" > 6 : ref[nd + i] = v[nd + RAID_PARITY_MAX + i];< / span >
< span class = "lineNum" > 342 < / span > :
< span class = "lineNum" > 343 < / span > : /* compute reference parity */
< span class = "lineNum" > 344 < / span > < span class = "lineCov" > 1 : raid_gen_ref(nd, RAID_PARITY_MAX, size, ref);< / span >
< span class = "lineNum" > 345 < / span > :
< span class = "lineNum" > 346 < / span > : /* test for each parity level */
< span class = "lineNum" > 347 < / span > < span class = "lineCov" > 7 : for (np = 1; np < = RAID_PARITY_MAX; ++np) {< / span >
< span class = "lineNum" > 348 < / span > : /* test parity generation */
< span class = "lineNum" > 349 < / span > < span class = "lineCov" > 6 : ret = raid_test_par(nd, np, size, v, ref);< / span >
< span class = "lineNum" > 350 < / span > < span class = "lineCov" > 6 : if (ret != 0) {< / span >
< span class = "lineNum" > 351 < / span > : /* LCOV_EXCL_START */
< span class = "lineNum" > 352 < / span > : goto bail;
< span class = "lineNum" > 353 < / span > : /* LCOV_EXCL_STOP */
< span class = "lineNum" > 354 < / span > : }
< span class = "lineNum" > 355 < / span > :
< span class = "lineNum" > 356 < / span > : /* test recovering with broken ending data disks */
< span class = "lineNum" > 357 < / span > < span class = "lineCov" > 27 : for (i = 0; i < np; ++i) {< / span >
< span class = "lineNum" > 358 < / span > : /* bad data */
< span class = "lineNum" > 359 < / span > < span class = "lineCov" > 21 : ir[i] = nd - np + i;< / span >
< span class = "lineNum" > 360 < / span > :
< span class = "lineNum" > 361 < / span > : /* good parity */
< span class = "lineNum" > 362 < / span > < span class = "lineCov" > 21 : ip[i] = i;< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 363 < / span > : }
< span class = "lineNum" > 364 < / span > :
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 365 < / span > < span class = "lineCov" > 6 : ret = raid_test_rec(np, ir, nd, np, size, v, ref);< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 366 < / span > < span class = "lineCov" > 6 : if (ret != 0) {< / span >
< span class = "lineNum" > 367 < / span > : /* LCOV_EXCL_START */
< span class = "lineNum" > 368 < / span > : goto bail;
< span class = "lineNum" > 369 < / span > : /* LCOV_EXCL_STOP */
< span class = "lineNum" > 370 < / span > : }
< span class = "lineNum" > 371 < / span > :
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 372 < / span > < span class = "lineCov" > 6 : ret = raid_test_data(np, ir, ip, nd, np, size, v, ref);< / span >
< span class = "lineNum" > 373 < / span > < span class = "lineCov" > 6 : if (ret != 0) {< / span >
< span class = "lineNum" > 374 < / span > : /* LCOV_EXCL_START */
< span class = "lineNum" > 375 < / span > : goto bail;
< span class = "lineNum" > 376 < / span > : /* LCOV_EXCL_STOP */
< span class = "lineNum" > 377 < / span > : }
< span class = "lineNum" > 378 < / span > :
< span class = "lineNum" > 379 < / span > : /* test recovering with broken leading data and broken leading parity */
< span class = "lineNum" > 380 < / span > < span class = "lineCov" > 15 : for (i = 0; i < np / 2; ++i) {< / span >
< span class = "lineNum" > 381 < / span > : /* bad data */
< span class = "lineNum" > 382 < / span > < span class = "lineCov" > 9 : ir[i] = i;< / span >
< span class = "lineNum" > 383 < / span > :
< span class = "lineNum" > 384 < / span > : /* good parity */
< span class = "lineNum" > 385 < / span > < span class = "lineCov" > 9 : ip[i] = (np + 1) / 2 + i;< / span >
< span class = "lineNum" > 386 < / span > : }
< span class = "lineNum" > 387 < / span > :
< span class = "lineNum" > 388 < / span > : /* bad parity */
< span class = "lineNum" > 389 < / span > < span class = "lineCov" > 18 : for (i = 0; i < (np + 1) / 2; ++i)< / span >
< span class = "lineNum" > 390 < / span > < span class = "lineCov" > 12 : ir[np / 2 + i] = nd + i;< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 391 < / span > :
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 392 < / span > < span class = "lineCov" > 6 : ret = raid_test_rec(np, ir, nd, np, size, v, ref);< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 393 < / span > < span class = "lineCov" > 6 : if (ret != 0) {< / span >
< span class = "lineNum" > 394 < / span > : /* LCOV_EXCL_START */
< span class = "lineNum" > 395 < / span > : goto bail;
< span class = "lineNum" > 396 < / span > : /* LCOV_EXCL_STOP */
< span class = "lineNum" > 397 < / span > : }
< span class = "lineNum" > 398 < / span > :
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 399 < / span > < span class = "lineCov" > 6 : ret = raid_test_data(np / 2, ir, ip, nd, np, size, v, ref);< / span >
< span class = "lineNum" > 400 < / span > < span class = "lineCov" > 6 : if (ret != 0) {< / span >
< span class = "lineNum" > 401 < / span > : /* LCOV_EXCL_START */
< span class = "lineNum" > 402 < / span > : goto bail;
< span class = "lineNum" > 403 < / span > : /* LCOV_EXCL_STOP */
< span class = "lineNum" > 404 < / span > : }
< span class = "lineNum" > 405 < / span > :
< span class = "lineNum" > 406 < / span > : /* test recovering with broken leading data and broken ending parity */
< span class = "lineNum" > 407 < / span > < span class = "lineCov" > 15 : for (i = 0; i < np / 2; ++i) {< / span >
< span class = "lineNum" > 408 < / span > : /* bad data */
< span class = "lineNum" > 409 < / span > < span class = "lineCov" > 9 : ir[i] = i;< / span >
< span class = "lineNum" > 410 < / span > :
< span class = "lineNum" > 411 < / span > : /* good parity */
< span class = "lineNum" > 412 < / span > < span class = "lineCov" > 9 : ip[i] = i;< / span >
< span class = "lineNum" > 413 < / span > : }
< span class = "lineNum" > 414 < / span > :
< span class = "lineNum" > 415 < / span > : /* bad parity */
< span class = "lineNum" > 416 < / span > < span class = "lineCov" > 18 : for (i = 0; i < (np + 1) / 2; ++i)< / span >
< span class = "lineNum" > 417 < / span > < span class = "lineCov" > 12 : ir[np / 2 + i] = nd + np - (np + 1) / 2 + i;< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 418 < / span > :
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 419 < / span > < span class = "lineCov" > 6 : ret = raid_test_rec(np, ir, nd, np, size, v, ref);< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 420 < / span > < span class = "lineCov" > 6 : if (ret != 0) {< / span >
< span class = "lineNum" > 421 < / span > : /* LCOV_EXCL_START */
< span class = "lineNum" > 422 < / span > : goto bail;
< span class = "lineNum" > 423 < / span > : /* LCOV_EXCL_STOP */
< span class = "lineNum" > 424 < / span > : }
< span class = "lineNum" > 425 < / span > :
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 426 < / span > < span class = "lineCov" > 6 : ret = raid_test_data(np / 2, ir, ip, nd, np, size, v, ref);< / span >
< span class = "lineNum" > 427 < / span > < span class = "lineCov" > 6 : if (ret != 0) {< / span >
< span class = "lineNum" > 428 < / span > : /* LCOV_EXCL_START */
< span class = "lineNum" > 429 < / span > : goto bail;
< span class = "lineNum" > 430 < / span > : /* LCOV_EXCL_STOP */
< span class = "lineNum" > 431 < / span > : }
< span class = "lineNum" > 432 < / span > :
< span class = "lineNum" > 433 < / span > : /* scan test with broken data and parity */
< span class = "lineNum" > 434 < / span > < span class = "lineCov" > 15 : for (i = 0; i < np / 2; ++i) {< / span >
< span class = "lineNum" > 435 < / span > : /* bad data */
< span class = "lineNum" > 436 < / span > < span class = "lineCov" > 9 : ir[i] = i;< / span >
< span class = "lineNum" > 437 < / span > : }
< span class = "lineNum" > 438 < / span > < span class = "lineCov" > 12 : for (i = 0; i < (np - 1) / 2; ++i) {< / span >
< span class = "lineNum" > 439 < / span > : /* bad parity */
< span class = "lineNum" > 440 < / span > < span class = "lineCov" > 6 : ir[np / 2 + i] = nd + i;< / span >
< span class = "lineNum" > 441 < / span > : }
< span class = "lineNum" > 442 < / span > < span class = "lineCov" > 21 : for (i = 0; i < np - 1; ++i) {< / span >
< span class = "lineNum" > 443 < / span > : /* make blocks bad */
< span class = "lineNum" > 444 < / span > : /* we cannot fill them with 0, because the original */
< span class = "lineNum" > 445 < / span > : /* data may be already filled with 0 */
< span class = "lineNum" > 446 < / span > < span class = "lineCov" > 15 : memset(v[ir[i]], 0x55, size);< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 447 < / span > : }
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 448 < / span > :
< span class = "lineNum" > 449 < / span > < span class = "lineCov" > 6 : ret = raid_test_scan(np - 1, ir, nd, np, size, v, ref);< / span >
< span class = "lineNum" > 450 < / span > < span class = "lineCov" > 6 : if (ret != 0) {< / span >
< span class = "lineNum" > 451 < / span > : /* LCOV_EXCL_START */
< span class = "lineNum" > 452 < / span > : goto bail;
< span class = "lineNum" > 453 < / span > : /* LCOV_EXCL_STOP */
< span class = "lineNum" > 454 < / span > : }
< span class = "lineNum" > 455 < / span > : }
< span class = "lineNum" > 456 < / span > :
< span class = "lineNum" > 457 < / span > : /* scan test with no parity */
< span class = "lineNum" > 458 < / span > < span class = "lineCov" > 1 : ret = raid_test_scan(0, 0, nd, 0, size, v, ref);< / span >
< span class = "lineNum" > 459 < / span > < span class = "lineCov" > 1 : if (ret != -1) {< / span >
< span class = "lineNum" > 460 < / span > : /* LCOV_EXCL_START */
< span class = "lineNum" > 461 < / span > : goto bail;
< span class = "lineNum" > 462 < / span > : /* LCOV_EXCL_STOP */
< span class = "lineNum" > 463 < / span > : }
< span class = "lineNum" > 464 < / span > :
< span class = "lineNum" > 465 < / span > < span class = "lineCov" > 1 : ret = 0;< / span >
2011-03-01 22:19:30 +01:00
< span class = "lineNum" > 466 < / span > :
2016-01-09 17:18:05 +01:00
< span class = "lineNum" > 467 < / span > : bail:
< span class = "lineNum" > 468 < / span > < span class = "lineCov" > 1 : free(v);< / span >
< span class = "lineNum" > 469 < / span > < span class = "lineCov" > 1 : free(v_alloc);< / span >
< span class = "lineNum" > 470 < / span > :
< span class = "lineNum" > 471 < / span > < span class = "lineCov" > 1 : return ret;< / span >
< span class = "lineNum" > 472 < / span > : }
< span class = "lineNum" > 473 < / span > :
2011-03-01 22:19:30 +01:00
< / pre >
< / td >
< / tr >
< / table >
< br >
< table width = "100%" border = 0 cellspacing = 0 cellpadding = 0 >
< tr > < td class = "ruler" > < img src = "../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< tr > < td class = "versionInfo" > Generated by: < a href = "http://ltp.sourceforge.net/coverage/lcov.php" target = "_parent" > LCOV version 1.10< / a > < / td > < / tr >
< / table >
< br >
< / body >
< / html >