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