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