1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 24 * Copyright (c) 2012, 2017 by Delphix. All rights reserved. 25 * Copyright (c) 2013, Joyent, Inc. All rights reserved. 26 * Copyright (c) 2014 Integros [integros.com] 27 */ 28 29 #include <sys/zfs_context.h> 30 #include <sys/spa.h> 31 #include <sys/vdev_impl.h> 32 #include <sys/vdev_disk.h> 33 #include <sys/vdev_file.h> 34 #include <sys/vdev_raidz.h> 35 #include <sys/zio.h> 36 #include <sys/zio_checksum.h> 37 #include <sys/abd.h> 38 #include <sys/fs/zfs.h> 39 #include <sys/fm/fs/zfs.h> 40 41 #ifdef ZFS_DEBUG 42 #include <sys/vdev_initialize.h> /* vdev_xlate testing */ 43 #endif 44 45 /* 46 * Virtual device vector for RAID-Z. 47 * 48 * This vdev supports single, double, and triple parity. For single parity, 49 * we use a simple XOR of all the data columns. For double or triple parity, 50 * we use a special case of Reed-Solomon coding. This extends the 51 * technique described in "The mathematics of RAID-6" by H. Peter Anvin by 52 * drawing on the system described in "A Tutorial on Reed-Solomon Coding for 53 * Fault-Tolerance in RAID-like Systems" by James S. Plank on which the 54 * former is also based. The latter is designed to provide higher performance 55 * for writes. 56 * 57 * Note that the Plank paper claimed to support arbitrary N+M, but was then 58 * amended six years later identifying a critical flaw that invalidates its 59 * claims. Nevertheless, the technique can be adapted to work for up to 60 * triple parity. For additional parity, the amendment "Note: Correction to 61 * the 1997 Tutorial on Reed-Solomon Coding" by James S. Plank and Ying Ding 62 * is viable, but the additional complexity means that write performance will 63 * suffer. 64 * 65 * All of the methods above operate on a Galois field, defined over the 66 * integers mod 2^N. In our case we choose N=8 for GF(8) so that all elements 67 * can be expressed with a single byte. Briefly, the operations on the 68 * field are defined as follows: 69 * 70 * o addition (+) is represented by a bitwise XOR 71 * o subtraction (-) is therefore identical to addition: A + B = A - B 72 * o multiplication of A by 2 is defined by the following bitwise expression: 73 * 74 * (A * 2)_7 = A_6 75 * (A * 2)_6 = A_5 76 * (A * 2)_5 = A_4 77 * (A * 2)_4 = A_3 + A_7 78 * (A * 2)_3 = A_2 + A_7 79 * (A * 2)_2 = A_1 + A_7 80 * (A * 2)_1 = A_0 81 * (A * 2)_0 = A_7 82 * 83 * In C, multiplying by 2 is therefore ((a << 1) ^ ((a & 0x80) ? 0x1d : 0)). 84 * As an aside, this multiplication is derived from the error correcting 85 * primitive polynomial x^8 + x^4 + x^3 + x^2 + 1. 86 * 87 * Observe that any number in the field (except for 0) can be expressed as a 88 * power of 2 -- a generator for the field. We store a table of the powers of 89 * 2 and logs base 2 for quick look ups, and exploit the fact that A * B can 90 * be rewritten as 2^(log_2(A) + log_2(B)) (where '+' is normal addition rather 91 * than field addition). The inverse of a field element A (A^-1) is therefore 92 * A ^ (255 - 1) = A^254. 93 * 94 * The up-to-three parity columns, P, Q, R over several data columns, 95 * D_0, ... D_n-1, can be expressed by field operations: 96 * 97 * P = D_0 + D_1 + ... + D_n-2 + D_n-1 98 * Q = 2^n-1 * D_0 + 2^n-2 * D_1 + ... + 2^1 * D_n-2 + 2^0 * D_n-1 99 * = ((...((D_0) * 2 + D_1) * 2 + ...) * 2 + D_n-2) * 2 + D_n-1 100 * R = 4^n-1 * D_0 + 4^n-2 * D_1 + ... + 4^1 * D_n-2 + 4^0 * D_n-1 101 * = ((...((D_0) * 4 + D_1) * 4 + ...) * 4 + D_n-2) * 4 + D_n-1 102 * 103 * We chose 1, 2, and 4 as our generators because 1 corresponds to the trival 104 * XOR operation, and 2 and 4 can be computed quickly and generate linearly- 105 * independent coefficients. (There are no additional coefficients that have 106 * this property which is why the uncorrected Plank method breaks down.) 107 * 108 * See the reconstruction code below for how P, Q and R can used individually 109 * or in concert to recover missing data columns. 110 */ 111 112 typedef struct raidz_col { 113 uint64_t rc_devidx; /* child device index for I/O */ 114 uint64_t rc_offset; /* device offset */ 115 uint64_t rc_size; /* I/O size */ 116 abd_t *rc_abd; /* I/O data */ 117 void *rc_gdata; /* used to store the "good" version */ 118 int rc_error; /* I/O error for this device */ 119 uint8_t rc_tried; /* Did we attempt this I/O column? */ 120 uint8_t rc_skipped; /* Did we skip this I/O column? */ 121 } raidz_col_t; 122 123 typedef struct raidz_map { 124 uint64_t rm_cols; /* Regular column count */ 125 uint64_t rm_scols; /* Count including skipped columns */ 126 uint64_t rm_bigcols; /* Number of oversized columns */ 127 uint64_t rm_asize; /* Actual total I/O size */ 128 uint64_t rm_missingdata; /* Count of missing data devices */ 129 uint64_t rm_missingparity; /* Count of missing parity devices */ 130 uint64_t rm_firstdatacol; /* First data column/parity count */ 131 uint64_t rm_nskip; /* Skipped sectors for padding */ 132 uint64_t rm_skipstart; /* Column index of padding start */ 133 abd_t *rm_abd_copy; /* rm_asize-buffer of copied data */ 134 uintptr_t rm_reports; /* # of referencing checksum reports */ 135 uint8_t rm_freed; /* map no longer has referencing ZIO */ 136 uint8_t rm_ecksuminjected; /* checksum error was injected */ 137 raidz_col_t rm_col[1]; /* Flexible array of I/O columns */ 138 } raidz_map_t; 139 140 #define VDEV_RAIDZ_P 0 141 #define VDEV_RAIDZ_Q 1 142 #define VDEV_RAIDZ_R 2 143 144 #define VDEV_RAIDZ_MUL_2(x) (((x) << 1) ^ (((x) & 0x80) ? 0x1d : 0)) 145 #define VDEV_RAIDZ_MUL_4(x) (VDEV_RAIDZ_MUL_2(VDEV_RAIDZ_MUL_2(x))) 146 147 /* 148 * We provide a mechanism to perform the field multiplication operation on a 149 * 64-bit value all at once rather than a byte at a time. This works by 150 * creating a mask from the top bit in each byte and using that to 151 * conditionally apply the XOR of 0x1d. 152 */ 153 #define VDEV_RAIDZ_64MUL_2(x, mask) \ 154 { \ 155 (mask) = (x) & 0x8080808080808080ULL; \ 156 (mask) = ((mask) << 1) - ((mask) >> 7); \ 157 (x) = (((x) << 1) & 0xfefefefefefefefeULL) ^ \ 158 ((mask) & 0x1d1d1d1d1d1d1d1d); \ 159 } 160 161 #define VDEV_RAIDZ_64MUL_4(x, mask) \ 162 { \ 163 VDEV_RAIDZ_64MUL_2((x), mask); \ 164 VDEV_RAIDZ_64MUL_2((x), mask); \ 165 } 166 167 #define VDEV_LABEL_OFFSET(x) (x + VDEV_LABEL_START_SIZE) 168 169 /* 170 * Force reconstruction to use the general purpose method. 171 */ 172 int vdev_raidz_default_to_general; 173 174 /* Powers of 2 in the Galois field defined above. */ 175 static const uint8_t vdev_raidz_pow2[256] = { 176 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 177 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26, 178 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 179 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 180 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 181 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23, 182 0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 183 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1, 184 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 185 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0, 186 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 187 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2, 188 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 189 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce, 190 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 191 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc, 192 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 193 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54, 194 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 195 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73, 196 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 197 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff, 198 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 199 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41, 200 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 201 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6, 202 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 203 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09, 204 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 205 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16, 206 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 207 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x01 208 }; 209 /* Logs of 2 in the Galois field defined above. */ 210 static const uint8_t vdev_raidz_log2[256] = { 211 0x00, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 212 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b, 213 0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 214 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71, 215 0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 216 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45, 217 0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 218 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6, 219 0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 220 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88, 221 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 222 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40, 223 0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 224 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d, 225 0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 226 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57, 227 0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 228 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18, 229 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 230 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e, 231 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 232 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61, 233 0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 234 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2, 235 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 236 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6, 237 0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 238 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a, 239 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 240 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7, 241 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 242 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf, 243 }; 244 245 static void vdev_raidz_generate_parity(raidz_map_t *rm); 246 247 /* 248 * Multiply a given number by 2 raised to the given power. 249 */ 250 static uint8_t 251 vdev_raidz_exp2(uint_t a, int exp) 252 { 253 if (a == 0) 254 return (0); 255 256 ASSERT(exp >= 0); 257 ASSERT(vdev_raidz_log2[a] > 0 || a == 1); 258 259 exp += vdev_raidz_log2[a]; 260 if (exp > 255) 261 exp -= 255; 262 263 return (vdev_raidz_pow2[exp]); 264 } 265 266 static void 267 vdev_raidz_map_free(raidz_map_t *rm) 268 { 269 int c; 270 size_t size; 271 272 for (c = 0; c < rm->rm_firstdatacol; c++) { 273 abd_free(rm->rm_col[c].rc_abd); 274 275 if (rm->rm_col[c].rc_gdata != NULL) 276 zio_buf_free(rm->rm_col[c].rc_gdata, 277 rm->rm_col[c].rc_size); 278 } 279 280 size = 0; 281 for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { 282 abd_put(rm->rm_col[c].rc_abd); 283 size += rm->rm_col[c].rc_size; 284 } 285 286 if (rm->rm_abd_copy != NULL) 287 abd_free(rm->rm_abd_copy); 288 289 kmem_free(rm, offsetof(raidz_map_t, rm_col[rm->rm_scols])); 290 } 291 292 static void 293 vdev_raidz_map_free_vsd(zio_t *zio) 294 { 295 raidz_map_t *rm = zio->io_vsd; 296 297 ASSERT0(rm->rm_freed); 298 rm->rm_freed = 1; 299 300 if (rm->rm_reports == 0) 301 vdev_raidz_map_free(rm); 302 } 303 304 /*ARGSUSED*/ 305 static void 306 vdev_raidz_cksum_free(void *arg, size_t ignored) 307 { 308 raidz_map_t *rm = arg; 309 310 ASSERT3U(rm->rm_reports, >, 0); 311 312 if (--rm->rm_reports == 0 && rm->rm_freed != 0) 313 vdev_raidz_map_free(rm); 314 } 315 316 static void 317 vdev_raidz_cksum_finish(zio_cksum_report_t *zcr, const void *good_data) 318 { 319 raidz_map_t *rm = zcr->zcr_cbdata; 320 size_t c = zcr->zcr_cbinfo; 321 size_t x; 322 323 const char *good = NULL; 324 char *bad; 325 326 if (good_data == NULL) { 327 zfs_ereport_finish_checksum(zcr, NULL, NULL, B_FALSE); 328 return; 329 } 330 331 if (c < rm->rm_firstdatacol) { 332 /* 333 * The first time through, calculate the parity blocks for 334 * the good data (this relies on the fact that the good 335 * data never changes for a given logical ZIO) 336 */ 337 if (rm->rm_col[0].rc_gdata == NULL) { 338 abd_t *bad_parity[VDEV_RAIDZ_MAXPARITY]; 339 char *buf; 340 int offset; 341 342 /* 343 * Set up the rm_col[]s to generate the parity for 344 * good_data, first saving the parity bufs and 345 * replacing them with buffers to hold the result. 346 */ 347 for (x = 0; x < rm->rm_firstdatacol; x++) { 348 bad_parity[x] = rm->rm_col[x].rc_abd; 349 rm->rm_col[x].rc_gdata = 350 zio_buf_alloc(rm->rm_col[x].rc_size); 351 rm->rm_col[x].rc_abd = 352 abd_get_from_buf(rm->rm_col[x].rc_gdata, 353 rm->rm_col[x].rc_size); 354 } 355 356 /* fill in the data columns from good_data */ 357 buf = (char *)good_data; 358 for (; x < rm->rm_cols; x++) { 359 abd_put(rm->rm_col[x].rc_abd); 360 rm->rm_col[x].rc_abd = abd_get_from_buf(buf, 361 rm->rm_col[x].rc_size); 362 buf += rm->rm_col[x].rc_size; 363 } 364 365 /* 366 * Construct the parity from the good data. 367 */ 368 vdev_raidz_generate_parity(rm); 369 370 /* restore everything back to its original state */ 371 for (x = 0; x < rm->rm_firstdatacol; x++) { 372 abd_put(rm->rm_col[x].rc_abd); 373 rm->rm_col[x].rc_abd = bad_parity[x]; 374 } 375 376 offset = 0; 377 for (x = rm->rm_firstdatacol; x < rm->rm_cols; x++) { 378 abd_put(rm->rm_col[x].rc_abd); 379 rm->rm_col[x].rc_abd = abd_get_offset( 380 rm->rm_abd_copy, offset); 381 offset += rm->rm_col[x].rc_size; 382 } 383 } 384 385 ASSERT3P(rm->rm_col[c].rc_gdata, !=, NULL); 386 good = rm->rm_col[c].rc_gdata; 387 } else { 388 /* adjust good_data to point at the start of our column */ 389 good = good_data; 390 391 for (x = rm->rm_firstdatacol; x < c; x++) 392 good += rm->rm_col[x].rc_size; 393 } 394 395 bad = abd_borrow_buf_copy(rm->rm_col[c].rc_abd, rm->rm_col[c].rc_size); 396 /* we drop the ereport if it ends up that the data was good */ 397 zfs_ereport_finish_checksum(zcr, good, bad, B_TRUE); 398 abd_return_buf(rm->rm_col[c].rc_abd, bad, rm->rm_col[c].rc_size); 399 } 400 401 /* 402 * Invoked indirectly by zfs_ereport_start_checksum(), called 403 * below when our read operation fails completely. The main point 404 * is to keep a copy of everything we read from disk, so that at 405 * vdev_raidz_cksum_finish() time we can compare it with the good data. 406 */ 407 static void 408 vdev_raidz_cksum_report(zio_t *zio, zio_cksum_report_t *zcr, void *arg) 409 { 410 size_t c = (size_t)(uintptr_t)arg; 411 size_t offset; 412 413 raidz_map_t *rm = zio->io_vsd; 414 size_t size; 415 416 /* set up the report and bump the refcount */ 417 zcr->zcr_cbdata = rm; 418 zcr->zcr_cbinfo = c; 419 zcr->zcr_finish = vdev_raidz_cksum_finish; 420 zcr->zcr_free = vdev_raidz_cksum_free; 421 422 rm->rm_reports++; 423 ASSERT3U(rm->rm_reports, >, 0); 424 425 if (rm->rm_abd_copy != NULL) 426 return; 427 428 /* 429 * It's the first time we're called for this raidz_map_t, so we need 430 * to copy the data aside; there's no guarantee that our zio's buffer 431 * won't be re-used for something else. 432 * 433 * Our parity data is already in separate buffers, so there's no need 434 * to copy them. 435 */ 436 437 size = 0; 438 for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) 439 size += rm->rm_col[c].rc_size; 440 441 rm->rm_abd_copy = 442 abd_alloc_sametype(rm->rm_col[rm->rm_firstdatacol].rc_abd, size); 443 444 for (offset = 0, c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { 445 raidz_col_t *col = &rm->rm_col[c]; 446 abd_t *tmp = abd_get_offset(rm->rm_abd_copy, offset); 447 448 abd_copy(tmp, col->rc_abd, col->rc_size); 449 abd_put(col->rc_abd); 450 col->rc_abd = tmp; 451 452 offset += col->rc_size; 453 } 454 ASSERT3U(offset, ==, size); 455 } 456 457 static const zio_vsd_ops_t vdev_raidz_vsd_ops = { 458 vdev_raidz_map_free_vsd, 459 vdev_raidz_cksum_report 460 }; 461 462 /* 463 * Divides the IO evenly across all child vdevs; usually, dcols is 464 * the number of children in the target vdev. 465 */ 466 static raidz_map_t * 467 vdev_raidz_map_alloc(abd_t *abd, uint64_t size, uint64_t offset, 468 uint64_t unit_shift, uint64_t dcols, uint64_t nparity) 469 { 470 raidz_map_t *rm; 471 /* The starting RAIDZ (parent) vdev sector of the block. */ 472 uint64_t b = offset >> unit_shift; 473 /* The zio's size in units of the vdev's minimum sector size. */ 474 uint64_t s = size >> unit_shift; 475 /* The first column for this stripe. */ 476 uint64_t f = b % dcols; 477 /* The starting byte offset on each child vdev. */ 478 uint64_t o = (b / dcols) << unit_shift; 479 uint64_t q, r, c, bc, col, acols, scols, coff, devidx, asize, tot; 480 uint64_t off = 0; 481 482 /* 483 * "Quotient": The number of data sectors for this stripe on all but 484 * the "big column" child vdevs that also contain "remainder" data. 485 */ 486 q = s / (dcols - nparity); 487 488 /* 489 * "Remainder": The number of partial stripe data sectors in this I/O. 490 * This will add a sector to some, but not all, child vdevs. 491 */ 492 r = s - q * (dcols - nparity); 493 494 /* The number of "big columns" - those which contain remainder data. */ 495 bc = (r == 0 ? 0 : r + nparity); 496 497 /* 498 * The total number of data and parity sectors associated with 499 * this I/O. 500 */ 501 tot = s + nparity * (q + (r == 0 ? 0 : 1)); 502 503 /* acols: The columns that will be accessed. */ 504 /* scols: The columns that will be accessed or skipped. */ 505 if (q == 0) { 506 /* Our I/O request doesn't span all child vdevs. */ 507 acols = bc; 508 scols = MIN(dcols, roundup(bc, nparity + 1)); 509 } else { 510 acols = dcols; 511 scols = dcols; 512 } 513 514 ASSERT3U(acols, <=, scols); 515 516 rm = kmem_alloc(offsetof(raidz_map_t, rm_col[scols]), KM_SLEEP); 517 518 rm->rm_cols = acols; 519 rm->rm_scols = scols; 520 rm->rm_bigcols = bc; 521 rm->rm_skipstart = bc; 522 rm->rm_missingdata = 0; 523 rm->rm_missingparity = 0; 524 rm->rm_firstdatacol = nparity; 525 rm->rm_abd_copy = NULL; 526 rm->rm_reports = 0; 527 rm->rm_freed = 0; 528 rm->rm_ecksuminjected = 0; 529 530 asize = 0; 531 532 for (c = 0; c < scols; c++) { 533 col = f + c; 534 coff = o; 535 if (col >= dcols) { 536 col -= dcols; 537 coff += 1ULL << unit_shift; 538 } 539 rm->rm_col[c].rc_devidx = col; 540 rm->rm_col[c].rc_offset = coff; 541 rm->rm_col[c].rc_abd = NULL; 542 rm->rm_col[c].rc_gdata = NULL; 543 rm->rm_col[c].rc_error = 0; 544 rm->rm_col[c].rc_tried = 0; 545 rm->rm_col[c].rc_skipped = 0; 546 547 if (c >= acols) 548 rm->rm_col[c].rc_size = 0; 549 else if (c < bc) 550 rm->rm_col[c].rc_size = (q + 1) << unit_shift; 551 else 552 rm->rm_col[c].rc_size = q << unit_shift; 553 554 asize += rm->rm_col[c].rc_size; 555 } 556 557 ASSERT3U(asize, ==, tot << unit_shift); 558 rm->rm_asize = roundup(asize, (nparity + 1) << unit_shift); 559 rm->rm_nskip = roundup(tot, nparity + 1) - tot; 560 ASSERT3U(rm->rm_asize - asize, ==, rm->rm_nskip << unit_shift); 561 ASSERT3U(rm->rm_nskip, <=, nparity); 562 563 for (c = 0; c < rm->rm_firstdatacol; c++) 564 rm->rm_col[c].rc_abd = 565 abd_alloc_linear(rm->rm_col[c].rc_size, B_TRUE); 566 567 rm->rm_col[c].rc_abd = abd_get_offset(abd, 0); 568 off = rm->rm_col[c].rc_size; 569 570 for (c = c + 1; c < acols; c++) { 571 rm->rm_col[c].rc_abd = abd_get_offset(abd, off); 572 off += rm->rm_col[c].rc_size; 573 } 574 575 /* 576 * If all data stored spans all columns, there's a danger that parity 577 * will always be on the same device and, since parity isn't read 578 * during normal operation, that that device's I/O bandwidth won't be 579 * used effectively. We therefore switch the parity every 1MB. 580 * 581 * ... at least that was, ostensibly, the theory. As a practical 582 * matter unless we juggle the parity between all devices evenly, we 583 * won't see any benefit. Further, occasional writes that aren't a 584 * multiple of the LCM of the number of children and the minimum 585 * stripe width are sufficient to avoid pessimal behavior. 586 * Unfortunately, this decision created an implicit on-disk format 587 * requirement that we need to support for all eternity, but only 588 * for single-parity RAID-Z. 589 * 590 * If we intend to skip a sector in the zeroth column for padding 591 * we must make sure to note this swap. We will never intend to 592 * skip the first column since at least one data and one parity 593 * column must appear in each row. 594 */ 595 ASSERT(rm->rm_cols >= 2); 596 ASSERT(rm->rm_col[0].rc_size == rm->rm_col[1].rc_size); 597 598 if (rm->rm_firstdatacol == 1 && (offset & (1ULL << 20))) { 599 devidx = rm->rm_col[0].rc_devidx; 600 o = rm->rm_col[0].rc_offset; 601 rm->rm_col[0].rc_devidx = rm->rm_col[1].rc_devidx; 602 rm->rm_col[0].rc_offset = rm->rm_col[1].rc_offset; 603 rm->rm_col[1].rc_devidx = devidx; 604 rm->rm_col[1].rc_offset = o; 605 606 if (rm->rm_skipstart == 0) 607 rm->rm_skipstart = 1; 608 } 609 610 return (rm); 611 } 612 613 struct pqr_struct { 614 uint64_t *p; 615 uint64_t *q; 616 uint64_t *r; 617 }; 618 619 static int 620 vdev_raidz_p_func(void *buf, size_t size, void *private) 621 { 622 struct pqr_struct *pqr = private; 623 const uint64_t *src = buf; 624 int i, cnt = size / sizeof (src[0]); 625 626 ASSERT(pqr->p && !pqr->q && !pqr->r); 627 628 for (i = 0; i < cnt; i++, src++, pqr->p++) 629 *pqr->p ^= *src; 630 631 return (0); 632 } 633 634 static int 635 vdev_raidz_pq_func(void *buf, size_t size, void *private) 636 { 637 struct pqr_struct *pqr = private; 638 const uint64_t *src = buf; 639 uint64_t mask; 640 int i, cnt = size / sizeof (src[0]); 641 642 ASSERT(pqr->p && pqr->q && !pqr->r); 643 644 for (i = 0; i < cnt; i++, src++, pqr->p++, pqr->q++) { 645 *pqr->p ^= *src; 646 VDEV_RAIDZ_64MUL_2(*pqr->q, mask); 647 *pqr->q ^= *src; 648 } 649 650 return (0); 651 } 652 653 static int 654 vdev_raidz_pqr_func(void *buf, size_t size, void *private) 655 { 656 struct pqr_struct *pqr = private; 657 const uint64_t *src = buf; 658 uint64_t mask; 659 int i, cnt = size / sizeof (src[0]); 660 661 ASSERT(pqr->p && pqr->q && pqr->r); 662 663 for (i = 0; i < cnt; i++, src++, pqr->p++, pqr->q++, pqr->r++) { 664 *pqr->p ^= *src; 665 VDEV_RAIDZ_64MUL_2(*pqr->q, mask); 666 *pqr->q ^= *src; 667 VDEV_RAIDZ_64MUL_4(*pqr->r, mask); 668 *pqr->r ^= *src; 669 } 670 671 return (0); 672 } 673 674 static void 675 vdev_raidz_generate_parity_p(raidz_map_t *rm) 676 { 677 uint64_t *p; 678 int c; 679 abd_t *src; 680 681 for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { 682 src = rm->rm_col[c].rc_abd; 683 p = abd_to_buf(rm->rm_col[VDEV_RAIDZ_P].rc_abd); 684 685 if (c == rm->rm_firstdatacol) { 686 abd_copy_to_buf(p, src, rm->rm_col[c].rc_size); 687 } else { 688 struct pqr_struct pqr = { p, NULL, NULL }; 689 (void) abd_iterate_func(src, 0, rm->rm_col[c].rc_size, 690 vdev_raidz_p_func, &pqr); 691 } 692 } 693 } 694 695 static void 696 vdev_raidz_generate_parity_pq(raidz_map_t *rm) 697 { 698 uint64_t *p, *q, pcnt, ccnt, mask, i; 699 int c; 700 abd_t *src; 701 702 pcnt = rm->rm_col[VDEV_RAIDZ_P].rc_size / sizeof (p[0]); 703 ASSERT(rm->rm_col[VDEV_RAIDZ_P].rc_size == 704 rm->rm_col[VDEV_RAIDZ_Q].rc_size); 705 706 for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { 707 src = rm->rm_col[c].rc_abd; 708 p = abd_to_buf(rm->rm_col[VDEV_RAIDZ_P].rc_abd); 709 q = abd_to_buf(rm->rm_col[VDEV_RAIDZ_Q].rc_abd); 710 711 ccnt = rm->rm_col[c].rc_size / sizeof (p[0]); 712 713 if (c == rm->rm_firstdatacol) { 714 abd_copy_to_buf(p, src, rm->rm_col[c].rc_size); 715 (void) memcpy(q, p, rm->rm_col[c].rc_size); 716 } else { 717 struct pqr_struct pqr = { p, q, NULL }; 718 (void) abd_iterate_func(src, 0, rm->rm_col[c].rc_size, 719 vdev_raidz_pq_func, &pqr); 720 } 721 722 if (c == rm->rm_firstdatacol) { 723 for (i = ccnt; i < pcnt; i++) { 724 p[i] = 0; 725 q[i] = 0; 726 } 727 } else { 728 /* 729 * Treat short columns as though they are full of 0s. 730 * Note that there's therefore nothing needed for P. 731 */ 732 for (i = ccnt; i < pcnt; i++) { 733 VDEV_RAIDZ_64MUL_2(q[i], mask); 734 } 735 } 736 } 737 } 738 739 static void 740 vdev_raidz_generate_parity_pqr(raidz_map_t *rm) 741 { 742 uint64_t *p, *q, *r, pcnt, ccnt, mask, i; 743 int c; 744 abd_t *src; 745 746 pcnt = rm->rm_col[VDEV_RAIDZ_P].rc_size / sizeof (p[0]); 747 ASSERT(rm->rm_col[VDEV_RAIDZ_P].rc_size == 748 rm->rm_col[VDEV_RAIDZ_Q].rc_size); 749 ASSERT(rm->rm_col[VDEV_RAIDZ_P].rc_size == 750 rm->rm_col[VDEV_RAIDZ_R].rc_size); 751 752 for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { 753 src = rm->rm_col[c].rc_abd; 754 p = abd_to_buf(rm->rm_col[VDEV_RAIDZ_P].rc_abd); 755 q = abd_to_buf(rm->rm_col[VDEV_RAIDZ_Q].rc_abd); 756 r = abd_to_buf(rm->rm_col[VDEV_RAIDZ_R].rc_abd); 757 758 ccnt = rm->rm_col[c].rc_size / sizeof (p[0]); 759 760 if (c == rm->rm_firstdatacol) { 761 abd_copy_to_buf(p, src, rm->rm_col[c].rc_size); 762 (void) memcpy(q, p, rm->rm_col[c].rc_size); 763 (void) memcpy(r, p, rm->rm_col[c].rc_size); 764 } else { 765 struct pqr_struct pqr = { p, q, r }; 766 (void) abd_iterate_func(src, 0, rm->rm_col[c].rc_size, 767 vdev_raidz_pqr_func, &pqr); 768 } 769 770 if (c == rm->rm_firstdatacol) { 771 for (i = ccnt; i < pcnt; i++) { 772 p[i] = 0; 773 q[i] = 0; 774 r[i] = 0; 775 } 776 } else { 777 /* 778 * Treat short columns as though they are full of 0s. 779 * Note that there's therefore nothing needed for P. 780 */ 781 for (i = ccnt; i < pcnt; i++) { 782 VDEV_RAIDZ_64MUL_2(q[i], mask); 783 VDEV_RAIDZ_64MUL_4(r[i], mask); 784 } 785 } 786 } 787 } 788 789 /* 790 * Generate RAID parity in the first virtual columns according to the number of 791 * parity columns available. 792 */ 793 static void 794 vdev_raidz_generate_parity(raidz_map_t *rm) 795 { 796 switch (rm->rm_firstdatacol) { 797 case 1: 798 vdev_raidz_generate_parity_p(rm); 799 break; 800 case 2: 801 vdev_raidz_generate_parity_pq(rm); 802 break; 803 case 3: 804 vdev_raidz_generate_parity_pqr(rm); 805 break; 806 default: 807 cmn_err(CE_PANIC, "invalid RAID-Z configuration"); 808 } 809 } 810 811 /* ARGSUSED */ 812 static int 813 vdev_raidz_reconst_p_func(void *dbuf, void *sbuf, size_t size, void *private) 814 { 815 uint64_t *dst = dbuf; 816 uint64_t *src = sbuf; 817 int cnt = size / sizeof (src[0]); 818 819 for (int i = 0; i < cnt; i++) { 820 dst[i] ^= src[i]; 821 } 822 823 return (0); 824 } 825 826 /* ARGSUSED */ 827 static int 828 vdev_raidz_reconst_q_pre_func(void *dbuf, void *sbuf, size_t size, 829 void *private) 830 { 831 uint64_t *dst = dbuf; 832 uint64_t *src = sbuf; 833 uint64_t mask; 834 int cnt = size / sizeof (dst[0]); 835 836 for (int i = 0; i < cnt; i++, dst++, src++) { 837 VDEV_RAIDZ_64MUL_2(*dst, mask); 838 *dst ^= *src; 839 } 840 841 return (0); 842 } 843 844 /* ARGSUSED */ 845 static int 846 vdev_raidz_reconst_q_pre_tail_func(void *buf, size_t size, void *private) 847 { 848 uint64_t *dst = buf; 849 uint64_t mask; 850 int cnt = size / sizeof (dst[0]); 851 852 for (int i = 0; i < cnt; i++, dst++) { 853 /* same operation as vdev_raidz_reconst_q_pre_func() on dst */ 854 VDEV_RAIDZ_64MUL_2(*dst, mask); 855 } 856 857 return (0); 858 } 859 860 struct reconst_q_struct { 861 uint64_t *q; 862 int exp; 863 }; 864 865 static int 866 vdev_raidz_reconst_q_post_func(void *buf, size_t size, void *private) 867 { 868 struct reconst_q_struct *rq = private; 869 uint64_t *dst = buf; 870 int cnt = size / sizeof (dst[0]); 871 872 for (int i = 0; i < cnt; i++, dst++, rq->q++) { 873 *dst ^= *rq->q; 874 875 int j; 876 uint8_t *b; 877 for (j = 0, b = (uint8_t *)dst; j < 8; j++, b++) { 878 *b = vdev_raidz_exp2(*b, rq->exp); 879 } 880 } 881 882 return (0); 883 } 884 885 struct reconst_pq_struct { 886 uint8_t *p; 887 uint8_t *q; 888 uint8_t *pxy; 889 uint8_t *qxy; 890 int aexp; 891 int bexp; 892 }; 893 894 static int 895 vdev_raidz_reconst_pq_func(void *xbuf, void *ybuf, size_t size, void *private) 896 { 897 struct reconst_pq_struct *rpq = private; 898 uint8_t *xd = xbuf; 899 uint8_t *yd = ybuf; 900 901 for (int i = 0; i < size; 902 i++, rpq->p++, rpq->q++, rpq->pxy++, rpq->qxy++, xd++, yd++) { 903 *xd = vdev_raidz_exp2(*rpq->p ^ *rpq->pxy, rpq->aexp) ^ 904 vdev_raidz_exp2(*rpq->q ^ *rpq->qxy, rpq->bexp); 905 *yd = *rpq->p ^ *rpq->pxy ^ *xd; 906 } 907 908 return (0); 909 } 910 911 static int 912 vdev_raidz_reconst_pq_tail_func(void *xbuf, size_t size, void *private) 913 { 914 struct reconst_pq_struct *rpq = private; 915 uint8_t *xd = xbuf; 916 917 for (int i = 0; i < size; 918 i++, rpq->p++, rpq->q++, rpq->pxy++, rpq->qxy++, xd++) { 919 /* same operation as vdev_raidz_reconst_pq_func() on xd */ 920 *xd = vdev_raidz_exp2(*rpq->p ^ *rpq->pxy, rpq->aexp) ^ 921 vdev_raidz_exp2(*rpq->q ^ *rpq->qxy, rpq->bexp); 922 } 923 924 return (0); 925 } 926 927 static int 928 vdev_raidz_reconstruct_p(raidz_map_t *rm, int *tgts, int ntgts) 929 { 930 int x = tgts[0]; 931 int c; 932 abd_t *dst, *src; 933 934 ASSERT(ntgts == 1); 935 ASSERT(x >= rm->rm_firstdatacol); 936 ASSERT(x < rm->rm_cols); 937 938 ASSERT(rm->rm_col[x].rc_size <= rm->rm_col[VDEV_RAIDZ_P].rc_size); 939 ASSERT(rm->rm_col[x].rc_size > 0); 940 941 src = rm->rm_col[VDEV_RAIDZ_P].rc_abd; 942 dst = rm->rm_col[x].rc_abd; 943 944 abd_copy(dst, src, rm->rm_col[x].rc_size); 945 946 for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { 947 uint64_t size = MIN(rm->rm_col[x].rc_size, 948 rm->rm_col[c].rc_size); 949 950 src = rm->rm_col[c].rc_abd; 951 dst = rm->rm_col[x].rc_abd; 952 953 if (c == x) 954 continue; 955 956 (void) abd_iterate_func2(dst, src, 0, 0, size, 957 vdev_raidz_reconst_p_func, NULL); 958 } 959 960 return (1 << VDEV_RAIDZ_P); 961 } 962 963 static int 964 vdev_raidz_reconstruct_q(raidz_map_t *rm, int *tgts, int ntgts) 965 { 966 int x = tgts[0]; 967 int c, exp; 968 abd_t *dst, *src; 969 970 ASSERT(ntgts == 1); 971 972 ASSERT(rm->rm_col[x].rc_size <= rm->rm_col[VDEV_RAIDZ_Q].rc_size); 973 974 for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { 975 uint64_t size = (c == x) ? 0 : MIN(rm->rm_col[x].rc_size, 976 rm->rm_col[c].rc_size); 977 978 src = rm->rm_col[c].rc_abd; 979 dst = rm->rm_col[x].rc_abd; 980 981 if (c == rm->rm_firstdatacol) { 982 abd_copy(dst, src, size); 983 if (rm->rm_col[x].rc_size > size) 984 abd_zero_off(dst, size, 985 rm->rm_col[x].rc_size - size); 986 } else { 987 ASSERT3U(size, <=, rm->rm_col[x].rc_size); 988 (void) abd_iterate_func2(dst, src, 0, 0, size, 989 vdev_raidz_reconst_q_pre_func, NULL); 990 (void) abd_iterate_func(dst, 991 size, rm->rm_col[x].rc_size - size, 992 vdev_raidz_reconst_q_pre_tail_func, NULL); 993 } 994 } 995 996 src = rm->rm_col[VDEV_RAIDZ_Q].rc_abd; 997 dst = rm->rm_col[x].rc_abd; 998 exp = 255 - (rm->rm_cols - 1 - x); 999 1000 struct reconst_q_struct rq = { abd_to_buf(src), exp }; 1001 (void) abd_iterate_func(dst, 0, rm->rm_col[x].rc_size, 1002 vdev_raidz_reconst_q_post_func, &rq); 1003 1004 return (1 << VDEV_RAIDZ_Q); 1005 } 1006 1007 static int 1008 vdev_raidz_reconstruct_pq(raidz_map_t *rm, int *tgts, int ntgts) 1009 { 1010 uint8_t *p, *q, *pxy, *qxy, tmp, a, b, aexp, bexp; 1011 abd_t *pdata, *qdata; 1012 uint64_t xsize, ysize; 1013 int x = tgts[0]; 1014 int y = tgts[1]; 1015 abd_t *xd, *yd; 1016 1017 ASSERT(ntgts == 2); 1018 ASSERT(x < y); 1019 ASSERT(x >= rm->rm_firstdatacol); 1020 ASSERT(y < rm->rm_cols); 1021 1022 ASSERT(rm->rm_col[x].rc_size >= rm->rm_col[y].rc_size); 1023 1024 /* 1025 * Move the parity data aside -- we're going to compute parity as 1026 * though columns x and y were full of zeros -- Pxy and Qxy. We want to 1027 * reuse the parity generation mechanism without trashing the actual 1028 * parity so we make those columns appear to be full of zeros by 1029 * setting their lengths to zero. 1030 */ 1031 pdata = rm->rm_col[VDEV_RAIDZ_P].rc_abd; 1032 qdata = rm->rm_col[VDEV_RAIDZ_Q].rc_abd; 1033 xsize = rm->rm_col[x].rc_size; 1034 ysize = rm->rm_col[y].rc_size; 1035 1036 rm->rm_col[VDEV_RAIDZ_P].rc_abd = 1037 abd_alloc_linear(rm->rm_col[VDEV_RAIDZ_P].rc_size, B_TRUE); 1038 rm->rm_col[VDEV_RAIDZ_Q].rc_abd = 1039 abd_alloc_linear(rm->rm_col[VDEV_RAIDZ_Q].rc_size, B_TRUE); 1040 rm->rm_col[x].rc_size = 0; 1041 rm->rm_col[y].rc_size = 0; 1042 1043 vdev_raidz_generate_parity_pq(rm); 1044 1045 rm->rm_col[x].rc_size = xsize; 1046 rm->rm_col[y].rc_size = ysize; 1047 1048 p = abd_to_buf(pdata); 1049 q = abd_to_buf(qdata); 1050 pxy = abd_to_buf(rm->rm_col[VDEV_RAIDZ_P].rc_abd); 1051 qxy = abd_to_buf(rm->rm_col[VDEV_RAIDZ_Q].rc_abd); 1052 xd = rm->rm_col[x].rc_abd; 1053 yd = rm->rm_col[y].rc_abd; 1054 1055 /* 1056 * We now have: 1057 * Pxy = P + D_x + D_y 1058 * Qxy = Q + 2^(ndevs - 1 - x) * D_x + 2^(ndevs - 1 - y) * D_y 1059 * 1060 * We can then solve for D_x: 1061 * D_x = A * (P + Pxy) + B * (Q + Qxy) 1062 * where 1063 * A = 2^(x - y) * (2^(x - y) + 1)^-1 1064 * B = 2^(ndevs - 1 - x) * (2^(x - y) + 1)^-1 1065 * 1066 * With D_x in hand, we can easily solve for D_y: 1067 * D_y = P + Pxy + D_x 1068 */ 1069 1070 a = vdev_raidz_pow2[255 + x - y]; 1071 b = vdev_raidz_pow2[255 - (rm->rm_cols - 1 - x)]; 1072 tmp = 255 - vdev_raidz_log2[a ^ 1]; 1073 1074 aexp = vdev_raidz_log2[vdev_raidz_exp2(a, tmp)]; 1075 bexp = vdev_raidz_log2[vdev_raidz_exp2(b, tmp)]; 1076 1077 ASSERT3U(xsize, >=, ysize); 1078 struct reconst_pq_struct rpq = { p, q, pxy, qxy, aexp, bexp }; 1079 (void) abd_iterate_func2(xd, yd, 0, 0, ysize, 1080 vdev_raidz_reconst_pq_func, &rpq); 1081 (void) abd_iterate_func(xd, ysize, xsize - ysize, 1082 vdev_raidz_reconst_pq_tail_func, &rpq); 1083 1084 abd_free(rm->rm_col[VDEV_RAIDZ_P].rc_abd); 1085 abd_free(rm->rm_col[VDEV_RAIDZ_Q].rc_abd); 1086 1087 /* 1088 * Restore the saved parity data. 1089 */ 1090 rm->rm_col[VDEV_RAIDZ_P].rc_abd = pdata; 1091 rm->rm_col[VDEV_RAIDZ_Q].rc_abd = qdata; 1092 1093 return ((1 << VDEV_RAIDZ_P) | (1 << VDEV_RAIDZ_Q)); 1094 } 1095 1096 /* BEGIN CSTYLED */ 1097 /* 1098 * In the general case of reconstruction, we must solve the system of linear 1099 * equations defined by the coeffecients used to generate parity as well as 1100 * the contents of the data and parity disks. This can be expressed with 1101 * vectors for the original data (D) and the actual data (d) and parity (p) 1102 * and a matrix composed of the identity matrix (I) and a dispersal matrix (V): 1103 * 1104 * __ __ __ __ 1105 * | | __ __ | p_0 | 1106 * | V | | D_0 | | p_m-1 | 1107 * | | x | : | = | d_0 | 1108 * | I | | D_n-1 | | : | 1109 * | | ~~ ~~ | d_n-1 | 1110 * ~~ ~~ ~~ ~~ 1111 * 1112 * I is simply a square identity matrix of size n, and V is a vandermonde 1113 * matrix defined by the coeffecients we chose for the various parity columns 1114 * (1, 2, 4). Note that these values were chosen both for simplicity, speedy 1115 * computation as well as linear separability. 1116 * 1117 * __ __ __ __ 1118 * | 1 .. 1 1 1 | | p_0 | 1119 * | 2^n-1 .. 4 2 1 | __ __ | : | 1120 * | 4^n-1 .. 16 4 1 | | D_0 | | p_m-1 | 1121 * | 1 .. 0 0 0 | | D_1 | | d_0 | 1122 * | 0 .. 0 0 0 | x | D_2 | = | d_1 | 1123 * | : : : : | | : | | d_2 | 1124 * | 0 .. 1 0 0 | | D_n-1 | | : | 1125 * | 0 .. 0 1 0 | ~~ ~~ | : | 1126 * | 0 .. 0 0 1 | | d_n-1 | 1127 * ~~ ~~ ~~ ~~ 1128 * 1129 * Note that I, V, d, and p are known. To compute D, we must invert the 1130 * matrix and use the known data and parity values to reconstruct the unknown 1131 * data values. We begin by removing the rows in V|I and d|p that correspond 1132 * to failed or missing columns; we then make V|I square (n x n) and d|p 1133 * sized n by removing rows corresponding to unused parity from the bottom up 1134 * to generate (V|I)' and (d|p)'. We can then generate the inverse of (V|I)' 1135 * using Gauss-Jordan elimination. In the example below we use m=3 parity 1136 * columns, n=8 data columns, with errors in d_1, d_2, and p_1: 1137 * __ __ 1138 * | 1 1 1 1 1 1 1 1 | 1139 * | 128 64 32 16 8 4 2 1 | <-----+-+-- missing disks 1140 * | 19 205 116 29 64 16 4 1 | / / 1141 * | 1 0 0 0 0 0 0 0 | / / 1142 * | 0 1 0 0 0 0 0 0 | <--' / 1143 * (V|I) = | 0 0 1 0 0 0 0 0 | <---' 1144 * | 0 0 0 1 0 0 0 0 | 1145 * | 0 0 0 0 1 0 0 0 | 1146 * | 0 0 0 0 0 1 0 0 | 1147 * | 0 0 0 0 0 0 1 0 | 1148 * | 0 0 0 0 0 0 0 1 | 1149 * ~~ ~~ 1150 * __ __ 1151 * | 1 1 1 1 1 1 1 1 | 1152 * | 19 205 116 29 64 16 4 1 | 1153 * | 1 0 0 0 0 0 0 0 | 1154 * (V|I)' = | 0 0 0 1 0 0 0 0 | 1155 * | 0 0 0 0 1 0 0 0 | 1156 * | 0 0 0 0 0 1 0 0 | 1157 * | 0 0 0 0 0 0 1 0 | 1158 * | 0 0 0 0 0 0 0 1 | 1159 * ~~ ~~ 1160 * 1161 * Here we employ Gauss-Jordan elimination to find the inverse of (V|I)'. We 1162 * have carefully chosen the seed values 1, 2, and 4 to ensure that this 1163 * matrix is not singular. 1164 * __ __ 1165 * | 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 | 1166 * | 19 205 116 29 64 16 4 1 0 1 0 0 0 0 0 0 | 1167 * | 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 | 1168 * | 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 | 1169 * | 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 | 1170 * | 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 | 1171 * | 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 | 1172 * | 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 | 1173 * ~~ ~~ 1174 * __ __ 1175 * | 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 | 1176 * | 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 | 1177 * | 19 205 116 29 64 16 4 1 0 1 0 0 0 0 0 0 | 1178 * | 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 | 1179 * | 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 | 1180 * | 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 | 1181 * | 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 | 1182 * | 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 | 1183 * ~~ ~~ 1184 * __ __ 1185 * | 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 | 1186 * | 0 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 | 1187 * | 0 205 116 0 0 0 0 0 0 1 19 29 64 16 4 1 | 1188 * | 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 | 1189 * | 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 | 1190 * | 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 | 1191 * | 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 | 1192 * | 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 | 1193 * ~~ ~~ 1194 * __ __ 1195 * | 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 | 1196 * | 0 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 | 1197 * | 0 0 185 0 0 0 0 0 205 1 222 208 141 221 201 204 | 1198 * | 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 | 1199 * | 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 | 1200 * | 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 | 1201 * | 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 | 1202 * | 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 | 1203 * ~~ ~~ 1204 * __ __ 1205 * | 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 | 1206 * | 0 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 | 1207 * | 0 0 1 0 0 0 0 0 166 100 4 40 158 168 216 209 | 1208 * | 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 | 1209 * | 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 | 1210 * | 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 | 1211 * | 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 | 1212 * | 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 | 1213 * ~~ ~~ 1214 * __ __ 1215 * | 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 | 1216 * | 0 1 0 0 0 0 0 0 167 100 5 41 159 169 217 208 | 1217 * | 0 0 1 0 0 0 0 0 166 100 4 40 158 168 216 209 | 1218 * | 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 | 1219 * | 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 | 1220 * | 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 | 1221 * | 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 | 1222 * | 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 | 1223 * ~~ ~~ 1224 * __ __ 1225 * | 0 0 1 0 0 0 0 0 | 1226 * | 167 100 5 41 159 169 217 208 | 1227 * | 166 100 4 40 158 168 216 209 | 1228 * (V|I)'^-1 = | 0 0 0 1 0 0 0 0 | 1229 * | 0 0 0 0 1 0 0 0 | 1230 * | 0 0 0 0 0 1 0 0 | 1231 * | 0 0 0 0 0 0 1 0 | 1232 * | 0 0 0 0 0 0 0 1 | 1233 * ~~ ~~ 1234 * 1235 * We can then simply compute D = (V|I)'^-1 x (d|p)' to discover the values 1236 * of the missing data. 1237 * 1238 * As is apparent from the example above, the only non-trivial rows in the 1239 * inverse matrix correspond to the data disks that we're trying to 1240 * reconstruct. Indeed, those are the only rows we need as the others would 1241 * only be useful for reconstructing data known or assumed to be valid. For 1242 * that reason, we only build the coefficients in the rows that correspond to 1243 * targeted columns. 1244 */ 1245 /* END CSTYLED */ 1246 1247 static void 1248 vdev_raidz_matrix_init(raidz_map_t *rm, int n, int nmap, int *map, 1249 uint8_t **rows) 1250 { 1251 int i, j; 1252 int pow; 1253 1254 ASSERT(n == rm->rm_cols - rm->rm_firstdatacol); 1255 1256 /* 1257 * Fill in the missing rows of interest. 1258 */ 1259 for (i = 0; i < nmap; i++) { 1260 ASSERT3S(0, <=, map[i]); 1261 ASSERT3S(map[i], <=, 2); 1262 1263 pow = map[i] * n; 1264 if (pow > 255) 1265 pow -= 255; 1266 ASSERT(pow <= 255); 1267 1268 for (j = 0; j < n; j++) { 1269 pow -= map[i]; 1270 if (pow < 0) 1271 pow += 255; 1272 rows[i][j] = vdev_raidz_pow2[pow]; 1273 } 1274 } 1275 } 1276 1277 static void 1278 vdev_raidz_matrix_invert(raidz_map_t *rm, int n, int nmissing, int *missing, 1279 uint8_t **rows, uint8_t **invrows, const uint8_t *used) 1280 { 1281 int i, j, ii, jj; 1282 uint8_t log; 1283 1284 /* 1285 * Assert that the first nmissing entries from the array of used 1286 * columns correspond to parity columns and that subsequent entries 1287 * correspond to data columns. 1288 */ 1289 for (i = 0; i < nmissing; i++) { 1290 ASSERT3S(used[i], <, rm->rm_firstdatacol); 1291 } 1292 for (; i < n; i++) { 1293 ASSERT3S(used[i], >=, rm->rm_firstdatacol); 1294 } 1295 1296 /* 1297 * First initialize the storage where we'll compute the inverse rows. 1298 */ 1299 for (i = 0; i < nmissing; i++) { 1300 for (j = 0; j < n; j++) { 1301 invrows[i][j] = (i == j) ? 1 : 0; 1302 } 1303 } 1304 1305 /* 1306 * Subtract all trivial rows from the rows of consequence. 1307 */ 1308 for (i = 0; i < nmissing; i++) { 1309 for (j = nmissing; j < n; j++) { 1310 ASSERT3U(used[j], >=, rm->rm_firstdatacol); 1311 jj = used[j] - rm->rm_firstdatacol; 1312 ASSERT3S(jj, <, n); 1313 invrows[i][j] = rows[i][jj]; 1314 rows[i][jj] = 0; 1315 } 1316 } 1317 1318 /* 1319 * For each of the rows of interest, we must normalize it and subtract 1320 * a multiple of it from the other rows. 1321 */ 1322 for (i = 0; i < nmissing; i++) { 1323 for (j = 0; j < missing[i]; j++) { 1324 ASSERT0(rows[i][j]); 1325 } 1326 ASSERT3U(rows[i][missing[i]], !=, 0); 1327 1328 /* 1329 * Compute the inverse of the first element and multiply each 1330 * element in the row by that value. 1331 */ 1332 log = 255 - vdev_raidz_log2[rows[i][missing[i]]]; 1333 1334 for (j = 0; j < n; j++) { 1335 rows[i][j] = vdev_raidz_exp2(rows[i][j], log); 1336 invrows[i][j] = vdev_raidz_exp2(invrows[i][j], log); 1337 } 1338 1339 for (ii = 0; ii < nmissing; ii++) { 1340 if (i == ii) 1341 continue; 1342 1343 ASSERT3U(rows[ii][missing[i]], !=, 0); 1344 1345 log = vdev_raidz_log2[rows[ii][missing[i]]]; 1346 1347 for (j = 0; j < n; j++) { 1348 rows[ii][j] ^= 1349 vdev_raidz_exp2(rows[i][j], log); 1350 invrows[ii][j] ^= 1351 vdev_raidz_exp2(invrows[i][j], log); 1352 } 1353 } 1354 } 1355 1356 /* 1357 * Verify that the data that is left in the rows are properly part of 1358 * an identity matrix. 1359 */ 1360 for (i = 0; i < nmissing; i++) { 1361 for (j = 0; j < n; j++) { 1362 if (j == missing[i]) { 1363 ASSERT3U(rows[i][j], ==, 1); 1364 } else { 1365 ASSERT0(rows[i][j]); 1366 } 1367 } 1368 } 1369 } 1370 1371 static void 1372 vdev_raidz_matrix_reconstruct(raidz_map_t *rm, int n, int nmissing, 1373 int *missing, uint8_t **invrows, const uint8_t *used) 1374 { 1375 int i, j, x, cc, c; 1376 uint8_t *src; 1377 uint64_t ccount; 1378 uint8_t *dst[VDEV_RAIDZ_MAXPARITY]; 1379 uint64_t dcount[VDEV_RAIDZ_MAXPARITY]; 1380 uint8_t log = 0; 1381 uint8_t val; 1382 int ll; 1383 uint8_t *invlog[VDEV_RAIDZ_MAXPARITY]; 1384 uint8_t *p, *pp; 1385 size_t psize; 1386 1387 psize = sizeof (invlog[0][0]) * n * nmissing; 1388 p = kmem_alloc(psize, KM_SLEEP); 1389 1390 for (pp = p, i = 0; i < nmissing; i++) { 1391 invlog[i] = pp; 1392 pp += n; 1393 } 1394 1395 for (i = 0; i < nmissing; i++) { 1396 for (j = 0; j < n; j++) { 1397 ASSERT3U(invrows[i][j], !=, 0); 1398 invlog[i][j] = vdev_raidz_log2[invrows[i][j]]; 1399 } 1400 } 1401 1402 for (i = 0; i < n; i++) { 1403 c = used[i]; 1404 ASSERT3U(c, <, rm->rm_cols); 1405 1406 src = abd_to_buf(rm->rm_col[c].rc_abd); 1407 ccount = rm->rm_col[c].rc_size; 1408 for (j = 0; j < nmissing; j++) { 1409 cc = missing[j] + rm->rm_firstdatacol; 1410 ASSERT3U(cc, >=, rm->rm_firstdatacol); 1411 ASSERT3U(cc, <, rm->rm_cols); 1412 ASSERT3U(cc, !=, c); 1413 1414 dst[j] = abd_to_buf(rm->rm_col[cc].rc_abd); 1415 dcount[j] = rm->rm_col[cc].rc_size; 1416 } 1417 1418 ASSERT(ccount >= rm->rm_col[missing[0]].rc_size || i > 0); 1419 1420 for (x = 0; x < ccount; x++, src++) { 1421 if (*src != 0) 1422 log = vdev_raidz_log2[*src]; 1423 1424 for (cc = 0; cc < nmissing; cc++) { 1425 if (x >= dcount[cc]) 1426 continue; 1427 1428 if (*src == 0) { 1429 val = 0; 1430 } else { 1431 if ((ll = log + invlog[cc][i]) >= 255) 1432 ll -= 255; 1433 val = vdev_raidz_pow2[ll]; 1434 } 1435 1436 if (i == 0) 1437 dst[cc][x] = val; 1438 else 1439 dst[cc][x] ^= val; 1440 } 1441 } 1442 } 1443 1444 kmem_free(p, psize); 1445 } 1446 1447 static int 1448 vdev_raidz_reconstruct_general(raidz_map_t *rm, int *tgts, int ntgts) 1449 { 1450 int n, i, c, t, tt; 1451 int nmissing_rows; 1452 int missing_rows[VDEV_RAIDZ_MAXPARITY]; 1453 int parity_map[VDEV_RAIDZ_MAXPARITY]; 1454 1455 uint8_t *p, *pp; 1456 size_t psize; 1457 1458 uint8_t *rows[VDEV_RAIDZ_MAXPARITY]; 1459 uint8_t *invrows[VDEV_RAIDZ_MAXPARITY]; 1460 uint8_t *used; 1461 1462 abd_t **bufs = NULL; 1463 1464 int code = 0; 1465 1466 /* 1467 * Matrix reconstruction can't use scatter ABDs yet, so we allocate 1468 * temporary linear ABDs. 1469 */ 1470 if (!abd_is_linear(rm->rm_col[rm->rm_firstdatacol].rc_abd)) { 1471 bufs = kmem_alloc(rm->rm_cols * sizeof (abd_t *), KM_PUSHPAGE); 1472 1473 for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { 1474 raidz_col_t *col = &rm->rm_col[c]; 1475 1476 bufs[c] = col->rc_abd; 1477 col->rc_abd = abd_alloc_linear(col->rc_size, B_TRUE); 1478 abd_copy(col->rc_abd, bufs[c], col->rc_size); 1479 } 1480 } 1481 1482 n = rm->rm_cols - rm->rm_firstdatacol; 1483 1484 /* 1485 * Figure out which data columns are missing. 1486 */ 1487 nmissing_rows = 0; 1488 for (t = 0; t < ntgts; t++) { 1489 if (tgts[t] >= rm->rm_firstdatacol) { 1490 missing_rows[nmissing_rows++] = 1491 tgts[t] - rm->rm_firstdatacol; 1492 } 1493 } 1494 1495 /* 1496 * Figure out which parity columns to use to help generate the missing 1497 * data columns. 1498 */ 1499 for (tt = 0, c = 0, i = 0; i < nmissing_rows; c++) { 1500 ASSERT(tt < ntgts); 1501 ASSERT(c < rm->rm_firstdatacol); 1502 1503 /* 1504 * Skip any targeted parity columns. 1505 */ 1506 if (c == tgts[tt]) { 1507 tt++; 1508 continue; 1509 } 1510 1511 code |= 1 << c; 1512 1513 parity_map[i] = c; 1514 i++; 1515 } 1516 1517 ASSERT(code != 0); 1518 ASSERT3U(code, <, 1 << VDEV_RAIDZ_MAXPARITY); 1519 1520 psize = (sizeof (rows[0][0]) + sizeof (invrows[0][0])) * 1521 nmissing_rows * n + sizeof (used[0]) * n; 1522 p = kmem_alloc(psize, KM_SLEEP); 1523 1524 for (pp = p, i = 0; i < nmissing_rows; i++) { 1525 rows[i] = pp; 1526 pp += n; 1527 invrows[i] = pp; 1528 pp += n; 1529 } 1530 used = pp; 1531 1532 for (i = 0; i < nmissing_rows; i++) { 1533 used[i] = parity_map[i]; 1534 } 1535 1536 for (tt = 0, c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { 1537 if (tt < nmissing_rows && 1538 c == missing_rows[tt] + rm->rm_firstdatacol) { 1539 tt++; 1540 continue; 1541 } 1542 1543 ASSERT3S(i, <, n); 1544 used[i] = c; 1545 i++; 1546 } 1547 1548 /* 1549 * Initialize the interesting rows of the matrix. 1550 */ 1551 vdev_raidz_matrix_init(rm, n, nmissing_rows, parity_map, rows); 1552 1553 /* 1554 * Invert the matrix. 1555 */ 1556 vdev_raidz_matrix_invert(rm, n, nmissing_rows, missing_rows, rows, 1557 invrows, used); 1558 1559 /* 1560 * Reconstruct the missing data using the generated matrix. 1561 */ 1562 vdev_raidz_matrix_reconstruct(rm, n, nmissing_rows, missing_rows, 1563 invrows, used); 1564 1565 kmem_free(p, psize); 1566 1567 /* 1568 * copy back from temporary linear abds and free them 1569 */ 1570 if (bufs) { 1571 for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { 1572 raidz_col_t *col = &rm->rm_col[c]; 1573 1574 abd_copy(bufs[c], col->rc_abd, col->rc_size); 1575 abd_free(col->rc_abd); 1576 col->rc_abd = bufs[c]; 1577 } 1578 kmem_free(bufs, rm->rm_cols * sizeof (abd_t *)); 1579 } 1580 1581 return (code); 1582 } 1583 1584 static int 1585 vdev_raidz_reconstruct(raidz_map_t *rm, int *t, int nt) 1586 { 1587 int tgts[VDEV_RAIDZ_MAXPARITY], *dt; 1588 int ntgts; 1589 int i, c; 1590 int code; 1591 int nbadparity, nbaddata; 1592 int parity_valid[VDEV_RAIDZ_MAXPARITY]; 1593 1594 /* 1595 * The tgts list must already be sorted. 1596 */ 1597 for (i = 1; i < nt; i++) { 1598 ASSERT(t[i] > t[i - 1]); 1599 } 1600 1601 nbadparity = rm->rm_firstdatacol; 1602 nbaddata = rm->rm_cols - nbadparity; 1603 ntgts = 0; 1604 for (i = 0, c = 0; c < rm->rm_cols; c++) { 1605 if (c < rm->rm_firstdatacol) 1606 parity_valid[c] = B_FALSE; 1607 1608 if (i < nt && c == t[i]) { 1609 tgts[ntgts++] = c; 1610 i++; 1611 } else if (rm->rm_col[c].rc_error != 0) { 1612 tgts[ntgts++] = c; 1613 } else if (c >= rm->rm_firstdatacol) { 1614 nbaddata--; 1615 } else { 1616 parity_valid[c] = B_TRUE; 1617 nbadparity--; 1618 } 1619 } 1620 1621 ASSERT(ntgts >= nt); 1622 ASSERT(nbaddata >= 0); 1623 ASSERT(nbaddata + nbadparity == ntgts); 1624 1625 dt = &tgts[nbadparity]; 1626 1627 /* 1628 * See if we can use any of our optimized reconstruction routines. 1629 */ 1630 if (!vdev_raidz_default_to_general) { 1631 switch (nbaddata) { 1632 case 1: 1633 if (parity_valid[VDEV_RAIDZ_P]) 1634 return (vdev_raidz_reconstruct_p(rm, dt, 1)); 1635 1636 ASSERT(rm->rm_firstdatacol > 1); 1637 1638 if (parity_valid[VDEV_RAIDZ_Q]) 1639 return (vdev_raidz_reconstruct_q(rm, dt, 1)); 1640 1641 ASSERT(rm->rm_firstdatacol > 2); 1642 break; 1643 1644 case 2: 1645 ASSERT(rm->rm_firstdatacol > 1); 1646 1647 if (parity_valid[VDEV_RAIDZ_P] && 1648 parity_valid[VDEV_RAIDZ_Q]) 1649 return (vdev_raidz_reconstruct_pq(rm, dt, 2)); 1650 1651 ASSERT(rm->rm_firstdatacol > 2); 1652 1653 break; 1654 } 1655 } 1656 1657 code = vdev_raidz_reconstruct_general(rm, tgts, ntgts); 1658 ASSERT(code < (1 << VDEV_RAIDZ_MAXPARITY)); 1659 ASSERT(code > 0); 1660 return (code); 1661 } 1662 1663 static int 1664 vdev_raidz_open(vdev_t *vd, uint64_t *asize, uint64_t *max_asize, 1665 uint64_t *ashift) 1666 { 1667 vdev_t *cvd; 1668 uint64_t nparity = vd->vdev_nparity; 1669 int c; 1670 int lasterror = 0; 1671 int numerrors = 0; 1672 1673 ASSERT(nparity > 0); 1674 1675 if (nparity > VDEV_RAIDZ_MAXPARITY || 1676 vd->vdev_children < nparity + 1) { 1677 vd->vdev_stat.vs_aux = VDEV_AUX_BAD_LABEL; 1678 return (SET_ERROR(EINVAL)); 1679 } 1680 1681 vdev_open_children(vd); 1682 1683 for (c = 0; c < vd->vdev_children; c++) { 1684 cvd = vd->vdev_child[c]; 1685 1686 if (cvd->vdev_open_error != 0) { 1687 lasterror = cvd->vdev_open_error; 1688 numerrors++; 1689 continue; 1690 } 1691 1692 *asize = MIN(*asize - 1, cvd->vdev_asize - 1) + 1; 1693 *max_asize = MIN(*max_asize - 1, cvd->vdev_max_asize - 1) + 1; 1694 *ashift = MAX(*ashift, cvd->vdev_ashift); 1695 } 1696 1697 *asize *= vd->vdev_children; 1698 *max_asize *= vd->vdev_children; 1699 1700 if (numerrors > nparity) { 1701 vd->vdev_stat.vs_aux = VDEV_AUX_NO_REPLICAS; 1702 return (lasterror); 1703 } 1704 1705 return (0); 1706 } 1707 1708 static void 1709 vdev_raidz_close(vdev_t *vd) 1710 { 1711 int c; 1712 1713 for (c = 0; c < vd->vdev_children; c++) 1714 vdev_close(vd->vdev_child[c]); 1715 } 1716 1717 /* 1718 * Handle a read or write I/O to a RAID-Z dump device. 1719 * 1720 * The dump device is in a unique situation compared to other ZFS datasets: 1721 * writing to this device should be as simple and fast as possible. In 1722 * addition, durability matters much less since the dump will be extracted 1723 * once the machine reboots. For that reason, this function eschews parity for 1724 * performance and simplicity. The dump device uses the checksum setting 1725 * ZIO_CHECKSUM_NOPARITY to indicate that parity is not maintained for this 1726 * dataset. 1727 * 1728 * Blocks of size 128 KB have been preallocated for this volume. I/Os less than 1729 * 128 KB will not fill an entire block; in addition, they may not be properly 1730 * aligned. In that case, this function uses the preallocated 128 KB block and 1731 * omits reading or writing any "empty" portions of that block, as opposed to 1732 * allocating a fresh appropriately-sized block. 1733 * 1734 * Looking at an example of a 32 KB I/O to a RAID-Z vdev with 5 child vdevs: 1735 * 1736 * vdev_raidz_io_start(data, size: 32 KB, offset: 64 KB) 1737 * 1738 * If this were a standard RAID-Z dataset, a block of at least 40 KB would be 1739 * allocated which spans all five child vdevs. 8 KB of data would be written to 1740 * each of four vdevs, with the fifth containing the parity bits. 1741 * 1742 * parity data data data data 1743 * | PP | XX | XX | XX | XX | 1744 * ^ ^ ^ ^ ^ 1745 * | | | | | 1746 * 8 KB parity ------8 KB data blocks------ 1747 * 1748 * However, when writing to the dump device, the behavior is different: 1749 * 1750 * vdev_raidz_physio(data, size: 32 KB, offset: 64 KB) 1751 * 1752 * Unlike the normal RAID-Z case in which the block is allocated based on the 1753 * I/O size, reads and writes here always use a 128 KB logical I/O size. If the 1754 * I/O size is less than 128 KB, only the actual portions of data are written. 1755 * In this example the data is written to the third data vdev since that vdev 1756 * contains the offset [64 KB, 96 KB). 1757 * 1758 * parity data data data data 1759 * | | | | XX | | 1760 * ^ 1761 * | 1762 * 32 KB data block 1763 * 1764 * As a result, an individual I/O may not span all child vdevs; moreover, a 1765 * small I/O may only operate on a single child vdev. 1766 * 1767 * Note that since there are no parity bits calculated or written, this format 1768 * remains the same no matter how many parity bits are used in a normal RAID-Z 1769 * stripe. On a RAID-Z3 configuration with seven child vdevs, the example above 1770 * would look like: 1771 * 1772 * parity parity parity data data data data 1773 * | | | | | | XX | | 1774 * ^ 1775 * | 1776 * 32 KB data block 1777 */ 1778 int 1779 vdev_raidz_physio(vdev_t *vd, caddr_t data, size_t size, 1780 uint64_t offset, uint64_t origoffset, boolean_t doread, boolean_t isdump) 1781 { 1782 vdev_t *tvd = vd->vdev_top; 1783 vdev_t *cvd; 1784 raidz_map_t *rm; 1785 raidz_col_t *rc; 1786 int c, err = 0; 1787 1788 uint64_t start, end, colstart, colend; 1789 uint64_t coloffset, colsize, colskip; 1790 1791 int flags = doread ? B_READ : B_WRITE; 1792 1793 #ifdef _KERNEL 1794 1795 /* 1796 * Don't write past the end of the block 1797 */ 1798 VERIFY3U(offset + size, <=, origoffset + SPA_OLD_MAXBLOCKSIZE); 1799 1800 start = offset; 1801 end = start + size; 1802 1803 /* 1804 * Allocate a RAID-Z map for this block. Note that this block starts 1805 * from the "original" offset, this is, the offset of the extent which 1806 * contains the requisite offset of the data being read or written. 1807 * 1808 * Even if this I/O operation doesn't span the full block size, let's 1809 * treat the on-disk format as if the only blocks are the complete 128 1810 * KB size. 1811 */ 1812 abd_t *abd = abd_get_from_buf(data - (offset - origoffset), 1813 SPA_OLD_MAXBLOCKSIZE); 1814 rm = vdev_raidz_map_alloc(abd, 1815 SPA_OLD_MAXBLOCKSIZE, origoffset, tvd->vdev_ashift, 1816 vd->vdev_children, vd->vdev_nparity); 1817 1818 coloffset = origoffset; 1819 1820 for (c = rm->rm_firstdatacol; c < rm->rm_cols; 1821 c++, coloffset += rc->rc_size) { 1822 rc = &rm->rm_col[c]; 1823 cvd = vd->vdev_child[rc->rc_devidx]; 1824 1825 /* 1826 * Find the start and end of this column in the RAID-Z map, 1827 * keeping in mind that the stated size and offset of the 1828 * operation may not fill the entire column for this vdev. 1829 * 1830 * If any portion of the data spans this column, issue the 1831 * appropriate operation to the vdev. 1832 */ 1833 if (coloffset + rc->rc_size <= start) 1834 continue; 1835 if (coloffset >= end) 1836 continue; 1837 1838 colstart = MAX(coloffset, start); 1839 colend = MIN(end, coloffset + rc->rc_size); 1840 colsize = colend - colstart; 1841 colskip = colstart - coloffset; 1842 1843 VERIFY3U(colsize, <=, rc->rc_size); 1844 VERIFY3U(colskip, <=, rc->rc_size); 1845 1846 /* 1847 * Note that the child vdev will have a vdev label at the start 1848 * of its range of offsets, hence the need for 1849 * VDEV_LABEL_OFFSET(). See zio_vdev_child_io() for another 1850 * example of why this calculation is needed. 1851 */ 1852 if ((err = vdev_disk_physio(cvd, 1853 ((char *)abd_to_buf(rc->rc_abd)) + colskip, colsize, 1854 VDEV_LABEL_OFFSET(rc->rc_offset) + colskip, 1855 flags, isdump)) != 0) 1856 break; 1857 } 1858 1859 vdev_raidz_map_free(rm); 1860 abd_put(abd); 1861 #endif /* KERNEL */ 1862 1863 return (err); 1864 } 1865 1866 static uint64_t 1867 vdev_raidz_asize(vdev_t *vd, uint64_t psize) 1868 { 1869 uint64_t asize; 1870 uint64_t ashift = vd->vdev_top->vdev_ashift; 1871 uint64_t cols = vd->vdev_children; 1872 uint64_t nparity = vd->vdev_nparity; 1873 1874 asize = ((psize - 1) >> ashift) + 1; 1875 asize += nparity * ((asize + cols - nparity - 1) / (cols - nparity)); 1876 asize = roundup(asize, nparity + 1) << ashift; 1877 1878 return (asize); 1879 } 1880 1881 static void 1882 vdev_raidz_child_done(zio_t *zio) 1883 { 1884 raidz_col_t *rc = zio->io_private; 1885 1886 rc->rc_error = zio->io_error; 1887 rc->rc_tried = 1; 1888 rc->rc_skipped = 0; 1889 } 1890 1891 static void 1892 vdev_raidz_io_verify(zio_t *zio, raidz_map_t *rm, int col) 1893 { 1894 #ifdef ZFS_DEBUG 1895 vdev_t *vd = zio->io_vd; 1896 vdev_t *tvd = vd->vdev_top; 1897 1898 range_seg_t logical_rs, physical_rs; 1899 logical_rs.rs_start = zio->io_offset; 1900 logical_rs.rs_end = logical_rs.rs_start + 1901 vdev_raidz_asize(zio->io_vd, zio->io_size); 1902 1903 raidz_col_t *rc = &rm->rm_col[col]; 1904 vdev_t *cvd = vd->vdev_child[rc->rc_devidx]; 1905 1906 vdev_xlate(cvd, &logical_rs, &physical_rs); 1907 ASSERT3U(rc->rc_offset, ==, physical_rs.rs_start); 1908 ASSERT3U(rc->rc_offset, <, physical_rs.rs_end); 1909 /* 1910 * It would be nice to assert that rs_end is equal 1911 * to rc_offset + rc_size but there might be an 1912 * optional I/O at the end that is not accounted in 1913 * rc_size. 1914 */ 1915 if (physical_rs.rs_end > rc->rc_offset + rc->rc_size) { 1916 ASSERT3U(physical_rs.rs_end, ==, rc->rc_offset + 1917 rc->rc_size + (1 << tvd->vdev_ashift)); 1918 } else { 1919 ASSERT3U(physical_rs.rs_end, ==, rc->rc_offset + rc->rc_size); 1920 } 1921 #endif 1922 } 1923 1924 /* 1925 * Start an IO operation on a RAIDZ VDev 1926 * 1927 * Outline: 1928 * - For write operations: 1929 * 1. Generate the parity data 1930 * 2. Create child zio write operations to each column's vdev, for both 1931 * data and parity. 1932 * 3. If the column skips any sectors for padding, create optional dummy 1933 * write zio children for those areas to improve aggregation continuity. 1934 * - For read operations: 1935 * 1. Create child zio read operations to each data column's vdev to read 1936 * the range of data required for zio. 1937 * 2. If this is a scrub or resilver operation, or if any of the data 1938 * vdevs have had errors, then create zio read operations to the parity 1939 * columns' VDevs as well. 1940 */ 1941 static void 1942 vdev_raidz_io_start(zio_t *zio) 1943 { 1944 vdev_t *vd = zio->io_vd; 1945 vdev_t *tvd = vd->vdev_top; 1946 vdev_t *cvd; 1947 raidz_map_t *rm; 1948 raidz_col_t *rc; 1949 int c, i; 1950 1951 rm = vdev_raidz_map_alloc(zio->io_abd, zio->io_size, zio->io_offset, 1952 tvd->vdev_ashift, vd->vdev_children, 1953 vd->vdev_nparity); 1954 1955 zio->io_vsd = rm; 1956 zio->io_vsd_ops = &vdev_raidz_vsd_ops; 1957 1958 ASSERT3U(rm->rm_asize, ==, vdev_psize_to_asize(vd, zio->io_size)); 1959 1960 if (zio->io_type == ZIO_TYPE_WRITE) { 1961 vdev_raidz_generate_parity(rm); 1962 1963 for (c = 0; c < rm->rm_cols; c++) { 1964 rc = &rm->rm_col[c]; 1965 cvd = vd->vdev_child[rc->rc_devidx]; 1966 1967 /* 1968 * Verify physical to logical translation. 1969 */ 1970 vdev_raidz_io_verify(zio, rm, c); 1971 1972 zio_nowait(zio_vdev_child_io(zio, NULL, cvd, 1973 rc->rc_offset, rc->rc_abd, rc->rc_size, 1974 zio->io_type, zio->io_priority, 0, 1975 vdev_raidz_child_done, rc)); 1976 } 1977 1978 /* 1979 * Generate optional I/Os for any skipped sectors to improve 1980 * aggregation contiguity. 1981 */ 1982 for (c = rm->rm_skipstart, i = 0; i < rm->rm_nskip; c++, i++) { 1983 ASSERT(c <= rm->rm_scols); 1984 if (c == rm->rm_scols) 1985 c = 0; 1986 rc = &rm->rm_col[c]; 1987 cvd = vd->vdev_child[rc->rc_devidx]; 1988 zio_nowait(zio_vdev_child_io(zio, NULL, cvd, 1989 rc->rc_offset + rc->rc_size, NULL, 1990 1 << tvd->vdev_ashift, 1991 zio->io_type, zio->io_priority, 1992 ZIO_FLAG_NODATA | ZIO_FLAG_OPTIONAL, NULL, NULL)); 1993 } 1994 1995 zio_execute(zio); 1996 return; 1997 } 1998 1999 ASSERT(zio->io_type == ZIO_TYPE_READ); 2000 2001 /* 2002 * Iterate over the columns in reverse order so that we hit the parity 2003 * last -- any errors along the way will force us to read the parity. 2004 */ 2005 for (c = rm->rm_cols - 1; c >= 0; c--) { 2006 rc = &rm->rm_col[c]; 2007 cvd = vd->vdev_child[rc->rc_devidx]; 2008 if (!vdev_readable(cvd)) { 2009 if (c >= rm->rm_firstdatacol) 2010 rm->rm_missingdata++; 2011 else 2012 rm->rm_missingparity++; 2013 rc->rc_error = SET_ERROR(ENXIO); 2014 rc->rc_tried = 1; /* don't even try */ 2015 rc->rc_skipped = 1; 2016 continue; 2017 } 2018 if (vdev_dtl_contains(cvd, DTL_MISSING, zio->io_txg, 1)) { 2019 if (c >= rm->rm_firstdatacol) 2020 rm->rm_missingdata++; 2021 else 2022 rm->rm_missingparity++; 2023 rc->rc_error = SET_ERROR(ESTALE); 2024 rc->rc_skipped = 1; 2025 continue; 2026 } 2027 if (c >= rm->rm_firstdatacol || rm->rm_missingdata > 0 || 2028 (zio->io_flags & (ZIO_FLAG_SCRUB | ZIO_FLAG_RESILVER))) { 2029 zio_nowait(zio_vdev_child_io(zio, NULL, cvd, 2030 rc->rc_offset, rc->rc_abd, rc->rc_size, 2031 zio->io_type, zio->io_priority, 0, 2032 vdev_raidz_child_done, rc)); 2033 } 2034 } 2035 2036 zio_execute(zio); 2037 } 2038 2039 2040 /* 2041 * Report a checksum error for a child of a RAID-Z device. 2042 */ 2043 static void 2044 raidz_checksum_error(zio_t *zio, raidz_col_t *rc, void *bad_data) 2045 { 2046 void *buf; 2047 vdev_t *vd = zio->io_vd->vdev_child[rc->rc_devidx]; 2048 2049 if (!(zio->io_flags & ZIO_FLAG_SPECULATIVE)) { 2050 zio_bad_cksum_t zbc; 2051 raidz_map_t *rm = zio->io_vsd; 2052 2053 mutex_enter(&vd->vdev_stat_lock); 2054 vd->vdev_stat.vs_checksum_errors++; 2055 mutex_exit(&vd->vdev_stat_lock); 2056 2057 zbc.zbc_has_cksum = 0; 2058 zbc.zbc_injected = rm->rm_ecksuminjected; 2059 2060 buf = abd_borrow_buf_copy(rc->rc_abd, rc->rc_size); 2061 zfs_ereport_post_checksum(zio->io_spa, vd, zio, 2062 rc->rc_offset, rc->rc_size, buf, bad_data, 2063 &zbc); 2064 abd_return_buf(rc->rc_abd, buf, rc->rc_size); 2065 } 2066 } 2067 2068 /* 2069 * We keep track of whether or not there were any injected errors, so that 2070 * any ereports we generate can note it. 2071 */ 2072 static int 2073 raidz_checksum_verify(zio_t *zio) 2074 { 2075 zio_bad_cksum_t zbc; 2076 raidz_map_t *rm = zio->io_vsd; 2077 2078 int ret = zio_checksum_error(zio, &zbc); 2079 if (ret != 0 && zbc.zbc_injected != 0) 2080 rm->rm_ecksuminjected = 1; 2081 2082 return (ret); 2083 } 2084 2085 /* 2086 * Generate the parity from the data columns. If we tried and were able to 2087 * read the parity without error, verify that the generated parity matches the 2088 * data we read. If it doesn't, we fire off a checksum error. Return the 2089 * number such failures. 2090 */ 2091 static int 2092 raidz_parity_verify(zio_t *zio, raidz_map_t *rm) 2093 { 2094 void *orig[VDEV_RAIDZ_MAXPARITY]; 2095 int c, ret = 0; 2096 raidz_col_t *rc; 2097 2098 blkptr_t *bp = zio->io_bp; 2099 enum zio_checksum checksum = (bp == NULL ? zio->io_prop.zp_checksum : 2100 (BP_IS_GANG(bp) ? ZIO_CHECKSUM_GANG_HEADER : BP_GET_CHECKSUM(bp))); 2101 2102 if (checksum == ZIO_CHECKSUM_NOPARITY) 2103 return (ret); 2104 2105 for (c = 0; c < rm->rm_firstdatacol; c++) { 2106 rc = &rm->rm_col[c]; 2107 if (!rc->rc_tried || rc->rc_error != 0) 2108 continue; 2109 orig[c] = zio_buf_alloc(rc->rc_size); 2110 abd_copy_to_buf(orig[c], rc->rc_abd, rc->rc_size); 2111 } 2112 2113 vdev_raidz_generate_parity(rm); 2114 2115 for (c = 0; c < rm->rm_firstdatacol; c++) { 2116 rc = &rm->rm_col[c]; 2117 if (!rc->rc_tried || rc->rc_error != 0) 2118 continue; 2119 if (abd_cmp_buf(rc->rc_abd, orig[c], rc->rc_size) != 0) { 2120 raidz_checksum_error(zio, rc, orig[c]); 2121 rc->rc_error = SET_ERROR(ECKSUM); 2122 ret++; 2123 } 2124 zio_buf_free(orig[c], rc->rc_size); 2125 } 2126 2127 return (ret); 2128 } 2129 2130 /* 2131 * Keep statistics on all the ways that we used parity to correct data. 2132 */ 2133 static uint64_t raidz_corrected[1 << VDEV_RAIDZ_MAXPARITY]; 2134 2135 static int 2136 vdev_raidz_worst_error(raidz_map_t *rm) 2137 { 2138 int error = 0; 2139 2140 for (int c = 0; c < rm->rm_cols; c++) 2141 error = zio_worst_error(error, rm->rm_col[c].rc_error); 2142 2143 return (error); 2144 } 2145 2146 /* 2147 * Iterate over all combinations of bad data and attempt a reconstruction. 2148 * Note that the algorithm below is non-optimal because it doesn't take into 2149 * account how reconstruction is actually performed. For example, with 2150 * triple-parity RAID-Z the reconstruction procedure is the same if column 4 2151 * is targeted as invalid as if columns 1 and 4 are targeted since in both 2152 * cases we'd only use parity information in column 0. 2153 */ 2154 static int 2155 vdev_raidz_combrec(zio_t *zio, int total_errors, int data_errors) 2156 { 2157 raidz_map_t *rm = zio->io_vsd; 2158 raidz_col_t *rc; 2159 void *orig[VDEV_RAIDZ_MAXPARITY]; 2160 int tstore[VDEV_RAIDZ_MAXPARITY + 2]; 2161 int *tgts = &tstore[1]; 2162 int current, next, i, c, n; 2163 int code, ret = 0; 2164 2165 ASSERT(total_errors < rm->rm_firstdatacol); 2166 2167 /* 2168 * This simplifies one edge condition. 2169 */ 2170 tgts[-1] = -1; 2171 2172 for (n = 1; n <= rm->rm_firstdatacol - total_errors; n++) { 2173 /* 2174 * Initialize the targets array by finding the first n columns 2175 * that contain no error. 2176 * 2177 * If there were no data errors, we need to ensure that we're 2178 * always explicitly attempting to reconstruct at least one 2179 * data column. To do this, we simply push the highest target 2180 * up into the data columns. 2181 */ 2182 for (c = 0, i = 0; i < n; i++) { 2183 if (i == n - 1 && data_errors == 0 && 2184 c < rm->rm_firstdatacol) { 2185 c = rm->rm_firstdatacol; 2186 } 2187 2188 while (rm->rm_col[c].rc_error != 0) { 2189 c++; 2190 ASSERT3S(c, <, rm->rm_cols); 2191 } 2192 2193 tgts[i] = c++; 2194 } 2195 2196 /* 2197 * Setting tgts[n] simplifies the other edge condition. 2198 */ 2199 tgts[n] = rm->rm_cols; 2200 2201 /* 2202 * These buffers were allocated in previous iterations. 2203 */ 2204 for (i = 0; i < n - 1; i++) { 2205 ASSERT(orig[i] != NULL); 2206 } 2207 2208 orig[n - 1] = zio_buf_alloc(rm->rm_col[0].rc_size); 2209 2210 current = 0; 2211 next = tgts[current]; 2212 2213 while (current != n) { 2214 tgts[current] = next; 2215 current = 0; 2216 2217 /* 2218 * Save off the original data that we're going to 2219 * attempt to reconstruct. 2220 */ 2221 for (i = 0; i < n; i++) { 2222 ASSERT(orig[i] != NULL); 2223 c = tgts[i]; 2224 ASSERT3S(c, >=, 0); 2225 ASSERT3S(c, <, rm->rm_cols); 2226 rc = &rm->rm_col[c]; 2227 abd_copy_to_buf(orig[i], rc->rc_abd, 2228 rc->rc_size); 2229 } 2230 2231 /* 2232 * Attempt a reconstruction and exit the outer loop on 2233 * success. 2234 */ 2235 code = vdev_raidz_reconstruct(rm, tgts, n); 2236 if (raidz_checksum_verify(zio) == 0) { 2237 atomic_inc_64(&raidz_corrected[code]); 2238 2239 for (i = 0; i < n; i++) { 2240 c = tgts[i]; 2241 rc = &rm->rm_col[c]; 2242 ASSERT(rc->rc_error == 0); 2243 if (rc->rc_tried) 2244 raidz_checksum_error(zio, rc, 2245 orig[i]); 2246 rc->rc_error = SET_ERROR(ECKSUM); 2247 } 2248 2249 ret = code; 2250 goto done; 2251 } 2252 2253 /* 2254 * Restore the original data. 2255 */ 2256 for (i = 0; i < n; i++) { 2257 c = tgts[i]; 2258 rc = &rm->rm_col[c]; 2259 abd_copy_from_buf(rc->rc_abd, orig[i], 2260 rc->rc_size); 2261 } 2262 2263 do { 2264 /* 2265 * Find the next valid column after the current 2266 * position.. 2267 */ 2268 for (next = tgts[current] + 1; 2269 next < rm->rm_cols && 2270 rm->rm_col[next].rc_error != 0; next++) 2271 continue; 2272 2273 ASSERT(next <= tgts[current + 1]); 2274 2275 /* 2276 * If that spot is available, we're done here. 2277 */ 2278 if (next != tgts[current + 1]) 2279 break; 2280 2281 /* 2282 * Otherwise, find the next valid column after 2283 * the previous position. 2284 */ 2285 for (c = tgts[current - 1] + 1; 2286 rm->rm_col[c].rc_error != 0; c++) 2287 continue; 2288 2289 tgts[current] = c; 2290 current++; 2291 2292 } while (current != n); 2293 } 2294 } 2295 n--; 2296 done: 2297 for (i = 0; i < n; i++) { 2298 zio_buf_free(orig[i], rm->rm_col[0].rc_size); 2299 } 2300 2301 return (ret); 2302 } 2303 2304 /* 2305 * Complete an IO operation on a RAIDZ VDev 2306 * 2307 * Outline: 2308 * - For write operations: 2309 * 1. Check for errors on the child IOs. 2310 * 2. Return, setting an error code if too few child VDevs were written 2311 * to reconstruct the data later. Note that partial writes are 2312 * considered successful if they can be reconstructed at all. 2313 * - For read operations: 2314 * 1. Check for errors on the child IOs. 2315 * 2. If data errors occurred: 2316 * a. Try to reassemble the data from the parity available. 2317 * b. If we haven't yet read the parity drives, read them now. 2318 * c. If all parity drives have been read but the data still doesn't 2319 * reassemble with a correct checksum, then try combinatorial 2320 * reconstruction. 2321 * d. If that doesn't work, return an error. 2322 * 3. If there were unexpected errors or this is a resilver operation, 2323 * rewrite the vdevs that had errors. 2324 */ 2325 static void 2326 vdev_raidz_io_done(zio_t *zio) 2327 { 2328 vdev_t *vd = zio->io_vd; 2329 vdev_t *cvd; 2330 raidz_map_t *rm = zio->io_vsd; 2331 raidz_col_t *rc; 2332 int unexpected_errors = 0; 2333 int parity_errors = 0; 2334 int parity_untried = 0; 2335 int data_errors = 0; 2336 int total_errors = 0; 2337 int n, c; 2338 int tgts[VDEV_RAIDZ_MAXPARITY]; 2339 int code; 2340 2341 ASSERT(zio->io_bp != NULL); /* XXX need to add code to enforce this */ 2342 2343 ASSERT(rm->rm_missingparity <= rm->rm_firstdatacol); 2344 ASSERT(rm->rm_missingdata <= rm->rm_cols - rm->rm_firstdatacol); 2345 2346 for (c = 0; c < rm->rm_cols; c++) { 2347 rc = &rm->rm_col[c]; 2348 2349 if (rc->rc_error) { 2350 ASSERT(rc->rc_error != ECKSUM); /* child has no bp */ 2351 2352 if (c < rm->rm_firstdatacol) 2353 parity_errors++; 2354 else 2355 data_errors++; 2356 2357 if (!rc->rc_skipped) 2358 unexpected_errors++; 2359 2360 total_errors++; 2361 } else if (c < rm->rm_firstdatacol && !rc->rc_tried) { 2362 parity_untried++; 2363 } 2364 } 2365 2366 if (zio->io_type == ZIO_TYPE_WRITE) { 2367 /* 2368 * XXX -- for now, treat partial writes as a success. 2369 * (If we couldn't write enough columns to reconstruct 2370 * the data, the I/O failed. Otherwise, good enough.) 2371 * 2372 * Now that we support write reallocation, it would be better 2373 * to treat partial failure as real failure unless there are 2374 * no non-degraded top-level vdevs left, and not update DTLs 2375 * if we intend to reallocate. 2376 */ 2377 /* XXPOLICY */ 2378 if (total_errors > rm->rm_firstdatacol) 2379 zio->io_error = vdev_raidz_worst_error(rm); 2380 2381 return; 2382 } 2383 2384 ASSERT(zio->io_type == ZIO_TYPE_READ); 2385 /* 2386 * There are three potential phases for a read: 2387 * 1. produce valid data from the columns read 2388 * 2. read all disks and try again 2389 * 3. perform combinatorial reconstruction 2390 * 2391 * Each phase is progressively both more expensive and less likely to 2392 * occur. If we encounter more errors than we can repair or all phases 2393 * fail, we have no choice but to return an error. 2394 */ 2395 2396 /* 2397 * If the number of errors we saw was correctable -- less than or equal 2398 * to the number of parity disks read -- attempt to produce data that 2399 * has a valid checksum. Naturally, this case applies in the absence of 2400 * any errors. 2401 */ 2402 if (total_errors <= rm->rm_firstdatacol - parity_untried) { 2403 if (data_errors == 0) { 2404 if (raidz_checksum_verify(zio) == 0) { 2405 /* 2406 * If we read parity information (unnecessarily 2407 * as it happens since no reconstruction was 2408 * needed) regenerate and verify the parity. 2409 * We also regenerate parity when resilvering 2410 * so we can write it out to the failed device 2411 * later. 2412 */ 2413 if (parity_errors + parity_untried < 2414 rm->rm_firstdatacol || 2415 (zio->io_flags & ZIO_FLAG_RESILVER)) { 2416 n = raidz_parity_verify(zio, rm); 2417 unexpected_errors += n; 2418 ASSERT(parity_errors + n <= 2419 rm->rm_firstdatacol); 2420 } 2421 goto done; 2422 } 2423 } else { 2424 /* 2425 * We either attempt to read all the parity columns or 2426 * none of them. If we didn't try to read parity, we 2427 * wouldn't be here in the correctable case. There must 2428 * also have been fewer parity errors than parity 2429 * columns or, again, we wouldn't be in this code path. 2430 */ 2431 ASSERT(parity_untried == 0); 2432 ASSERT(parity_errors < rm->rm_firstdatacol); 2433 2434 /* 2435 * Identify the data columns that reported an error. 2436 */ 2437 n = 0; 2438 for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { 2439 rc = &rm->rm_col[c]; 2440 if (rc->rc_error != 0) { 2441 ASSERT(n < VDEV_RAIDZ_MAXPARITY); 2442 tgts[n++] = c; 2443 } 2444 } 2445 2446 ASSERT(rm->rm_firstdatacol >= n); 2447 2448 code = vdev_raidz_reconstruct(rm, tgts, n); 2449 2450 if (raidz_checksum_verify(zio) == 0) { 2451 atomic_inc_64(&raidz_corrected[code]); 2452 2453 /* 2454 * If we read more parity disks than were used 2455 * for reconstruction, confirm that the other 2456 * parity disks produced correct data. This 2457 * routine is suboptimal in that it regenerates 2458 * the parity that we already used in addition 2459 * to the parity that we're attempting to 2460 * verify, but this should be a relatively 2461 * uncommon case, and can be optimized if it 2462 * becomes a problem. Note that we regenerate 2463 * parity when resilvering so we can write it 2464 * out to failed devices later. 2465 */ 2466 if (parity_errors < rm->rm_firstdatacol - n || 2467 (zio->io_flags & ZIO_FLAG_RESILVER)) { 2468 n = raidz_parity_verify(zio, rm); 2469 unexpected_errors += n; 2470 ASSERT(parity_errors + n <= 2471 rm->rm_firstdatacol); 2472 } 2473 2474 goto done; 2475 } 2476 } 2477 } 2478 2479 /* 2480 * This isn't a typical situation -- either we got a read error or 2481 * a child silently returned bad data. Read every block so we can 2482 * try again with as much data and parity as we can track down. If 2483 * we've already been through once before, all children will be marked 2484 * as tried so we'll proceed to combinatorial reconstruction. 2485 */ 2486 unexpected_errors = 1; 2487 rm->rm_missingdata = 0; 2488 rm->rm_missingparity = 0; 2489 2490 for (c = 0; c < rm->rm_cols; c++) { 2491 if (rm->rm_col[c].rc_tried) 2492 continue; 2493 2494 zio_vdev_io_redone(zio); 2495 do { 2496 rc = &rm->rm_col[c]; 2497 if (rc->rc_tried) 2498 continue; 2499 zio_nowait(zio_vdev_child_io(zio, NULL, 2500 vd->vdev_child[rc->rc_devidx], 2501 rc->rc_offset, rc->rc_abd, rc->rc_size, 2502 zio->io_type, zio->io_priority, 0, 2503 vdev_raidz_child_done, rc)); 2504 } while (++c < rm->rm_cols); 2505 2506 return; 2507 } 2508 2509 /* 2510 * At this point we've attempted to reconstruct the data given the 2511 * errors we detected, and we've attempted to read all columns. There 2512 * must, therefore, be one or more additional problems -- silent errors 2513 * resulting in invalid data rather than explicit I/O errors resulting 2514 * in absent data. We check if there is enough additional data to 2515 * possibly reconstruct the data and then perform combinatorial 2516 * reconstruction over all possible combinations. If that fails, 2517 * we're cooked. 2518 */ 2519 if (total_errors > rm->rm_firstdatacol) { 2520 zio->io_error = vdev_raidz_worst_error(rm); 2521 2522 } else if (total_errors < rm->rm_firstdatacol && 2523 (code = vdev_raidz_combrec(zio, total_errors, data_errors)) != 0) { 2524 /* 2525 * If we didn't use all the available parity for the 2526 * combinatorial reconstruction, verify that the remaining 2527 * parity is correct. 2528 */ 2529 if (code != (1 << rm->rm_firstdatacol) - 1) 2530 (void) raidz_parity_verify(zio, rm); 2531 } else { 2532 /* 2533 * We're here because either: 2534 * 2535 * total_errors == rm_first_datacol, or 2536 * vdev_raidz_combrec() failed 2537 * 2538 * In either case, there is enough bad data to prevent 2539 * reconstruction. 2540 * 2541 * Start checksum ereports for all children which haven't 2542 * failed, and the IO wasn't speculative. 2543 */ 2544 zio->io_error = SET_ERROR(ECKSUM); 2545 2546 if (!(zio->io_flags & ZIO_FLAG_SPECULATIVE)) { 2547 for (c = 0; c < rm->rm_cols; c++) { 2548 rc = &rm->rm_col[c]; 2549 if (rc->rc_error == 0) { 2550 zio_bad_cksum_t zbc; 2551 zbc.zbc_has_cksum = 0; 2552 zbc.zbc_injected = 2553 rm->rm_ecksuminjected; 2554 2555 zfs_ereport_start_checksum( 2556 zio->io_spa, 2557 vd->vdev_child[rc->rc_devidx], 2558 zio, rc->rc_offset, rc->rc_size, 2559 (void *)(uintptr_t)c, &zbc); 2560 } 2561 } 2562 } 2563 } 2564 2565 done: 2566 zio_checksum_verified(zio); 2567 2568 if (zio->io_error == 0 && spa_writeable(zio->io_spa) && 2569 (unexpected_errors || (zio->io_flags & ZIO_FLAG_RESILVER))) { 2570 /* 2571 * Use the good data we have in hand to repair damaged children. 2572 */ 2573 for (c = 0; c < rm->rm_cols; c++) { 2574 rc = &rm->rm_col[c]; 2575 cvd = vd->vdev_child[rc->rc_devidx]; 2576 2577 if (rc->rc_error == 0) 2578 continue; 2579 2580 zio_nowait(zio_vdev_child_io(zio, NULL, cvd, 2581 rc->rc_offset, rc->rc_abd, rc->rc_size, 2582 ZIO_TYPE_WRITE, ZIO_PRIORITY_ASYNC_WRITE, 2583 ZIO_FLAG_IO_REPAIR | (unexpected_errors ? 2584 ZIO_FLAG_SELF_HEAL : 0), NULL, NULL)); 2585 } 2586 } 2587 } 2588 2589 static void 2590 vdev_raidz_state_change(vdev_t *vd, int faulted, int degraded) 2591 { 2592 if (faulted > vd->vdev_nparity) 2593 vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, 2594 VDEV_AUX_NO_REPLICAS); 2595 else if (degraded + faulted != 0) 2596 vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED, VDEV_AUX_NONE); 2597 else 2598 vdev_set_state(vd, B_FALSE, VDEV_STATE_HEALTHY, VDEV_AUX_NONE); 2599 } 2600 2601 static void 2602 vdev_raidz_xlate(vdev_t *cvd, const range_seg_t *in, range_seg_t *res) 2603 { 2604 vdev_t *raidvd = cvd->vdev_parent; 2605 ASSERT(raidvd->vdev_ops == &vdev_raidz_ops); 2606 2607 uint64_t width = raidvd->vdev_children; 2608 uint64_t tgt_col = cvd->vdev_id; 2609 uint64_t ashift = raidvd->vdev_top->vdev_ashift; 2610 2611 /* make sure the offsets are block-aligned */ 2612 ASSERT0(in->rs_start % (1 << ashift)); 2613 ASSERT0(in->rs_end % (1 << ashift)); 2614 uint64_t b_start = in->rs_start >> ashift; 2615 uint64_t b_end = in->rs_end >> ashift; 2616 2617 uint64_t start_row = 0; 2618 if (b_start > tgt_col) /* avoid underflow */ 2619 start_row = ((b_start - tgt_col - 1) / width) + 1; 2620 2621 uint64_t end_row = 0; 2622 if (b_end > tgt_col) 2623 end_row = ((b_end - tgt_col - 1) / width) + 1; 2624 2625 res->rs_start = start_row << ashift; 2626 res->rs_end = end_row << ashift; 2627 2628 ASSERT3U(res->rs_start, <=, in->rs_start); 2629 ASSERT3U(res->rs_end - res->rs_start, <=, in->rs_end - in->rs_start); 2630 } 2631 2632 vdev_ops_t vdev_raidz_ops = { 2633 vdev_raidz_open, 2634 vdev_raidz_close, 2635 vdev_raidz_asize, 2636 vdev_raidz_io_start, 2637 vdev_raidz_io_done, 2638 vdev_raidz_state_change, 2639 NULL, 2640 NULL, 2641 NULL, 2642 vdev_raidz_xlate, 2643 VDEV_TYPE_RAIDZ, /* name of this vdev type */ 2644 B_FALSE /* not a leaf vdev */ 2645 }; 2646