snapraid/cov/cmdline/device.c.gcov.html
2015-12-28 16:31:46 +01:00

1088 lines
104 KiB
HTML

<!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 - cmdline/device.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">cmdline</a> - device.c<span style="font-size: 80%;"> (source / <a href="device.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">280</td>
<td class="headerCovTableEntry">315</td>
<td class="headerCovTableEntryMed">88.9 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-05-12</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">11</td>
<td class="headerCovTableEntry">11</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) 2015 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 3 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> : * You should have received a copy of the GNU General Public License
<span class="lineNum"> 15 </span> : * along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.
<span class="lineNum"> 16 </span> : */
<span class="lineNum"> 17 </span> :
<span class="lineNum"> 18 </span> : #include &quot;portable.h&quot;
<span class="lineNum"> 19 </span> :
<span class="lineNum"> 20 </span> : #include &quot;support.h&quot;
<span class="lineNum"> 21 </span> : #include &quot;state.h&quot;
<span class="lineNum"> 22 </span> : #include &quot;raid/raid.h&quot;
<span class="lineNum"> 23 </span> :
<span class="lineNum"> 24 </span> : /**
<span class="lineNum"> 25 </span> : * The following are Failure Rate tables computed from the data that
<span class="lineNum"> 26 </span> : * BackBlaze made available at:
<span class="lineNum"> 27 </span> : *
<span class="lineNum"> 28 </span> : * Reliability Data Set For 41,000 Hard Drives Now Open Source
<span class="lineNum"> 29 </span> : * https://www.backblaze.com/blog/hard-drive-data-feb2015/
<span class="lineNum"> 30 </span> : *
<span class="lineNum"> 31 </span> : * Hard Drive Data Sets
<span class="lineNum"> 32 </span> : * https://www.backblaze.com/hard-drive-test-data.html
<span class="lineNum"> 33 </span> : *
<span class="lineNum"> 34 </span> : * Note that in this data:
<span class="lineNum"> 35 </span> : * - Disks all passed the load-testing and have made it to production,
<span class="lineNum"> 36 </span> : * and then Dead On Arrival (DOA) failures are excluded.
<span class="lineNum"> 37 </span> : * - Disks that are predicted to fail by BackBlaze are removed before
<span class="lineNum"> 38 </span> : * they really fail, not counting as a failure.
<span class="lineNum"> 39 </span> : *
<span class="lineNum"> 40 </span> : * The following tables are computed using the data from 2014-02-14 to 2014-12-31
<span class="lineNum"> 41 </span> : * becasue it's the period when more SMART attributes were gathered.
<span class="lineNum"> 42 </span> : *
<span class="lineNum"> 43 </span> : * In this period there are 47322 disk seen, with 1988 removed because failed,
<span class="lineNum"> 44 </span> : * and with 4121 removed because predicted to fail.
<span class="lineNum"> 45 </span> : */
<span class="lineNum"> 46 </span> :
<span class="lineNum"> 47 </span> : /**
<span class="lineNum"> 48 </span> : * Number of data point in each table.
<span class="lineNum"> 49 </span> : */
<span class="lineNum"> 50 </span> : #define SMART_MEASURES 256
<span class="lineNum"> 51 </span> :
<span class="lineNum"> 52 </span> : /*
<span class="lineNum"> 53 </span> : * Divider for SMART attribute 5
<span class="lineNum"> 54 </span> : */
<span class="lineNum"> 55 </span> : static unsigned SMART_5_STEP = 1;
<span class="lineNum"> 56 </span> :
<span class="lineNum"> 57 </span> : /*
<span class="lineNum"> 58 </span> : * Failure rate for 30 days, for a disk
<span class="lineNum"> 59 </span> : * with SMART attribute 5 at a given value.
<span class="lineNum"> 60 </span> : */
<span class="lineNum"> 61 </span> : static double SMART_5_R[SMART_MEASURES] = {
<span class="lineNum"> 62 </span> : 0.0034, 0.0738, 0.0883, 0.0960, 0.1016,
<span class="lineNum"> 63 </span> : 0.1062, 0.1106, 0.1142, 0.1189, 0.1259,
<span class="lineNum"> 64 </span> : 0.1307, 0.1337, 0.1368, 0.1400, 0.1419,
<span class="lineNum"> 65 </span> : 0.1448, 0.1463, 0.1497, 0.1512, 0.1532,
<span class="lineNum"> 66 </span> : 0.1546, 0.1563, 0.1582, 0.1606, 0.1624,
<span class="lineNum"> 67 </span> : 0.1645, 0.1658, 0.1670, 0.1687, 0.1702,
<span class="lineNum"> 68 </span> : 0.1717, 0.1730, 0.1749, 0.1774, 0.1791,
<span class="lineNum"> 69 </span> : 0.1804, 0.1819, 0.1826, 0.1840, 0.1858,
<span class="lineNum"> 70 </span> : 0.1869, 0.1899, 0.1906, 0.1914, 0.1932,
<span class="lineNum"> 71 </span> : 0.1942, 0.1954, 0.1962, 0.1985, 0.2007,
<span class="lineNum"> 72 </span> : 0.2017, 0.2030, 0.2041, 0.2049, 0.2061,
<span class="lineNum"> 73 </span> : 0.2072, 0.2080, 0.2096, 0.2100, 0.2107,
<span class="lineNum"> 74 </span> : 0.2113, 0.2124, 0.2132, 0.2138, 0.2145,
<span class="lineNum"> 75 </span> : 0.2159, 0.2168, 0.2180, 0.2198, 0.2204,
<span class="lineNum"> 76 </span> : 0.2208, 0.2212, 0.2225, 0.2242, 0.2248,
<span class="lineNum"> 77 </span> : 0.2254, 0.2261, 0.2265, 0.2269, 0.2278,
<span class="lineNum"> 78 </span> : 0.2293, 0.2313, 0.2321, 0.2326, 0.2334,
<span class="lineNum"> 79 </span> : 0.2346, 0.2362, 0.2366, 0.2375, 0.2393,
<span class="lineNum"> 80 </span> : 0.2397, 0.2402, 0.2410, 0.2415, 0.2423,
<span class="lineNum"> 81 </span> : 0.2436, 0.2447, 0.2458, 0.2463, 0.2470,
<span class="lineNum"> 82 </span> : 0.2481, 0.2488, 0.2492, 0.2498, 0.2510,
<span class="lineNum"> 83 </span> : 0.2528, 0.2536, 0.2540, 0.2548, 0.2557,
<span class="lineNum"> 84 </span> : 0.2563, 0.2568, 0.2574, 0.2591, 0.2593,
<span class="lineNum"> 85 </span> : 0.2596, 0.2603, 0.2608, 0.2613, 0.2616,
<span class="lineNum"> 86 </span> : 0.2622, 0.2635, 0.2648, 0.2651, 0.2658,
<span class="lineNum"> 87 </span> : 0.2661, 0.2664, 0.2667, 0.2677, 0.2689,
<span class="lineNum"> 88 </span> : 0.2697, 0.2699, 0.2701, 0.2711, 0.2717,
<span class="lineNum"> 89 </span> : 0.2719, 0.2733, 0.2745, 0.2759, 0.2761,
<span class="lineNum"> 90 </span> : 0.2769, 0.2771, 0.2772, 0.2774, 0.2780,
<span class="lineNum"> 91 </span> : 0.2796, 0.2798, 0.2803, 0.2808, 0.2811,
<span class="lineNum"> 92 </span> : 0.2814, 0.2821, 0.2829, 0.2841, 0.2846,
<span class="lineNum"> 93 </span> : 0.2848, 0.2851, 0.2856, 0.2866, 0.2869,
<span class="lineNum"> 94 </span> : 0.2873, 0.2895, 0.2897, 0.2903, 0.2906,
<span class="lineNum"> 95 </span> : 0.2910, 0.2914, 0.2916, 0.2923, 0.2940,
<span class="lineNum"> 96 </span> : 0.2945, 0.2954, 0.2959, 0.2962, 0.2966,
<span class="lineNum"> 97 </span> : 0.2974, 0.2991, 0.3004, 0.3004, 0.3007,
<span class="lineNum"> 98 </span> : 0.3011, 0.3015, 0.3017, 0.3019, 0.3025,
<span class="lineNum"> 99 </span> : 0.3037, 0.3038, 0.3040, 0.3043, 0.3046,
<span class="lineNum"> 100 </span> : 0.3050, 0.3055, 0.3061, 0.3079, 0.3084,
<span class="lineNum"> 101 </span> : 0.3088, 0.3092, 0.3095, 0.3101, 0.3109,
<span class="lineNum"> 102 </span> : 0.3119, 0.3142, 0.3146, 0.3149, 0.3151,
<span class="lineNum"> 103 </span> : 0.3153, 0.3154, 0.3157, 0.3164, 0.3177,
<span class="lineNum"> 104 </span> : 0.3178, 0.3186, 0.3188, 0.3201, 0.3208,
<span class="lineNum"> 105 </span> : 0.3212, 0.3218, 0.3233, 0.3234, 0.3239,
<span class="lineNum"> 106 </span> : 0.3243, 0.3246, 0.3256, 0.3258, 0.3264,
<span class="lineNum"> 107 </span> : 0.3280, 0.3285, 0.3288, 0.3297, 0.3299,
<span class="lineNum"> 108 </span> : 0.3302, 0.3304, 0.3310, 0.3323, 0.3324,
<span class="lineNum"> 109 </span> : 0.3326, 0.3327, 0.3328, 0.3337, 0.3338,
<span class="lineNum"> 110 </span> : 0.3349, 0.3367, 0.3374, 0.3378, 0.3381,
<span class="lineNum"> 111 </span> : 0.3385, 0.3387, 0.3389, 0.3394, 0.3404,
<span class="lineNum"> 112 </span> : 0.3408, 0.3410, 0.3412, 0.3413, 0.3416,
<span class="lineNum"> 113 </span> : 0.3421,
<span class="lineNum"> 114 </span> : };
<span class="lineNum"> 115 </span> :
<span class="lineNum"> 116 </span> : /*
<span class="lineNum"> 117 </span> : * Divider for SMART attribute 187
<span class="lineNum"> 118 </span> : */
<span class="lineNum"> 119 </span> : static unsigned SMART_187_STEP = 1;
<span class="lineNum"> 120 </span> :
<span class="lineNum"> 121 </span> : /*
<span class="lineNum"> 122 </span> : * Failure rate for 30 days, for a disk
<span class="lineNum"> 123 </span> : * with SMART attribute 187 at a given value.
<span class="lineNum"> 124 </span> : */
<span class="lineNum"> 125 </span> : static double SMART_187_R[SMART_MEASURES] = {
<span class="lineNum"> 126 </span> : 0.0048, 0.0957, 0.1157, 0.1306, 0.1415,
<span class="lineNum"> 127 </span> : 0.1501, 0.1695, 0.2444, 0.2714, 0.2925,
<span class="lineNum"> 128 </span> : 0.3113, 0.3284, 0.3515, 0.4054, 0.4331,
<span class="lineNum"> 129 </span> : 0.4578, 0.4817, 0.5010, 0.5171, 0.5610,
<span class="lineNum"> 130 </span> : 0.5893, 0.6120, 0.6362, 0.6608, 0.6803,
<span class="lineNum"> 131 </span> : 0.7261, 0.7490, 0.7818, 0.8109, 0.8364,
<span class="lineNum"> 132 </span> : 0.8599, 0.9086, 0.9303, 0.9580, 0.9820,
<span class="lineNum"> 133 </span> : 1.0057, 1.0388, 1.0803, 1.1067, 1.1327,
<span class="lineNum"> 134 </span> : 1.1589, 1.1788, 1.1963, 1.2136, 1.2367,
<span class="lineNum"> 135 </span> : 1.2617, 1.2789, 1.2940, 1.3134, 1.3376,
<span class="lineNum"> 136 </span> : 1.3562, 1.3673, 1.3799, 1.4099, 1.4260,
<span class="lineNum"> 137 </span> : 1.4321, 1.4495, 1.4548, 1.4696, 1.4816,
<span class="lineNum"> 138 </span> : 1.5054, 1.5204, 1.5296, 1.5627, 1.5820,
<span class="lineNum"> 139 </span> : 1.5969, 1.6076, 1.6125, 1.6205, 1.6333,
<span class="lineNum"> 140 </span> : 1.6582, 1.6674, 1.6843, 1.7144, 1.7269,
<span class="lineNum"> 141 </span> : 1.7494, 1.7590, 1.7747, 1.7962, 1.8383,
<span class="lineNum"> 142 </span> : 1.8480, 1.8532, 1.8641, 1.8793, 1.8850,
<span class="lineNum"> 143 </span> : 1.8920, 1.8978, 1.9033, 1.9081, 1.9237,
<span class="lineNum"> 144 </span> : 1.9609, 1.9805, 2.0055, 2.0095, 2.0127,
<span class="lineNum"> 145 </span> : 2.0277, 2.0493, 2.0873, 2.1064, 2.1130,
<span class="lineNum"> 146 </span> : 2.1190, 2.1240, 2.1477, 2.1850, 2.1979,
<span class="lineNum"> 147 </span> : 2.2168, 2.2279, 2.2701, 2.2794, 2.2855,
<span class="lineNum"> 148 </span> : 2.3012, 2.3138, 2.3167, 2.3764, 2.3832,
<span class="lineNum"> 149 </span> : 2.3860, 2.3906, 2.4012, 2.4261, 2.4314,
<span class="lineNum"> 150 </span> : 2.4539, 2.4556, 2.4630, 2.4764, 2.4821,
<span class="lineNum"> 151 </span> : 2.4851, 2.4894, 2.4922, 2.4992, 2.5123,
<span class="lineNum"> 152 </span> : 2.5202, 2.5232, 2.5264, 2.5322, 2.5407,
<span class="lineNum"> 153 </span> : 2.5429, 2.5485, 2.5642, 2.5669, 2.5743,
<span class="lineNum"> 154 </span> : 2.5887, 2.5890, 2.6177, 2.7026, 2.7028,
<span class="lineNum"> 155 </span> : 2.7080, 2.7110, 2.7159, 2.7192, 2.7217,
<span class="lineNum"> 156 </span> : 2.7227, 2.7263, 2.7313, 2.7344, 2.7348,
<span class="lineNum"> 157 </span> : 2.7450, 2.7501, 2.7641, 2.7670, 2.7711,
<span class="lineNum"> 158 </span> : 2.7724, 2.7753, 2.7757, 2.7853, 2.7870,
<span class="lineNum"> 159 </span> : 2.7919, 2.7947, 2.7974, 2.8002, 2.8132,
<span class="lineNum"> 160 </span> : 2.8157, 2.8195, 2.8204, 2.8220, 2.8254,
<span class="lineNum"> 161 </span> : 2.8270, 2.8329, 2.8479, 2.8490, 2.8532,
<span class="lineNum"> 162 </span> : 2.8578, 2.8662, 2.8710, 2.8737, 2.8742,
<span class="lineNum"> 163 </span> : 2.8750, 2.9768, 2.9810, 2.9825, 2.9873,
<span class="lineNum"> 164 </span> : 2.9884, 3.0040, 3.0055, 3.0066, 3.0119,
<span class="lineNum"> 165 </span> : 3.0189, 3.0239, 3.0277, 3.0335, 3.0345,
<span class="lineNum"> 166 </span> : 3.0388, 3.0521, 3.0673, 3.0717, 3.0734,
<span class="lineNum"> 167 </span> : 3.0753, 3.0770, 3.0961, 3.0975, 3.0988,
<span class="lineNum"> 168 </span> : 3.1004, 3.1018, 3.1018, 3.1041, 3.1058,
<span class="lineNum"> 169 </span> : 3.1067, 3.1126, 3.1144, 3.1178, 3.1185,
<span class="lineNum"> 170 </span> : 3.1226, 3.1264, 3.1303, 3.1308, 3.1314,
<span class="lineNum"> 171 </span> : 3.1339, 3.1346, 3.1364, 3.1384, 3.1389,
<span class="lineNum"> 172 </span> : 3.1390, 3.1399, 3.1405, 3.1406, 3.1412,
<span class="lineNum"> 173 </span> : 3.1412, 3.1424, 3.1467, 3.1556, 3.1650,
<span class="lineNum"> 174 </span> : 3.1662, 3.1834, 3.1839, 3.1853, 3.1855,
<span class="lineNum"> 175 </span> : 3.1864, 3.1889, 3.1912, 3.1913, 3.1918,
<span class="lineNum"> 176 </span> : 3.1924, 3.1934, 3.1951, 3.2129, 3.2138,
<span class="lineNum"> 177 </span> : 3.2176,
<span class="lineNum"> 178 </span> : };
<span class="lineNum"> 179 </span> :
<span class="lineNum"> 180 </span> : /*
<span class="lineNum"> 181 </span> : * Divider for SMART attribute 188
<span class="lineNum"> 182 </span> : */
<span class="lineNum"> 183 </span> : static unsigned SMART_188_STEP = 1;
<span class="lineNum"> 184 </span> :
<span class="lineNum"> 185 </span> : /*
<span class="lineNum"> 186 </span> : * Failure rate for 30 days, for a disk
<span class="lineNum"> 187 </span> : * with SMART attribute 188 at a given value.
<span class="lineNum"> 188 </span> : */
<span class="lineNum"> 189 </span> : static double SMART_188_R[SMART_MEASURES] = {
<span class="lineNum"> 190 </span> : 0.0022, 0.0087, 0.0113, 0.0131, 0.0143,
<span class="lineNum"> 191 </span> : 0.0157, 0.0176, 0.0203, 0.0233, 0.0271,
<span class="lineNum"> 192 </span> : 0.0317, 0.0377, 0.0449, 0.0542, 0.0658,
<span class="lineNum"> 193 </span> : 0.0798, 0.0934, 0.1100, 0.1268, 0.1451,
<span class="lineNum"> 194 </span> : 0.1626, 0.1820, 0.1975, 0.2138, 0.2270,
<span class="lineNum"> 195 </span> : 0.2397, 0.2515, 0.2606, 0.2692, 0.2792,
<span class="lineNum"> 196 </span> : 0.2861, 0.2954, 0.3050, 0.3165, 0.3252,
<span class="lineNum"> 197 </span> : 0.3369, 0.3430, 0.3512, 0.3588, 0.3731,
<span class="lineNum"> 198 </span> : 0.3777, 0.3894, 0.3981, 0.4148, 0.4206,
<span class="lineNum"> 199 </span> : 0.4325, 0.4354, 0.4449, 0.4503, 0.4635,
<span class="lineNum"> 200 </span> : 0.4695, 0.4806, 0.4871, 0.4988, 0.5007,
<span class="lineNum"> 201 </span> : 0.5099, 0.5144, 0.5270, 0.5313, 0.5393,
<span class="lineNum"> 202 </span> : 0.5456, 0.5529, 0.5542, 0.5633, 0.5657,
<span class="lineNum"> 203 </span> : 0.5729, 0.5748, 0.5814, 0.5906, 0.5977,
<span class="lineNum"> 204 </span> : 0.6045, 0.6096, 0.6208, 0.6259, 0.6293,
<span class="lineNum"> 205 </span> : 0.6347, 0.6354, 0.6389, 0.6449, 0.6481,
<span class="lineNum"> 206 </span> : 0.6549, 0.6581, 0.6604, 0.6703, 0.6759,
<span class="lineNum"> 207 </span> : 0.6830, 0.6882, 0.6900, 0.6931, 0.7027,
<span class="lineNum"> 208 </span> : 0.7070, 0.7125, 0.7202, 0.7302, 0.7405,
<span class="lineNum"> 209 </span> : 0.7467, 0.7520, 0.7573, 0.7616, 0.7688,
<span class="lineNum"> 210 </span> : 0.7732, 0.7773, 0.7825, 0.7890, 0.7940,
<span class="lineNum"> 211 </span> : 0.8113, 0.8213, 0.8344, 0.8364, 0.8403,
<span class="lineNum"> 212 </span> : 0.8449, 0.8488, 0.8567, 0.8621, 0.8668,
<span class="lineNum"> 213 </span> : 0.8729, 0.8737, 0.8750, 0.8782, 0.8807,
<span class="lineNum"> 214 </span> : 0.8821, 0.8920, 0.8987, 0.8990, 0.9099,
<span class="lineNum"> 215 </span> : 0.9141, 0.9165, 0.9195, 0.9198, 0.9235,
<span class="lineNum"> 216 </span> : 0.9247, 0.9315, 0.9359, 0.9372, 0.9394,
<span class="lineNum"> 217 </span> : 0.9451, 0.9454, 0.9493, 0.9520, 0.9534,
<span class="lineNum"> 218 </span> : 0.9556, 0.9564, 0.9605, 0.9628, 0.9648,
<span class="lineNum"> 219 </span> : 0.9709, 0.9717, 0.9761, 0.9784, 0.9788,
<span class="lineNum"> 220 </span> : 0.9824, 0.9884, 0.9938, 0.9944, 1.0056,
<span class="lineNum"> 221 </span> : 1.0061, 1.0111, 1.0314, 1.0375, 1.0393,
<span class="lineNum"> 222 </span> : 1.0396, 1.0397, 1.0414, 1.0418, 1.0466,
<span class="lineNum"> 223 </span> : 1.0467, 1.0474, 1.0475, 1.0523, 1.0523,
<span class="lineNum"> 224 </span> : 1.0524, 1.0525, 1.0557, 1.0597, 1.0597,
<span class="lineNum"> 225 </span> : 1.0598, 1.0599, 1.0599, 1.0602, 1.0603,
<span class="lineNum"> 226 </span> : 1.0603, 1.0605, 1.0605, 1.0610, 1.0611,
<span class="lineNum"> 227 </span> : 1.0613, 1.0615, 1.0628, 1.0666, 1.0732,
<span class="lineNum"> 228 </span> : 1.0792, 1.0796, 1.0797, 1.0864, 1.0935,
<span class="lineNum"> 229 </span> : 1.0936, 1.1013, 1.1066, 1.1088, 1.1088,
<span class="lineNum"> 230 </span> : 1.1093, 1.1119, 1.1136, 1.1146, 1.1245,
<span class="lineNum"> 231 </span> : 1.1274, 1.1275, 1.1276, 1.1280, 1.1280,
<span class="lineNum"> 232 </span> : 1.1347, 1.1348, 1.1348, 1.1348, 1.1350,
<span class="lineNum"> 233 </span> : 1.1408, 1.1476, 1.1477, 1.1477, 1.1478,
<span class="lineNum"> 234 </span> : 1.1479, 1.1479, 1.1479, 1.1480, 1.1480,
<span class="lineNum"> 235 </span> : 1.1564, 1.1714, 1.1732, 1.1747, 1.1816,
<span class="lineNum"> 236 </span> : 1.1819, 1.1887, 1.1906, 1.2126, 1.2167,
<span class="lineNum"> 237 </span> : 1.2168, 1.2168, 1.2168, 1.2171, 1.2171,
<span class="lineNum"> 238 </span> : 1.2268, 1.2396, 1.2397, 1.2418, 1.2478,
<span class="lineNum"> 239 </span> : 1.2588, 1.2610, 1.2615, 1.2651, 1.2668,
<span class="lineNum"> 240 </span> : 1.2682, 1.2732, 1.2738, 1.2747, 1.2764,
<span class="lineNum"> 241 </span> : 1.2765,
<span class="lineNum"> 242 </span> : };
<span class="lineNum"> 243 </span> :
<span class="lineNum"> 244 </span> : /*
<span class="lineNum"> 245 </span> : * Divider for SMART attribute 193
<span class="lineNum"> 246 </span> : */
<span class="lineNum"> 247 </span> : static unsigned SMART_193_STEP = 649;
<span class="lineNum"> 248 </span> :
<span class="lineNum"> 249 </span> : /*
<span class="lineNum"> 250 </span> : * Failure rate for 30 days, for a disk
<span class="lineNum"> 251 </span> : * with SMART attribute 193 at a given value.
<span class="lineNum"> 252 </span> : */
<span class="lineNum"> 253 </span> : static double SMART_193_R[SMART_MEASURES] = {
<span class="lineNum"> 254 </span> : 0.0000, 0.0014, 0.0027, 0.0030, 0.0031,
<span class="lineNum"> 255 </span> : 0.0033, 0.0036, 0.0038, 0.0041, 0.0043,
<span class="lineNum"> 256 </span> : 0.0046, 0.0048, 0.0050, 0.0053, 0.0056,
<span class="lineNum"> 257 </span> : 0.0058, 0.0060, 0.0064, 0.0067, 0.0069,
<span class="lineNum"> 258 </span> : 0.0073, 0.0076, 0.0079, 0.0082, 0.0085,
<span class="lineNum"> 259 </span> : 0.0088, 0.0091, 0.0094, 0.0097, 0.0100,
<span class="lineNum"> 260 </span> : 0.0104, 0.0107, 0.0110, 0.0113, 0.0115,
<span class="lineNum"> 261 </span> : 0.0117, 0.0120, 0.0123, 0.0126, 0.0129,
<span class="lineNum"> 262 </span> : 0.0131, 0.0134, 0.0138, 0.0141, 0.0144,
<span class="lineNum"> 263 </span> : 0.0149, 0.0153, 0.0156, 0.0159, 0.0162,
<span class="lineNum"> 264 </span> : 0.0166, 0.0168, 0.0171, 0.0173, 0.0176,
<span class="lineNum"> 265 </span> : 0.0179, 0.0183, 0.0186, 0.0191, 0.0196,
<span class="lineNum"> 266 </span> : 0.0202, 0.0207, 0.0213, 0.0217, 0.0221,
<span class="lineNum"> 267 </span> : 0.0225, 0.0233, 0.0238, 0.0243, 0.0247,
<span class="lineNum"> 268 </span> : 0.0252, 0.0257, 0.0261, 0.0265, 0.0271,
<span class="lineNum"> 269 </span> : 0.0278, 0.0284, 0.0290, 0.0294, 0.0298,
<span class="lineNum"> 270 </span> : 0.0304, 0.0310, 0.0316, 0.0321, 0.0325,
<span class="lineNum"> 271 </span> : 0.0329, 0.0334, 0.0340, 0.0346, 0.0351,
<span class="lineNum"> 272 </span> : 0.0355, 0.0359, 0.0365, 0.0372, 0.0379,
<span class="lineNum"> 273 </span> : 0.0387, 0.0395, 0.0405, 0.0413, 0.0419,
<span class="lineNum"> 274 </span> : 0.0424, 0.0432, 0.0440, 0.0447, 0.0455,
<span class="lineNum"> 275 </span> : 0.0461, 0.0467, 0.0471, 0.0476, 0.0481,
<span class="lineNum"> 276 </span> : 0.0486, 0.0490, 0.0495, 0.0500, 0.0505,
<span class="lineNum"> 277 </span> : 0.0512, 0.0518, 0.0524, 0.0532, 0.0540,
<span class="lineNum"> 278 </span> : 0.0545, 0.0552, 0.0559, 0.0566, 0.0574,
<span class="lineNum"> 279 </span> : 0.0582, 0.0592, 0.0601, 0.0607, 0.0616,
<span class="lineNum"> 280 </span> : 0.0623, 0.0631, 0.0639, 0.0646, 0.0654,
<span class="lineNum"> 281 </span> : 0.0661, 0.0668, 0.0677, 0.0685, 0.0696,
<span class="lineNum"> 282 </span> : 0.0707, 0.0717, 0.0727, 0.0737, 0.0749,
<span class="lineNum"> 283 </span> : 0.0759, 0.0773, 0.0783, 0.0791, 0.0800,
<span class="lineNum"> 284 </span> : 0.0809, 0.0819, 0.0829, 0.0839, 0.0847,
<span class="lineNum"> 285 </span> : 0.0858, 0.0867, 0.0876, 0.0884, 0.0895,
<span class="lineNum"> 286 </span> : 0.0906, 0.0919, 0.0931, 0.0943, 0.0954,
<span class="lineNum"> 287 </span> : 0.0966, 0.0976, 0.0985, 0.0995, 0.1009,
<span class="lineNum"> 288 </span> : 0.1021, 0.1038, 0.1051, 0.1065, 0.1076,
<span class="lineNum"> 289 </span> : 0.1090, 0.1106, 0.1119, 0.1130, 0.1146,
<span class="lineNum"> 290 </span> : 0.1158, 0.1168, 0.1181, 0.1193, 0.1206,
<span class="lineNum"> 291 </span> : 0.1216, 0.1227, 0.1241, 0.1257, 0.1268,
<span class="lineNum"> 292 </span> : 0.1277, 0.1289, 0.1302, 0.1316, 0.1329,
<span class="lineNum"> 293 </span> : 0.1341, 0.1355, 0.1372, 0.1387, 0.1400,
<span class="lineNum"> 294 </span> : 0.1415, 0.1427, 0.1438, 0.1447, 0.1458,
<span class="lineNum"> 295 </span> : 0.1470, 0.1480, 0.1491, 0.1502, 0.1517,
<span class="lineNum"> 296 </span> : 0.1528, 0.1539, 0.1555, 0.1568, 0.1583,
<span class="lineNum"> 297 </span> : 0.1594, 0.1606, 0.1618, 0.1635, 0.1649,
<span class="lineNum"> 298 </span> : 0.1665, 0.1686, 0.1700, 0.1719, 0.1731,
<span class="lineNum"> 299 </span> : 0.1743, 0.1755, 0.1777, 0.1788, 0.1802,
<span class="lineNum"> 300 </span> : 0.1812, 0.1824, 0.1835, 0.1848, 0.1859,
<span class="lineNum"> 301 </span> : 0.1869, 0.1880, 0.1890, 0.1901, 0.1913,
<span class="lineNum"> 302 </span> : 0.1926, 0.1935, 0.1948, 0.1960, 0.1977,
<span class="lineNum"> 303 </span> : 0.1989, 0.2001, 0.2013, 0.2024, 0.2036,
<span class="lineNum"> 304 </span> : 0.2049, 0.2062, 0.2074, 0.2087, 0.2099,
<span class="lineNum"> 305 </span> : 0.2111,
<span class="lineNum"> 306 </span> : };
<span class="lineNum"> 307 </span> :
<span class="lineNum"> 308 </span> : /*
<span class="lineNum"> 309 </span> : * Divider for SMART attribute 197
<span class="lineNum"> 310 </span> : */
<span class="lineNum"> 311 </span> : static unsigned SMART_197_STEP = 1;
<span class="lineNum"> 312 </span> :
<span class="lineNum"> 313 </span> : /*
<span class="lineNum"> 314 </span> : * Failure rate for 30 days, for a disk
<span class="lineNum"> 315 </span> : * with SMART attribute 197 at a given value.
<span class="lineNum"> 316 </span> : */
<span class="lineNum"> 317 </span> : static double SMART_197_R[SMART_MEASURES] = {
<span class="lineNum"> 318 </span> : 0.0036, 0.2430, 0.3027, 0.3349, 0.3533,
<span class="lineNum"> 319 </span> : 0.3632, 0.3722, 0.3790, 0.4199, 0.6417,
<span class="lineNum"> 320 </span> : 0.6517, 0.6583, 0.6647, 0.6680, 0.6737,
<span class="lineNum"> 321 </span> : 0.6787, 0.7076, 0.9073, 0.9113, 0.9194,
<span class="lineNum"> 322 </span> : 0.9238, 0.9326, 0.9394, 0.9446, 0.9697,
<span class="lineNum"> 323 </span> : 1.1417, 1.1466, 1.1485, 1.1522, 1.1775,
<span class="lineNum"> 324 </span> : 1.1817, 1.1864, 1.2105, 1.3939, 1.3991,
<span class="lineNum"> 325 </span> : 1.4013, 1.4125, 1.4135, 1.4210, 1.4217,
<span class="lineNum"> 326 </span> : 1.4335, 1.6024, 1.6040, 1.6132, 1.6174,
<span class="lineNum"> 327 </span> : 1.6187, 1.6203, 1.6211, 1.6354, 1.7839,
<span class="lineNum"> 328 </span> : 1.7858, 1.7869, 1.7889, 1.7911, 1.7932,
<span class="lineNum"> 329 </span> : 1.7962, 1.8091, 1.9381, 1.9405, 1.9410,
<span class="lineNum"> 330 </span> : 1.9415, 1.9420, 1.9424, 1.9434, 1.9518,
<span class="lineNum"> 331 </span> : 2.0516, 2.0518, 2.0521, 2.0524, 2.0532,
<span class="lineNum"> 332 </span> : 2.0538, 2.0550, 2.0624, 2.1508, 2.1514,
<span class="lineNum"> 333 </span> : 2.1519, 2.1519, 2.1520, 2.1533, 2.1534,
<span class="lineNum"> 334 </span> : 2.1603, 2.2730, 2.2730, 2.2730, 2.2757,
<span class="lineNum"> 335 </span> : 2.2768, 2.2774, 2.2778, 2.2844, 2.3740,
<span class="lineNum"> 336 </span> : 2.3753, 2.3769, 2.3779, 2.3790, 2.3796,
<span class="lineNum"> 337 </span> : 2.3806, 2.3891, 2.5538, 2.5550, 2.5563,
<span class="lineNum"> 338 </span> : 2.5588, 2.5594, 2.5600, 2.5605, 2.5665,
<span class="lineNum"> 339 </span> : 2.7510, 2.7526, 2.7539, 2.7544, 2.7549,
<span class="lineNum"> 340 </span> : 2.7552, 2.7555, 2.7590, 2.8782, 2.8788,
<span class="lineNum"> 341 </span> : 2.8812, 2.8821, 2.8824, 2.8836, 2.8836,
<span class="lineNum"> 342 </span> : 2.8864, 2.9536, 2.9539, 2.9543, 2.9559,
<span class="lineNum"> 343 </span> : 2.9565, 2.9572, 2.9572, 2.9601, 3.0230,
<span class="lineNum"> 344 </span> : 3.0230, 3.0230, 3.0230, 3.0230, 3.0231,
<span class="lineNum"> 345 </span> : 3.0231, 3.0266, 3.0846, 3.0846, 3.0846,
<span class="lineNum"> 346 </span> : 3.0846, 3.0846, 3.0847, 3.0851, 3.0874,
<span class="lineNum"> 347 </span> : 3.1242, 3.1242, 3.1242, 3.1242, 3.1246,
<span class="lineNum"> 348 </span> : 3.1246, 3.1246, 3.1273, 3.1806, 3.1806,
<span class="lineNum"> 349 </span> : 3.1806, 3.1806, 3.1806, 3.1810, 3.1814,
<span class="lineNum"> 350 </span> : 3.1829, 3.2173, 3.2174, 3.2174, 3.2174,
<span class="lineNum"> 351 </span> : 3.2174, 3.2174, 3.2174, 3.2197, 3.2643,
<span class="lineNum"> 352 </span> : 3.2643, 3.2643, 3.2661, 3.2661, 3.2666,
<span class="lineNum"> 353 </span> : 3.2666, 3.2677, 3.2962, 3.2962, 3.2963,
<span class="lineNum"> 354 </span> : 3.3673, 3.3713, 3.3813, 3.3813, 3.3835,
<span class="lineNum"> 355 </span> : 3.4059, 3.4059, 3.4065, 3.4091, 3.4096,
<span class="lineNum"> 356 </span> : 3.4103, 3.4104, 3.4123, 3.4316, 3.4360,
<span class="lineNum"> 357 </span> : 3.4387, 3.4393, 3.4393, 3.4404, 3.4409,
<span class="lineNum"> 358 </span> : 3.4440, 3.5547, 3.5547, 3.5547, 3.5547,
<span class="lineNum"> 359 </span> : 3.5547, 3.5547, 3.5548, 3.5558, 3.5801,
<span class="lineNum"> 360 </span> : 3.5801, 3.5801, 3.5801, 3.5802, 3.5802,
<span class="lineNum"> 361 </span> : 3.5802, 3.5820, 3.6178, 3.6178, 3.6178,
<span class="lineNum"> 362 </span> : 3.6178, 3.6178, 3.6242, 3.6242, 3.6260,
<span class="lineNum"> 363 </span> : 3.6567, 3.6567, 3.6568, 3.6568, 3.6568,
<span class="lineNum"> 364 </span> : 3.6568, 3.6831, 3.6841, 3.7260, 3.7268,
<span class="lineNum"> 365 </span> : 3.7269, 3.7269, 3.7269, 3.7269, 3.7269,
<span class="lineNum"> 366 </span> : 3.7279, 3.7387, 3.7387, 3.7394, 3.7394,
<span class="lineNum"> 367 </span> : 3.7394, 3.7394, 3.7394, 3.7402, 3.7622,
<span class="lineNum"> 368 </span> : 3.7622, 3.7629, 3.7734, 3.7734, 3.7734,
<span class="lineNum"> 369 </span> : 3.7734,
<span class="lineNum"> 370 </span> : };
<span class="lineNum"> 371 </span> :
<span class="lineNum"> 372 </span> : /*
<span class="lineNum"> 373 </span> : * Divider for SMART attribute 198
<span class="lineNum"> 374 </span> : */
<span class="lineNum"> 375 </span> : static unsigned SMART_198_STEP = 1;
<span class="lineNum"> 376 </span> :
<span class="lineNum"> 377 </span> : /*
<span class="lineNum"> 378 </span> : * Failure rate for 30 days, for a disk
<span class="lineNum"> 379 </span> : * with SMART attribute 198 at a given value.
<span class="lineNum"> 380 </span> : */
<span class="lineNum"> 381 </span> : static double SMART_198_R[SMART_MEASURES] = {
<span class="lineNum"> 382 </span> : 0.0038, 0.3963, 0.4189, 0.4297, 0.4364,
<span class="lineNum"> 383 </span> : 0.4393, 0.4433, 0.4490, 0.4909, 0.7634,
<span class="lineNum"> 384 </span> : 0.7649, 0.7683, 0.7689, 0.7703, 0.7717,
<span class="lineNum"> 385 </span> : 0.7737, 0.8009, 1.0435, 1.0438, 1.0445,
<span class="lineNum"> 386 </span> : 1.0446, 1.0456, 1.0496, 1.0501, 1.0695,
<span class="lineNum"> 387 </span> : 1.2652, 1.2662, 1.2667, 1.2707, 1.2722,
<span class="lineNum"> 388 </span> : 1.2734, 1.2750, 1.2974, 1.5036, 1.5038,
<span class="lineNum"> 389 </span> : 1.5050, 1.5156, 1.5156, 1.5231, 1.5239,
<span class="lineNum"> 390 </span> : 1.5347, 1.7251, 1.7258, 1.7271, 1.7271,
<span class="lineNum"> 391 </span> : 1.7271, 1.7271, 1.7271, 1.7423, 1.9132,
<span class="lineNum"> 392 </span> : 1.9134, 1.9134, 1.9134, 1.9134, 1.9135,
<span class="lineNum"> 393 </span> : 1.9135, 1.9221, 2.0645, 2.0645, 2.0645,
<span class="lineNum"> 394 </span> : 2.0645, 2.0645, 2.0645, 2.0645, 2.0716,
<span class="lineNum"> 395 </span> : 2.1838, 2.1838, 2.1838, 2.1838, 2.1838,
<span class="lineNum"> 396 </span> : 2.1838, 2.1838, 2.1910, 2.2936, 2.2937,
<span class="lineNum"> 397 </span> : 2.2937, 2.2937, 2.2937, 2.2937, 2.2937,
<span class="lineNum"> 398 </span> : 2.3007, 2.4350, 2.4350, 2.4350, 2.4352,
<span class="lineNum"> 399 </span> : 2.4352, 2.4352, 2.4352, 2.4407, 2.5482,
<span class="lineNum"> 400 </span> : 2.5482, 2.5482, 2.5482, 2.5482, 2.5482,
<span class="lineNum"> 401 </span> : 2.5482, 2.5539, 2.7538, 2.7538, 2.7538,
<span class="lineNum"> 402 </span> : 2.7538, 2.7538, 2.7538, 2.7539, 2.7585,
<span class="lineNum"> 403 </span> : 2.9231, 2.9231, 2.9231, 2.9231, 2.9231,
<span class="lineNum"> 404 </span> : 2.9232, 2.9232, 2.9264, 3.0707, 3.0707,
<span class="lineNum"> 405 </span> : 3.0707, 3.0707, 3.0707, 3.0707, 3.0707,
<span class="lineNum"> 406 </span> : 3.0734, 3.1562, 3.1562, 3.1562, 3.1562,
<span class="lineNum"> 407 </span> : 3.1562, 3.1562, 3.1562, 3.1584, 3.2363,
<span class="lineNum"> 408 </span> : 3.2363, 3.2363, 3.2363, 3.2363, 3.2363,
<span class="lineNum"> 409 </span> : 3.2363, 3.2397, 3.3121, 3.3121, 3.3121,
<span class="lineNum"> 410 </span> : 3.3121, 3.3121, 3.3122, 3.3122, 3.3142,
<span class="lineNum"> 411 </span> : 3.3612, 3.3612, 3.3612, 3.3612, 3.3612,
<span class="lineNum"> 412 </span> : 3.3612, 3.3612, 3.3636, 3.4314, 3.4314,
<span class="lineNum"> 413 </span> : 3.4314, 3.4314, 3.4314, 3.4314, 3.4314,
<span class="lineNum"> 414 </span> : 3.4325, 3.4769, 3.4769, 3.4769, 3.4769,
<span class="lineNum"> 415 </span> : 3.4769, 3.4769, 3.4769, 3.4788, 3.5366,
<span class="lineNum"> 416 </span> : 3.5366, 3.5366, 3.5366, 3.5366, 3.5366,
<span class="lineNum"> 417 </span> : 3.5366, 3.5377, 3.5756, 3.5756, 3.5756,
<span class="lineNum"> 418 </span> : 3.5756, 3.5756, 3.5756, 3.5756, 3.5775,
<span class="lineNum"> 419 </span> : 3.6049, 3.6049, 3.6049, 3.6049, 3.6049,
<span class="lineNum"> 420 </span> : 3.6049, 3.6049, 3.6061, 3.6279, 3.6279,
<span class="lineNum"> 421 </span> : 3.6279, 3.6279, 3.6279, 3.6279, 3.6279,
<span class="lineNum"> 422 </span> : 3.6309, 3.7670, 3.7670, 3.7670, 3.7670,
<span class="lineNum"> 423 </span> : 3.7670, 3.7670, 3.7670, 3.7679, 3.7983,
<span class="lineNum"> 424 </span> : 3.7983, 3.7983, 3.7983, 3.7983, 3.7983,
<span class="lineNum"> 425 </span> : 3.7983, 3.8000, 3.8449, 3.8449, 3.8449,
<span class="lineNum"> 426 </span> : 3.8449, 3.8449, 3.8449, 3.8449, 3.8467,
<span class="lineNum"> 427 </span> : 3.8854, 3.9337, 3.9337, 3.9337, 3.9337,
<span class="lineNum"> 428 </span> : 3.9337, 3.9337, 3.9346, 3.9892, 3.9892,
<span class="lineNum"> 429 </span> : 3.9892, 3.9892, 3.9892, 3.9892, 3.9892,
<span class="lineNum"> 430 </span> : 3.9901, 4.0043, 4.0043, 4.0043, 4.0043,
<span class="lineNum"> 431 </span> : 4.0043, 4.0043, 4.0043, 4.0050, 4.0340,
<span class="lineNum"> 432 </span> : 4.0340, 4.0340, 4.0340, 4.0340, 4.0340,
<span class="lineNum"> 433 </span> : 4.0340,
<span class="lineNum"> 434 </span> : };
<span class="lineNum"> 435 </span> :
<span class="lineNum"> 436 </span> : /**
<a name="437"><span class="lineNum"> 437 </span> : * Computes the estimated Annual Failure Rate from the specified table.</a>
<span class="lineNum"> 438 </span> : */
<span class="lineNum"> 439 </span><span class="lineCov"> 72 : static double smart_afr_value(double* tab, unsigned step, uint64_t value)</span>
<span class="lineNum"> 440 </span> : {
<span class="lineNum"> 441 </span><span class="lineCov"> 72 : value /= step;</span>
<span class="lineNum"> 442 </span> :
<span class="lineNum"> 443 </span><span class="lineCov"> 72 : if (value &gt;= SMART_MEASURES)</span>
<span class="lineNum"> 444 </span><span class="lineNoCov"> 0 : value = SMART_MEASURES - 1;</span>
<span class="lineNum"> 445 </span> :
<span class="lineNum"> 446 </span> : /* table rates are for a month, so we scale to a year */
<span class="lineNum"> 447 </span><span class="lineCov"> 72 : return 365.0 / 30.0 * tab[value];</span>
<span class="lineNum"> 448 </span> : }
<span class="lineNum"> 449 </span> :
<span class="lineNum"> 450 </span> : /**
<span class="lineNum"> 451 </span> : * Computes the estimated Annual Failure Rate of a set of SMART attributes.
<span class="lineNum"> 452 </span> : *
<span class="lineNum"> 453 </span> : * We define the Annual Failure Rate as the average number of
<span class="lineNum"> 454 </span> : * failures you expect in a year from a disk slot:
<span class="lineNum"> 455 </span> : *
<span class="lineNum"> 456 </span> : * AFR = 8760/MTBF (Mean Time Between Failures in hours).
<span class="lineNum"> 457 </span> : *
<span class="lineNum"> 458 </span> : * Note that this definition is different from the one given
<span class="lineNum"> 459 </span> : * by Seagate, that defines AFR = 1 - exp(-8760/MTBF), that
<span class="lineNum"> 460 </span> : * instead represents the probability of a failure in the next
<span class="lineNum"> 461 </span> : * year.
<span class="lineNum"> 462 </span> : *
<span class="lineNum"> 463 </span> : * To combine the different AFR from different SMART attributes,
<span class="lineNum"> 464 </span> : * we use the maximum rate reported, and we do not sum them,
<a name="465"><span class="lineNum"> 465 </span> : * because the attributes are not independent.</a>
<span class="lineNum"> 466 </span> : */
<span class="lineNum"> 467 </span><span class="lineCov"> 13 : static double smart_afr(uint64_t* smart)</span>
<span class="lineNum"> 468 </span> : {
<span class="lineNum"> 469 </span><span class="lineCov"> 13 : double afr = 0;</span>
<span class="lineNum"> 470 </span><span class="lineCov"> 13 : uint64_t mask32 = 0xffffffffU;</span>
<span class="lineNum"> 471 </span><span class="lineCov"> 13 : uint64_t mask16 = 0xffffU;</span>
<span class="lineNum"> 472 </span> :
<span class="lineNum"> 473 </span><span class="lineCov"> 13 : if (smart[5] != SMART_UNASSIGNED) {</span>
<span class="lineNum"> 474 </span><span class="lineCov"> 12 : double r = smart_afr_value(SMART_5_R, SMART_5_STEP, smart[5] &amp; mask32);</span>
<span class="lineNum"> 475 </span><span class="lineCov"> 12 : if (afr &lt; r)</span>
<span class="lineNum"> 476 </span><span class="lineCov"> 12 : afr = r;</span>
<span class="lineNum"> 477 </span> : }
<span class="lineNum"> 478 </span> :
<span class="lineNum"> 479 </span><span class="lineCov"> 13 : if (smart[187] != SMART_UNASSIGNED) {</span>
<span class="lineNum"> 480 </span> : /* with some disks, only the lower 16 bits are significative */
<span class="lineNum"> 481 </span> : /* See: http://web.archive.org/web/20130507072056/http://media.kingston.com/support/downloads/MKP_306_SMART_attribute.pdf */
<span class="lineNum"> 482 </span><span class="lineCov"> 12 : double r = smart_afr_value(SMART_187_R, SMART_187_STEP, smart[187] &amp; mask16);</span>
<span class="lineNum"> 483 </span><span class="lineCov"> 12 : if (afr &lt; r)</span>
<span class="lineNum"> 484 </span><span class="lineCov"> 12 : afr = r;</span>
<span class="lineNum"> 485 </span> : }
<span class="lineNum"> 486 </span> :
<span class="lineNum"> 487 </span><span class="lineCov"> 13 : if (smart[188] != SMART_UNASSIGNED) {</span>
<span class="lineNum"> 488 </span> : /* with Seagate disks, there are three different 16 bits value reported */
<span class="lineNum"> 489 </span> : /* the lowest one is the most significative */
<span class="lineNum"> 490 </span><span class="lineCov"> 12 : double r = smart_afr_value(SMART_188_R, SMART_188_STEP, smart[188] &amp; mask16);</span>
<span class="lineNum"> 491 </span><span class="lineCov"> 12 : if (afr &lt; r)</span>
<span class="lineNum"> 492 </span><span class="lineNoCov"> 0 : afr = r;</span>
<span class="lineNum"> 493 </span> : }
<span class="lineNum"> 494 </span> :
<span class="lineNum"> 495 </span><span class="lineCov"> 13 : if (smart[193] != SMART_UNASSIGNED) {</span>
<span class="lineNum"> 496 </span><span class="lineCov"> 12 : double r = smart_afr_value(SMART_193_R, SMART_193_STEP, smart[193] &amp; mask32);</span>
<span class="lineNum"> 497 </span><span class="lineCov"> 12 : if (afr &lt; r)</span>
<span class="lineNum"> 498 </span><span class="lineNoCov"> 0 : afr = r;</span>
<span class="lineNum"> 499 </span> : }
<span class="lineNum"> 500 </span> :
<span class="lineNum"> 501 </span><span class="lineCov"> 13 : if (smart[197] != SMART_UNASSIGNED) {</span>
<span class="lineNum"> 502 </span><span class="lineCov"> 12 : double r = smart_afr_value(SMART_197_R, SMART_197_STEP, smart[197] &amp; mask32);</span>
<span class="lineNum"> 503 </span><span class="lineCov"> 12 : if (afr &lt; r)</span>
<span class="lineNum"> 504 </span><span class="lineCov"> 12 : afr = r;</span>
<span class="lineNum"> 505 </span> : }
<span class="lineNum"> 506 </span> :
<span class="lineNum"> 507 </span><span class="lineCov"> 13 : if (smart[198] != SMART_UNASSIGNED) {</span>
<span class="lineNum"> 508 </span><span class="lineCov"> 12 : double r = smart_afr_value(SMART_198_R, SMART_198_STEP, smart[198] &amp; mask32);</span>
<span class="lineNum"> 509 </span><span class="lineCov"> 12 : if (afr &lt; r)</span>
<span class="lineNum"> 510 </span><span class="lineCov"> 12 : afr = r;</span>
<span class="lineNum"> 511 </span> : }
<span class="lineNum"> 512 </span> :
<span class="lineNum"> 513 </span><span class="lineCov"> 13 : return afr;</span>
<span class="lineNum"> 514 </span> : }
<span class="lineNum"> 515 </span> :
<span class="lineNum"> 516 </span> : /**
<a name="517"><span class="lineNum"> 517 </span> : * Factorial.</a>
<span class="lineNum"> 518 </span> : */
<span class="lineNum"> 519 </span><span class="lineCov"> 31 : static double fact(unsigned n)</span>
<span class="lineNum"> 520 </span> : {
<span class="lineNum"> 521 </span><span class="lineCov"> 31 : double v = 1;</span>
<span class="lineNum"> 522 </span> :
<span class="lineNum"> 523 </span><span class="lineCov"> 62 : while (n &gt; 1)</span>
<span class="lineNum"> 524 </span><span class="lineNoCov"> 0 : v *= n--;</span>
<span class="lineNum"> 525 </span> :
<span class="lineNum"> 526 </span><span class="lineCov"> 31 : return v;</span>
<span class="lineNum"> 527 </span> : }
<span class="lineNum"> 528 </span> :
<span class="lineNum"> 529 </span> : /**
<span class="lineNum"> 530 </span> : * Probability of having exactly ::n events in a Poisson
<a name="531"><span class="lineNum"> 531 </span> : * distribution with rate ::rate in a time unit.</a>
<span class="lineNum"> 532 </span> : */
<span class="lineNum"> 533 </span><span class="lineCov"> 31 : static double poisson_prob_n_failures(double rate, unsigned n)</span>
<span class="lineNum"> 534 </span> : {
<span class="lineNum"> 535 </span><span class="lineCov"> 31 : return pow(rate, n) * exp(-rate) / fact(n);</span>
<span class="lineNum"> 536 </span> : }
<span class="lineNum"> 537 </span> :
<span class="lineNum"> 538 </span> : /**
<span class="lineNum"> 539 </span> : * Probability of having ::n or more events in a Poisson
<a name="540"><span class="lineNum"> 540 </span> : * distribution with rate ::rate in a time unit.</a>
<span class="lineNum"> 541 </span> : */
<span class="lineNum"> 542 </span><span class="lineCov"> 31 : static double poisson_prob_n_or_more_failures(double rate, unsigned n)</span>
<span class="lineNum"> 543 </span> : {
<span class="lineNum"> 544 </span><span class="lineCov"> 31 : double p_neg = 0;</span>
<span class="lineNum"> 545 </span> : unsigned i;
<span class="lineNum"> 546 </span> :
<span class="lineNum"> 547 </span><span class="lineCov"> 62 : for (i = 0; i &lt; n; ++i)</span>
<span class="lineNum"> 548 </span><span class="lineCov"> 31 : p_neg += poisson_prob_n_failures(rate, n - 1 - i);</span>
<span class="lineNum"> 549 </span> :
<span class="lineNum"> 550 </span><span class="lineCov"> 31 : return 1 - p_neg;</span>
<span class="lineNum"> 551 </span> : }
<span class="lineNum"> 552 </span> :
<span class="lineNum"> 553 </span> : /**
<span class="lineNum"> 554 </span> : * Probability of having data loss in a RAID system with the specified ::redundancy
<a name="555"><span class="lineNum"> 555 </span> : * supposing the specified ::array_failure_rate, and ::replace_rate.</a>
<span class="lineNum"> 556 </span> : */
<span class="lineNum"> 557 </span><span class="lineCov"> 18 : static double raid_prob_of_one_or_more_failures(double array_failure_rate, double replace_rate, unsigned n, unsigned redundancy)</span>
<span class="lineNum"> 558 </span> : {
<span class="lineNum"> 559 </span> : unsigned i;
<span class="lineNum"> 560 </span> : double MTBF;
<span class="lineNum"> 561 </span> : double MTTR;
<span class="lineNum"> 562 </span> : double MTTDL;
<span class="lineNum"> 563 </span> : double raid_failure_rate;
<span class="lineNum"> 564 </span> :
<span class="lineNum"> 565 </span> : /*
<span class="lineNum"> 566 </span> : * Use the MTTDL model (Mean Time To Data Loss) to estimate the
<span class="lineNum"> 567 </span> : * failure rate of the array.
<span class="lineNum"> 568 </span> : *
<span class="lineNum"> 569 </span> : * See:
<span class="lineNum"> 570 </span> : * Garth Alan Gibson, &quot;Redundant Disk Arrays: Reliable, Parallel Secondary Storage&quot;, 1990
<span class="lineNum"> 571 </span> : */
<span class="lineNum"> 572 </span> :
<span class="lineNum"> 573 </span> : /* get the Mean Time Between Failure of a single disk */
<span class="lineNum"> 574 </span> : /* from the array failure rate */
<span class="lineNum"> 575 </span><span class="lineCov"> 18 : MTBF = n / array_failure_rate;</span>
<span class="lineNum"> 576 </span> :
<span class="lineNum"> 577 </span> : /* get the Mean Time Between Repair (the time that a failed disk is replaced) */
<span class="lineNum"> 578 </span> : /* from the repair rate */
<span class="lineNum"> 579 </span><span class="lineCov"> 18 : MTTR = 1.0 / replace_rate;</span>
<span class="lineNum"> 580 </span> :
<span class="lineNum"> 581 </span> : /* use the approximated MTTDL equation */
<span class="lineNum"> 582 </span><span class="lineCov"> 18 : MTTDL = pow(MTBF, redundancy + 1) / pow(MTTR, redundancy);</span>
<span class="lineNum"> 583 </span><span class="lineCov"> 99 : for (i = 0; i &lt; redundancy + 1; ++i)</span>
<span class="lineNum"> 584 </span><span class="lineCov"> 81 : MTTDL /= n - i;</span>
<span class="lineNum"> 585 </span> :
<span class="lineNum"> 586 </span> : /* the raid failure rate is just the inverse of the MTTDL */
<span class="lineNum"> 587 </span><span class="lineCov"> 18 : raid_failure_rate = 1.0 / MTTDL;</span>
<span class="lineNum"> 588 </span> :
<span class="lineNum"> 589 </span> : /* probability of at least one RAID failure */
<span class="lineNum"> 590 </span> : /* note that is almost equal at the probabilty of */
<span class="lineNum"> 591 </span> : /* the first failure. */
<span class="lineNum"> 592 </span><span class="lineCov"> 18 : return poisson_prob_n_or_more_failures(raid_failure_rate, 1);</span>
<span class="lineNum"> 593 </span> : }
<span class="lineNum"> 594 </span> :
<span class="lineNum"> 595 </span> : /**
<a name="596"><span class="lineNum"> 596 </span> : * Prints a string with space padding.</a>
<span class="lineNum"> 597 </span> : */
<span class="lineNum"> 598 </span><span class="lineCov"> 52 : static void printl(const char* str, size_t pad)</span>
<span class="lineNum"> 599 </span> : {
<span class="lineNum"> 600 </span> : size_t len;
<span class="lineNum"> 601 </span> :
<span class="lineNum"> 602 </span><span class="lineCov"> 52 : printf(&quot;%s&quot;, str);</span>
<span class="lineNum"> 603 </span> :
<span class="lineNum"> 604 </span><span class="lineCov"> 52 : len = strlen(str);</span>
<span class="lineNum"> 605 </span> :
<span class="lineNum"> 606 </span><span class="lineCov"> 285 : while (len &lt; pad) {</span>
<span class="lineNum"> 607 </span><span class="lineCov"> 181 : printf(&quot; &quot;);</span>
<span class="lineNum"> 608 </span><span class="lineCov"> 181 : ++len;</span>
<span class="lineNum"> 609 </span> : }
<span class="lineNum"> 610 </span><span class="lineCov"> 52 : }</span>
<span class="lineNum"> 611 </span> :
<span class="lineNum"> 612 </span> : /**
<a name="613"><span class="lineNum"> 613 </span> : * Prints a probability with space padding.</a>
<span class="lineNum"> 614 </span> : */
<span class="lineNum"> 615 </span><span class="lineCov"> 18 : static void printp(double v, size_t pad)</span>
<span class="lineNum"> 616 </span> : {
<span class="lineNum"> 617 </span> : char buf[64];
<span class="lineNum"> 618 </span><span class="lineCov"> 18 : const char* s = &quot;%&quot;;</span>
<span class="lineNum"> 619 </span> :
<span class="lineNum"> 620 </span><span class="lineCov"> 18 : if (v &gt; 0.1)</span>
<span class="lineNum"> 621 </span><span class="lineCov"> 18 : snprintf(buf, sizeof(buf), &quot;%5.2f%s&quot;, v, s);</span>
<span class="lineNum"> 622 </span><span class="lineNoCov"> 0 : else if (v &gt; 0.01)</span>
<span class="lineNum"> 623 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%6.3f%s&quot;, v, s);</span>
<span class="lineNum"> 624 </span><span class="lineNoCov"> 0 : else if (v &gt; 0.001)</span>
<span class="lineNum"> 625 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%7.4f%s&quot;, v, s);</span>
<span class="lineNum"> 626 </span><span class="lineNoCov"> 0 : else if (v &gt; 0.0001)</span>
<span class="lineNum"> 627 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%8.5f%s&quot;, v, s);</span>
<span class="lineNum"> 628 </span><span class="lineNoCov"> 0 : else if (v &gt; 0.00001)</span>
<span class="lineNum"> 629 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%9.6f%s&quot;, v, s);</span>
<span class="lineNum"> 630 </span><span class="lineNoCov"> 0 : else if (v &gt; 0.000001)</span>
<span class="lineNum"> 631 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%10.7f%s&quot;, v, s);</span>
<span class="lineNum"> 632 </span><span class="lineNoCov"> 0 : else if (v &gt; 0.0000001)</span>
<span class="lineNum"> 633 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%11.8f%s&quot;, v, s);</span>
<span class="lineNum"> 634 </span><span class="lineNoCov"> 0 : else if (v &gt; 0.00000001)</span>
<span class="lineNum"> 635 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%12.9f%s&quot;, v, s);</span>
<span class="lineNum"> 636 </span><span class="lineNoCov"> 0 : else if (v &gt; 0.000000001)</span>
<span class="lineNum"> 637 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%13.10f%s&quot;, v, s);</span>
<span class="lineNum"> 638 </span><span class="lineNoCov"> 0 : else if (v &gt; 0.0000000001)</span>
<span class="lineNum"> 639 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%14.11f%s&quot;, v, s);</span>
<span class="lineNum"> 640 </span><span class="lineNoCov"> 0 : else if (v &gt; 0.00000000001)</span>
<span class="lineNum"> 641 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%15.12f%s&quot;, v, s);</span>
<span class="lineNum"> 642 </span><span class="lineNoCov"> 0 : else if (v &gt; 0.000000000001)</span>
<span class="lineNum"> 643 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%16.13f%s&quot;, v, s);</span>
<span class="lineNum"> 644 </span> : else
<span class="lineNum"> 645 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%17.14f%s&quot;, v, s);</span>
<span class="lineNum"> 646 </span><span class="lineCov"> 18 : printl(buf, pad);</span>
<a name="647"><span class="lineNum"> 647 </span><span class="lineCov"> 18 : }</span></a>
<span class="lineNum"> 648 </span> :
<span class="lineNum"> 649 </span><span class="lineCov"> 1 : static void state_smart(unsigned n, tommy_list* low)</span>
<span class="lineNum"> 650 </span> : {
<span class="lineNum"> 651 </span> : tommy_node* i;
<span class="lineNum"> 652 </span> : unsigned j;
<span class="lineNum"> 653 </span> : size_t device_pad;
<span class="lineNum"> 654 </span> : size_t serial_pad;
<span class="lineNum"> 655 </span> : int have_parent;
<span class="lineNum"> 656 </span> : double array_failure_rate;
<span class="lineNum"> 657 </span> : double p_at_least_one_failure;
<span class="lineNum"> 658 </span><span class="lineCov"> 1 : int make_it_fail = 0;</span>
<span class="lineNum"> 659 </span><span class="lineCov"> 1 : uint64_t mask32 = 0xffffffffU;</span>
<span class="lineNum"> 660 </span><span class="lineCov"> 1 : uint64_t mask16 = 0xffffU;</span>
<span class="lineNum"> 661 </span> :
<span class="lineNum"> 662 </span> : /* compute lengths for padding */
<span class="lineNum"> 663 </span><span class="lineCov"> 1 : device_pad = 0;</span>
<span class="lineNum"> 664 </span><span class="lineCov"> 1 : serial_pad = 0;</span>
<span class="lineNum"> 665 </span><span class="lineCov"> 1 : have_parent = 0;</span>
<span class="lineNum"> 666 </span><span class="lineCov"> 17 : for (i = tommy_list_head(low); i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 667 </span> : size_t len;
<span class="lineNum"> 668 </span><span class="lineCov"> 16 : devinfo_t* devinfo = i-&gt;data;</span>
<span class="lineNum"> 669 </span> :
<span class="lineNum"> 670 </span><span class="lineCov"> 16 : len = strlen(devinfo-&gt;file);</span>
<span class="lineNum"> 671 </span><span class="lineCov"> 16 : if (len &gt; device_pad)</span>
<span class="lineNum"> 672 </span><span class="lineCov"> 1 : device_pad = len;</span>
<span class="lineNum"> 673 </span> :
<span class="lineNum"> 674 </span><span class="lineCov"> 16 : len = strlen(devinfo-&gt;smart_serial);</span>
<span class="lineNum"> 675 </span><span class="lineCov"> 16 : if (len &gt; serial_pad)</span>
<span class="lineNum"> 676 </span><span class="lineCov"> 2 : serial_pad = len;</span>
<span class="lineNum"> 677 </span> :
<span class="lineNum"> 678 </span><span class="lineCov"> 16 : if (devinfo-&gt;parent != 0)</span>
<span class="lineNum"> 679 </span><span class="lineNoCov"> 0 : have_parent = 1;</span>
<span class="lineNum"> 680 </span> : }
<span class="lineNum"> 681 </span> :
<span class="lineNum"> 682 </span><span class="lineCov"> 1 : printf(&quot;SnapRAID SMART report:\n&quot;);</span>
<span class="lineNum"> 683 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 684 </span><span class="lineCov"> 1 : printf(&quot; Temp&quot;);</span>
<span class="lineNum"> 685 </span><span class="lineCov"> 1 : printf(&quot; Power&quot;);</span>
<span class="lineNum"> 686 </span><span class="lineCov"> 1 : printf(&quot; Error&quot;);</span>
<span class="lineNum"> 687 </span><span class="lineCov"> 1 : printf(&quot; FP&quot;);</span>
<span class="lineNum"> 688 </span><span class="lineCov"> 1 : printf(&quot; Size&quot;);</span>
<span class="lineNum"> 689 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 690 </span><span class="lineCov"> 1 : printf(&quot; C&quot;);</span>
<span class="lineNum"> 691 </span><span class="lineCov"> 1 : printf(&quot; OnDays&quot;);</span>
<span class="lineNum"> 692 </span><span class="lineCov"> 1 : printf(&quot; Count&quot;);</span>
<span class="lineNum"> 693 </span><span class="lineCov"> 1 : printf(&quot; &quot;);</span>
<span class="lineNum"> 694 </span><span class="lineCov"> 1 : printf(&quot; TB&quot;);</span>
<span class="lineNum"> 695 </span><span class="lineCov"> 1 : printf(&quot; &quot;); printl(&quot;Serial&quot;, serial_pad);</span>
<span class="lineNum"> 696 </span><span class="lineCov"> 1 : printf(&quot; &quot;); printl(&quot;Device&quot;, device_pad);</span>
<span class="lineNum"> 697 </span><span class="lineCov"> 1 : printf(&quot; Disk&quot;);</span>
<span class="lineNum"> 698 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 699 </span> : /* |&lt;##################################################################72&gt;|####80&gt;| */
<span class="lineNum"> 700 </span><span class="lineCov"> 1 : printf(&quot; -----------------------------------------------------------------------\n&quot;);</span>
<span class="lineNum"> 701 </span> :
<span class="lineNum"> 702 </span><span class="lineCov"> 1 : array_failure_rate = 0;</span>
<span class="lineNum"> 703 </span><span class="lineCov"> 17 : for (i = tommy_list_head(low); i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 704 </span><span class="lineCov"> 16 : devinfo_t* devinfo = i-&gt;data;</span>
<span class="lineNum"> 705 </span> : double afr;
<span class="lineNum"> 706 </span> : uint64_t flag;
<span class="lineNum"> 707 </span> :
<span class="lineNum"> 708 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[194] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 709 </span><span class="lineCov"> 15 : printf(&quot;%7&quot; PRIu64, devinfo-&gt;smart[194] &amp; mask16);</span>
<span class="lineNum"> 710 </span><span class="lineCov"> 1 : else if (devinfo-&gt;smart[190] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 711 </span><span class="lineNoCov"> 0 : printf(&quot;%7&quot; PRIu64, devinfo-&gt;smart[190] &amp; mask16);</span>
<span class="lineNum"> 712 </span> : else
<span class="lineNum"> 713 </span><span class="lineCov"> 1 : printf(&quot; -&quot;);</span>
<span class="lineNum"> 714 </span> :
<span class="lineNum"> 715 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[9] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 716 </span><span class="lineCov"> 15 : printf(&quot;%7&quot; PRIu64, (devinfo-&gt;smart[9] &amp; mask32) / 24);</span>
<span class="lineNum"> 717 </span> : else
<span class="lineNum"> 718 </span><span class="lineCov"> 1 : printf(&quot; -&quot;);</span>
<span class="lineNum"> 719 </span> :
<span class="lineNum"> 720 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_FLAGS] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 721 </span><span class="lineCov"> 8 : flag = devinfo-&gt;smart[SMART_FLAGS];</span>
<span class="lineNum"> 722 </span> : else
<span class="lineNum"> 723 </span><span class="lineCov"> 8 : flag = 0;</span>
<span class="lineNum"> 724 </span><span class="lineCov"> 16 : if (flag &amp; SMARTCTL_FLAG_FAIL)</span>
<span class="lineNum"> 725 </span><span class="lineCov"> 1 : printf(&quot; FAIL&quot;);</span>
<span class="lineNum"> 726 </span><span class="lineCov"> 15 : else if (flag &amp; SMARTCTL_FLAG_PREFAIL)</span>
<span class="lineNum"> 727 </span><span class="lineCov"> 1 : printf(&quot; PREFAIL&quot;);</span>
<span class="lineNum"> 728 </span><span class="lineCov"> 14 : else if (flag &amp; SMARTCTL_FLAG_PREFAIL_LOGGED)</span>
<span class="lineNum"> 729 </span><span class="lineCov"> 1 : printf(&quot; logfail&quot;);</span>
<span class="lineNum"> 730 </span><span class="lineCov"> 13 : else if (devinfo-&gt;smart[SMART_ERROR] != SMART_UNASSIGNED</span>
<span class="lineNum"> 731 </span><span class="lineCov"> 13 : &amp;&amp; devinfo-&gt;smart[SMART_ERROR] != 0)</span>
<span class="lineNum"> 732 </span><span class="lineCov"> 1 : printf(&quot;%8&quot; PRIu64, devinfo-&gt;smart[SMART_ERROR]);</span>
<span class="lineNum"> 733 </span><span class="lineCov"> 12 : else if (flag &amp; SMARTCTL_FLAG_ERROR)</span>
<span class="lineNum"> 734 </span><span class="lineCov"> 1 : printf(&quot; logerr&quot;);</span>
<span class="lineNum"> 735 </span><span class="lineCov"> 11 : else if (flag &amp; SMARTCTL_FLAG_ERROR_LOGGED)</span>
<span class="lineNum"> 736 </span><span class="lineCov"> 1 : printf(&quot; selferr&quot;);</span>
<span class="lineNum"> 737 </span><span class="lineCov"> 10 : else if (devinfo-&gt;smart[SMART_ERROR] == 0)</span>
<span class="lineNum"> 738 </span><span class="lineCov"> 10 : printf(&quot; 0&quot;);</span>
<span class="lineNum"> 739 </span> : else
<span class="lineNum"> 740 </span><span class="lineNoCov"> 0 : printf(&quot; -&quot;);</span>
<span class="lineNum"> 741 </span> :
<span class="lineNum"> 742 </span> : /* if some fail/prefail attribute, make the command to fail */
<span class="lineNum"> 743 </span><span class="lineCov"> 16 : if (flag &amp; (SMARTCTL_FLAG_FAIL | SMARTCTL_FLAG_PREFAIL))</span>
<span class="lineNum"> 744 </span><span class="lineCov"> 2 : make_it_fail = 1;</span>
<span class="lineNum"> 745 </span> :
<span class="lineNum"> 746 </span> : /* note that in older smartmontools, like 5.x, rotation rate is not present */
<span class="lineNum"> 747 </span> : /* and then it could remain unassigned */
<span class="lineNum"> 748 </span> :
<span class="lineNum"> 749 </span><span class="lineCov"> 16 : if (flag &amp; (SMARTCTL_FLAG_UNSUPPORTED | SMARTCTL_FLAG_OPEN)) {</span>
<span class="lineNum"> 750 </span> : /* if error running smartctl, skip AFR estimation */
<span class="lineNum"> 751 </span><span class="lineCov"> 2 : afr = 0;</span>
<span class="lineNum"> 752 </span><span class="lineCov"> 2 : printf(&quot; n/a&quot;);</span>
<span class="lineNum"> 753 </span><span class="lineCov"> 14 : } else if (devinfo-&gt;smart[SMART_ROTATION_RATE] == 0) {</span>
<span class="lineNum"> 754 </span> : /* if SSD, skip AFR estimation as data is from not SSD disks */
<span class="lineNum"> 755 </span><span class="lineCov"> 1 : afr = 0;</span>
<span class="lineNum"> 756 </span><span class="lineCov"> 1 : printf(&quot; SSD&quot;);</span>
<span class="lineNum"> 757 </span> : } else {
<span class="lineNum"> 758 </span><span class="lineCov"> 13 : afr = smart_afr(devinfo-&gt;smart);</span>
<span class="lineNum"> 759 </span> :
<span class="lineNum"> 760 </span><span class="lineCov"> 13 : if (afr == 0) {</span>
<span class="lineNum"> 761 </span> : /* this happens only if no data */
<span class="lineNum"> 762 </span><span class="lineCov"> 1 : printf(&quot; -&quot;);</span>
<span class="lineNum"> 763 </span> : } else {
<span class="lineNum"> 764 </span> : /* use only the disks in the array */
<span class="lineNum"> 765 </span><span class="lineCov"> 12 : if (devinfo-&gt;parent != 0 || !have_parent)</span>
<span class="lineNum"> 766 </span><span class="lineCov"> 12 : array_failure_rate += afr;</span>
<span class="lineNum"> 767 </span> :
<span class="lineNum"> 768 </span><span class="lineCov"> 12 : printf(&quot;%4.0f%%&quot;, poisson_prob_n_or_more_failures(afr, 1) * 100);</span>
<span class="lineNum"> 769 </span> : }
<span class="lineNum"> 770 </span> : }
<span class="lineNum"> 771 </span> :
<span class="lineNum"> 772 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_SIZE] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 773 </span><span class="lineCov"> 15 : printf(&quot; %4.1f&quot;, devinfo-&gt;smart[SMART_SIZE] / 1E12);</span>
<span class="lineNum"> 774 </span> : else
<span class="lineNum"> 775 </span><span class="lineCov"> 1 : printf(&quot; -&quot;);</span>
<span class="lineNum"> 776 </span> :
<span class="lineNum"> 777 </span><span class="lineCov"> 16 : printf(&quot; &quot;);</span>
<span class="lineNum"> 778 </span><span class="lineCov"> 16 : if (*devinfo-&gt;smart_serial)</span>
<span class="lineNum"> 779 </span><span class="lineCov"> 15 : printl(devinfo-&gt;smart_serial, serial_pad);</span>
<span class="lineNum"> 780 </span> : else
<span class="lineNum"> 781 </span><span class="lineCov"> 1 : printl(&quot;-&quot;, serial_pad);</span>
<span class="lineNum"> 782 </span> :
<span class="lineNum"> 783 </span><span class="lineCov"> 16 : printf(&quot; &quot;);</span>
<span class="lineNum"> 784 </span><span class="lineCov"> 16 : if (*devinfo-&gt;file)</span>
<span class="lineNum"> 785 </span><span class="lineCov"> 15 : printl(devinfo-&gt;file, device_pad);</span>
<span class="lineNum"> 786 </span> : else
<span class="lineNum"> 787 </span><span class="lineCov"> 1 : printl(&quot;-&quot;, device_pad);</span>
<span class="lineNum"> 788 </span> :
<span class="lineNum"> 789 </span><span class="lineCov"> 16 : printf(&quot; &quot;);</span>
<span class="lineNum"> 790 </span><span class="lineCov"> 16 : if (*devinfo-&gt;name)</span>
<span class="lineNum"> 791 </span><span class="lineCov"> 15 : printf(&quot;%s&quot;, devinfo-&gt;name);</span>
<span class="lineNum"> 792 </span> : else
<span class="lineNum"> 793 </span><span class="lineCov"> 1 : printf(&quot;-&quot;);</span>
<span class="lineNum"> 794 </span> :
<span class="lineNum"> 795 </span><span class="lineCov"> 16 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 796 </span> :
<span class="lineNum"> 797 </span><span class="lineCov"> 16 : log_tag(&quot;smart:%s:%s\n&quot;, devinfo-&gt;file, devinfo-&gt;name);</span>
<span class="lineNum"> 798 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart_serial[0])</span>
<span class="lineNum"> 799 </span><span class="lineCov"> 15 : log_tag(&quot;attr:%s:%s:serial:%s\n&quot;, devinfo-&gt;file, devinfo-&gt;name, esc(devinfo-&gt;smart_serial));</span>
<span class="lineNum"> 800 </span><span class="lineCov"> 16 : if (afr != 0)</span>
<span class="lineNum"> 801 </span><span class="lineCov"> 12 : log_tag(&quot;attr:%s:%s:afr:%g\n&quot;, devinfo-&gt;file, devinfo-&gt;name, afr);</span>
<span class="lineNum"> 802 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_SIZE] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 803 </span><span class="lineCov"> 15 : log_tag(&quot;attr:%s:%s:size:%&quot; PRIu64 &quot;\n&quot;, devinfo-&gt;file, devinfo-&gt;name, devinfo-&gt;smart[SMART_SIZE]);</span>
<span class="lineNum"> 804 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_ERROR] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 805 </span><span class="lineCov"> 16 : log_tag(&quot;attr:%s:%s:error:%&quot; PRIu64 &quot;\n&quot;, devinfo-&gt;file, devinfo-&gt;name, devinfo-&gt;smart[SMART_ERROR]);</span>
<span class="lineNum"> 806 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_ROTATION_RATE] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 807 </span><span class="lineCov"> 16 : log_tag(&quot;attr:%s:%s:rotationrate:%&quot; PRIu64 &quot;\n&quot;, devinfo-&gt;file, devinfo-&gt;name, devinfo-&gt;smart[SMART_ROTATION_RATE]);</span>
<span class="lineNum"> 808 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_FLAGS] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 809 </span><span class="lineCov"> 8 : log_tag(&quot;attr:%s:%s:flags:%&quot; PRIu64 &quot;:%&quot; PRIx64 &quot;\n&quot;, devinfo-&gt;file, devinfo-&gt;name, devinfo-&gt;smart[SMART_FLAGS], devinfo-&gt;smart[SMART_FLAGS]);</span>
<span class="lineNum"> 810 </span><span class="lineCov"> 4112 : for (j = 0; j &lt; 256; ++j)</span>
<span class="lineNum"> 811 </span><span class="lineCov"> 4096 : if (devinfo-&gt;smart[j] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 812 </span><span class="lineCov"> 3840 : log_tag(&quot;attr:%s:%s:%u:%&quot; PRIu64 &quot;:%&quot; PRIx64 &quot;\n&quot;, devinfo-&gt;file, devinfo-&gt;name, j, devinfo-&gt;smart[j], devinfo-&gt;smart[j]);</span>
<span class="lineNum"> 813 </span> : }
<span class="lineNum"> 814 </span> :
<span class="lineNum"> 815 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 816 </span> :
<span class="lineNum"> 817 </span> : /* |&lt;##################################################################72&gt;|####80&gt;| */
<span class="lineNum"> 818 </span><span class="lineCov"> 1 : printf(&quot;The FP column is the estimated probability (in percentage) that the disk\n&quot;);</span>
<span class="lineNum"> 819 </span><span class="lineCov"> 1 : printf(&quot;is going to fail in the next year.\n&quot;);</span>
<span class="lineNum"> 820 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 821 </span> :
<span class="lineNum"> 822 </span> : /*
<span class="lineNum"> 823 </span> : * The probability of one and of at least one failure is computed assuming
<span class="lineNum"> 824 </span> : * a Poisson distribution with the estimated array failure rate.
<span class="lineNum"> 825 </span> : */
<span class="lineNum"> 826 </span><span class="lineCov"> 1 : p_at_least_one_failure = poisson_prob_n_or_more_failures(array_failure_rate, 1);</span>
<span class="lineNum"> 827 </span> :
<span class="lineNum"> 828 </span><span class="lineCov"> 1 : printf(&quot;Probability that at least one disk is going to fail in the next year is %.0f%%.\n&quot;, p_at_least_one_failure * 100);</span>
<span class="lineNum"> 829 </span><span class="lineCov"> 1 : log_tag(&quot;summary:array_failure:%g:%g\n&quot;, array_failure_rate, p_at_least_one_failure);</span>
<span class="lineNum"> 830 </span> :
<span class="lineNum"> 831 </span> : /* prints extra stats only in verbose mode */
<span class="lineNum"> 832 </span><span class="lineCov"> 1 : if (msg_level &lt; MSG_VERBOSE)</span>
<span class="lineNum"> 833 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 834 </span> :
<span class="lineNum"> 835 </span> : /* |&lt;##################################################################72&gt;|####80&gt;| */
<span class="lineNum"> 836 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 837 </span><span class="lineCov"> 1 : printf(&quot;Probability of data loss in the next year for different parity and\n&quot;);</span>
<span class="lineNum"> 838 </span><span class="lineCov"> 1 : printf(&quot;combined scrub and repair time:\n&quot;);</span>
<span class="lineNum"> 839 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 840 </span><span class="lineCov"> 1 : printf(&quot; Parity 1 Week 1 Month 3 Months\n&quot;);</span>
<span class="lineNum"> 841 </span><span class="lineCov"> 1 : printf(&quot; -----------------------------------------------------------------------\n&quot;);</span>
<span class="lineNum"> 842 </span><span class="lineCov"> 7 : for (j = 0; j &lt; RAID_PARITY_MAX; ++j) {</span>
<span class="lineNum"> 843 </span><span class="lineCov"> 6 : printf(&quot;%6u&quot;, j + 1);</span>
<span class="lineNum"> 844 </span><span class="lineCov"> 6 : printf(&quot; &quot;);</span>
<span class="lineNum"> 845 </span><span class="lineCov"> 6 : printp(raid_prob_of_one_or_more_failures(array_failure_rate, 365.0 / 7, n, j + 1) * 100, 19);</span>
<span class="lineNum"> 846 </span><span class="lineCov"> 6 : printf(&quot; &quot;);</span>
<span class="lineNum"> 847 </span><span class="lineCov"> 6 : printp(raid_prob_of_one_or_more_failures(array_failure_rate, 365.0 / 30, n, j + 1) * 100, 17);</span>
<span class="lineNum"> 848 </span><span class="lineCov"> 6 : printf(&quot; &quot;);</span>
<span class="lineNum"> 849 </span><span class="lineCov"> 6 : printp(raid_prob_of_one_or_more_failures(array_failure_rate, 365.0 / 90, n, j + 1) * 100, 13);</span>
<span class="lineNum"> 850 </span><span class="lineCov"> 6 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 851 </span> : }
<span class="lineNum"> 852 </span> :
<span class="lineNum"> 853 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 854 </span> :
<span class="lineNum"> 855 </span> : /* |&lt;##################################################################72&gt;|####80&gt;| */
<span class="lineNum"> 856 </span><span class="lineCov"> 1 : printf(&quot;These values are the probabilities that in the next year you'll have a\n&quot;);</span>
<span class="lineNum"> 857 </span><span class="lineCov"> 1 : printf(&quot;sequence of failures that the parity WONT be able to recover, assuming\n&quot;);</span>
<span class="lineNum"> 858 </span><span class="lineCov"> 1 : printf(&quot;that you regularly scrub, and in case repair, the array in the specified\n&quot;);</span>
<span class="lineNum"> 859 </span><span class="lineCov"> 1 : printf(&quot;time.\n&quot;);</span>
<span class="lineNum"> 860 </span> :
<span class="lineNum"> 861 </span> : bail:
<span class="lineNum"> 862 </span><span class="lineCov"> 1 : if (make_it_fail) {</span>
<span class="lineNum"> 863 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 864 </span><span class="lineCov"> 1 : printf(&quot;DANGER! SMART is reporting that one or more disks are FAILING!\n&quot;);</span>
<span class="lineNum"> 865 </span><span class="lineCov"> 1 : printf(&quot;Please take immediate action!\n&quot;);</span>
<span class="lineNum"> 866 </span><span class="lineCov"> 1 : exit(EXIT_FAILURE);</span>
<span class="lineNum"> 867 </span> : }
<span class="lineNum"> 868 </span><span class="lineNoCov"> 0 : }</span>
<span class="lineNum"> 869 </span> :
<span class="lineNum"> 870 </span> : /**
<a name="871"><span class="lineNum"> 871 </span> : * Fill with fake data the device list.</a>
<span class="lineNum"> 872 </span> : */
<span class="lineNum"> 873 </span><span class="lineCov"> 1 : static int devtest(tommy_list* low, int operation)</span>
<span class="lineNum"> 874 </span> : {
<span class="lineNum"> 875 </span> : unsigned c;
<span class="lineNum"> 876 </span> :
<span class="lineNum"> 877 </span><span class="lineCov"> 1 : if (operation != DEVICE_SMART)</span>
<span class="lineNum"> 878 </span><span class="lineNoCov"> 0 : return -1;</span>
<span class="lineNum"> 879 </span> :
<span class="lineNum"> 880 </span> : /* add some fake data */
<span class="lineNum"> 881 </span><span class="lineCov"> 17 : for (c = 0; c &lt; 16; ++c) {</span>
<span class="lineNum"> 882 </span> : devinfo_t* entry;
<span class="lineNum"> 883 </span> : int j;
<span class="lineNum"> 884 </span> :
<span class="lineNum"> 885 </span><span class="lineCov"> 16 : entry = calloc_nofail(1, sizeof(devinfo_t));</span>
<span class="lineNum"> 886 </span> :
<span class="lineNum"> 887 </span><span class="lineCov"> 16 : entry-&gt;device = c;</span>
<span class="lineNum"> 888 </span> :
<span class="lineNum"> 889 </span><span class="lineCov"> 16 : tommy_list_insert_tail(low, &amp;entry-&gt;node, entry);</span>
<span class="lineNum"> 890 </span> :
<span class="lineNum"> 891 </span><span class="lineCov"> 4112 : for (j = 0; j &lt; 256; ++j) {</span>
<span class="lineNum"> 892 </span><span class="lineCov"> 4096 : switch (c) {</span>
<span class="lineNum"> 893 </span><span class="lineCov"> 256 : case 0 : entry-&gt;smart[j] = 0; break;</span>
<span class="lineNum"> 894 </span><span class="lineCov"> 256 : case 1 : entry-&gt;smart[j] = SMART_UNASSIGNED; break;</span>
<span class="lineNum"> 895 </span><span class="lineCov"> 3584 : default : entry-&gt;smart[j] = c; break;</span>
<span class="lineNum"> 896 </span> : }
<span class="lineNum"> 897 </span> : }
<span class="lineNum"> 898 </span> :
<span class="lineNum"> 899 </span><span class="lineCov"> 16 : if (c == 0) {</span>
<span class="lineNum"> 900 </span><span class="lineCov"> 1 : entry-&gt;smart_serial[0] = 0;</span>
<span class="lineNum"> 901 </span><span class="lineCov"> 1 : entry-&gt;file[0] = 0;</span>
<span class="lineNum"> 902 </span><span class="lineCov"> 1 : entry-&gt;name[0] = 0;</span>
<span class="lineNum"> 903 </span><span class="lineCov"> 1 : entry-&gt;smart[SMART_SIZE] = SMART_UNASSIGNED;</span>
<span class="lineNum"> 904 </span><span class="lineCov"> 1 : entry-&gt;smart[SMART_ROTATION_RATE] = 0;</span>
<span class="lineNum"> 905 </span> : } else {
<span class="lineNum"> 906 </span><span class="lineCov"> 15 : snprintf(entry-&gt;smart_serial, sizeof(entry-&gt;smart_serial), &quot;%u&quot;, c);</span>
<span class="lineNum"> 907 </span><span class="lineCov"> 15 : pathcpy(entry-&gt;file, sizeof(entry-&gt;name), &quot;file&quot;);</span>
<span class="lineNum"> 908 </span><span class="lineCov"> 15 : pathcpy(entry-&gt;name, sizeof(entry-&gt;name), &quot;name&quot;);</span>
<span class="lineNum"> 909 </span><span class="lineCov"> 15 : entry-&gt;smart[SMART_SIZE] = c * TERA;</span>
<span class="lineNum"> 910 </span><span class="lineCov"> 15 : entry-&gt;smart[SMART_ROTATION_RATE] = 7200;</span>
<span class="lineNum"> 911 </span> : }
<span class="lineNum"> 912 </span> :
<span class="lineNum"> 913 </span><span class="lineCov"> 16 : entry-&gt;smart[SMART_ERROR] = 0;</span>
<span class="lineNum"> 914 </span><span class="lineCov"> 16 : entry-&gt;smart[SMART_FLAGS] = SMART_UNASSIGNED;</span>
<span class="lineNum"> 915 </span> :
<span class="lineNum"> 916 </span><span class="lineCov"> 16 : switch (c) {</span>
<span class="lineNum"> 917 </span><span class="lineCov"> 1 : case 3 : entry-&gt;smart[SMART_ERROR] = 1; break;</span>
<span class="lineNum"> 918 </span><span class="lineCov"> 1 : case 4 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_UNSUPPORTED; break;</span>
<span class="lineNum"> 919 </span><span class="lineCov"> 1 : case 5 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_COMMAND; break;</span>
<span class="lineNum"> 920 </span><span class="lineCov"> 1 : case 6 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_OPEN; break;</span>
<span class="lineNum"> 921 </span><span class="lineCov"> 1 : case 7 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_FAIL; break;</span>
<span class="lineNum"> 922 </span><span class="lineCov"> 1 : case 8 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_PREFAIL; break;</span>
<span class="lineNum"> 923 </span><span class="lineCov"> 1 : case 9 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_PREFAIL_LOGGED; break;</span>
<span class="lineNum"> 924 </span><span class="lineCov"> 1 : case 10 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_ERROR; break;</span>
<span class="lineNum"> 925 </span><span class="lineCov"> 1 : case 11 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_ERROR_LOGGED; break;</span>
<span class="lineNum"> 926 </span> : }
<span class="lineNum"> 927 </span> : }
<span class="lineNum"> 928 </span> :
<span class="lineNum"> 929 </span><span class="lineCov"> 1 : return 0;</span>
<a name="930"><span class="lineNum"> 930 </span> : }</a>
<span class="lineNum"> 931 </span> :
<span class="lineNum"> 932 </span><span class="lineCov"> 5 : void state_device(struct snapraid_state* state, int operation)</span>
<span class="lineNum"> 933 </span> : {
<span class="lineNum"> 934 </span> : tommy_node* i;
<span class="lineNum"> 935 </span> : unsigned j;
<span class="lineNum"> 936 </span> : tommy_list high;
<span class="lineNum"> 937 </span> : tommy_list low;
<span class="lineNum"> 938 </span> : int ret;
<span class="lineNum"> 939 </span> :
<span class="lineNum"> 940 </span><span class="lineCov"> 5 : switch (operation) {</span>
<span class="lineNum"> 941 </span><span class="lineCov"> 1 : case DEVICE_UP : msg_progress(&quot;Spinup...\n&quot;); break;</span>
<span class="lineNum"> 942 </span><span class="lineCov"> 1 : case DEVICE_DOWN : msg_progress(&quot;Spindown...\n&quot;); break;</span>
<span class="lineNum"> 943 </span> : }
<span class="lineNum"> 944 </span> :
<span class="lineNum"> 945 </span><span class="lineCov"> 5 : tommy_list_init(&amp;high);</span>
<span class="lineNum"> 946 </span><span class="lineCov"> 5 : tommy_list_init(&amp;low);</span>
<span class="lineNum"> 947 </span> :
<span class="lineNum"> 948 </span> : /* for all disks */
<span class="lineNum"> 949 </span><span class="lineCov"> 35 : for (i = state-&gt;disklist; i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 950 </span><span class="lineCov"> 30 : struct snapraid_disk* disk = i-&gt;data;</span>
<span class="lineNum"> 951 </span> : devinfo_t* entry;
<span class="lineNum"> 952 </span> :
<span class="lineNum"> 953 </span><span class="lineCov"> 30 : entry = calloc_nofail(1, sizeof(devinfo_t));</span>
<span class="lineNum"> 954 </span> :
<span class="lineNum"> 955 </span><span class="lineCov"> 30 : entry-&gt;device = disk-&gt;device;</span>
<span class="lineNum"> 956 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;name, sizeof(entry-&gt;name), disk-&gt;name);</span>
<span class="lineNum"> 957 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;mount, sizeof(entry-&gt;mount), disk-&gt;dir);</span>
<span class="lineNum"> 958 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;smartctl, sizeof(entry-&gt;smartctl), disk-&gt;smartctl);</span>
<span class="lineNum"> 959 </span> :
<span class="lineNum"> 960 </span><span class="lineCov"> 30 : tommy_list_insert_tail(&amp;high, &amp;entry-&gt;node, entry);</span>
<span class="lineNum"> 961 </span> : }
<span class="lineNum"> 962 </span> :
<span class="lineNum"> 963 </span> : /* for all parities */
<span class="lineNum"> 964 </span><span class="lineCov"> 35 : for (j = 0; j &lt; state-&gt;level; ++j) {</span>
<span class="lineNum"> 965 </span> : devinfo_t* entry;
<span class="lineNum"> 966 </span> :
<span class="lineNum"> 967 </span><span class="lineCov"> 30 : entry = calloc_nofail(1, sizeof(devinfo_t));</span>
<span class="lineNum"> 968 </span> :
<span class="lineNum"> 969 </span><span class="lineCov"> 30 : entry-&gt;device = state-&gt;parity[j].device;</span>
<span class="lineNum"> 970 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;name, sizeof(entry-&gt;name), lev_config_name(j));</span>
<span class="lineNum"> 971 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;mount, sizeof(entry-&gt;mount), state-&gt;parity[j].path);</span>
<span class="lineNum"> 972 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;smartctl, sizeof(entry-&gt;smartctl), state-&gt;parity[j].smartctl);</span>
<span class="lineNum"> 973 </span><span class="lineCov"> 30 : pathcut(entry-&gt;mount); /* remove the parity file */</span>
<span class="lineNum"> 974 </span> :
<span class="lineNum"> 975 </span><span class="lineCov"> 30 : tommy_list_insert_tail(&amp;high, &amp;entry-&gt;node, entry);</span>
<span class="lineNum"> 976 </span> : }
<span class="lineNum"> 977 </span> :
<span class="lineNum"> 978 </span><span class="lineCov"> 5 : if (state-&gt;opt.fake_device)</span>
<span class="lineNum"> 979 </span><span class="lineCov"> 1 : ret = devtest(&amp;low, operation);</span>
<span class="lineNum"> 980 </span> : else
<span class="lineNum"> 981 </span><span class="lineCov"> 4 : ret = devquery(&amp;high, &amp;low, operation);</span>
<span class="lineNum"> 982 </span> :
<span class="lineNum"> 983 </span><span class="lineCov"> 5 : if (ret != 0) {</span>
<span class="lineNum"> 984 </span><span class="lineCov"> 2 : const char* ope = 0;</span>
<span class="lineNum"> 985 </span><span class="lineCov"> 2 : switch (operation) {</span>
<span class="lineNum"> 986 </span><span class="lineNoCov"> 0 : case DEVICE_UP : ope = &quot;Spinup&quot;; break;</span>
<span class="lineNum"> 987 </span><span class="lineCov"> 1 : case DEVICE_DOWN : ope = &quot;Spindown&quot;; break;</span>
<span class="lineNum"> 988 </span><span class="lineNoCov"> 0 : case DEVICE_LIST : ope = &quot;List&quot;; break;</span>
<span class="lineNum"> 989 </span><span class="lineCov"> 1 : case DEVICE_SMART : ope = &quot;SMART&quot;; break;</span>
<span class="lineNum"> 990 </span> : }
<span class="lineNum"> 991 </span><span class="lineCov"> 2 : log_fatal(&quot;%s unsupported in this platform.\n&quot;, ope);</span>
<span class="lineNum"> 992 </span> : } else {
<span class="lineNum"> 993 </span><span class="lineCov"> 3 : if (operation == DEVICE_LIST) {</span>
<span class="lineNum"> 994 </span><span class="lineCov"> 13 : for (i = tommy_list_head(&amp;low); i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 995 </span><span class="lineCov"> 12 : devinfo_t* devinfo = i-&gt;data;</span>
<span class="lineNum"> 996 </span><span class="lineCov"> 12 : devinfo_t* parent = devinfo-&gt;parent;</span>
<span class="lineNum"> 997 </span> : #ifdef _WIN32
<span class="lineNum"> 998 </span> : printf(&quot;%&quot; PRIu64 &quot;\t%s\t%08&quot; PRIx64 &quot;\t%s\t%s\n&quot;, devinfo-&gt;device, devinfo-&gt;wfile, parent-&gt;device, parent-&gt;wfile, parent-&gt;name);
<span class="lineNum"> 999 </span> : #else
<span class="lineNum"> 1000 </span><span class="lineCov"> 12 : printf(&quot;%u:%u\t%s\t%u:%u\t%s\t%s\n&quot;, major(devinfo-&gt;device), minor(devinfo-&gt;device), devinfo-&gt;file, major(parent-&gt;device), minor(parent-&gt;device), parent-&gt;file, parent-&gt;name);</span>
<span class="lineNum"> 1001 </span> : #endif
<span class="lineNum"> 1002 </span> : }
<span class="lineNum"> 1003 </span> : }
<span class="lineNum"> 1004 </span> :
<span class="lineNum"> 1005 </span><span class="lineCov"> 3 : if (operation == DEVICE_SMART)</span>
<span class="lineNum"> 1006 </span><span class="lineCov"> 1 : state_smart(state-&gt;level + tommy_list_count(&amp;state-&gt;disklist), &amp;low);</span>
<span class="lineNum"> 1007 </span> : }
<span class="lineNum"> 1008 </span> :
<span class="lineNum"> 1009 </span><span class="lineCov"> 4 : tommy_list_foreach(&amp;high, free);</span>
<span class="lineNum"> 1010 </span><span class="lineCov"> 4 : tommy_list_foreach(&amp;low, free);</span>
<span class="lineNum"> 1011 </span><span class="lineCov"> 4 : }</span>
<span class="lineNum"> 1012 </span> :
</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>