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