Lines Matching refs:rm

523 vdev_raidz_generate_parity_p(raidz_map_t *rm)  in vdev_raidz_generate_parity_p()  argument
528 pcount = rm->rm_col[VDEV_RAIDZ_P].rc_size / sizeof (src[0]); in vdev_raidz_generate_parity_p()
530 for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { in vdev_raidz_generate_parity_p()
531 src = rm->rm_col[c].rc_data; in vdev_raidz_generate_parity_p()
532 p = rm->rm_col[VDEV_RAIDZ_P].rc_data; in vdev_raidz_generate_parity_p()
533 ccount = rm->rm_col[c].rc_size / sizeof (src[0]); in vdev_raidz_generate_parity_p()
535 if (c == rm->rm_firstdatacol) { in vdev_raidz_generate_parity_p()
550 vdev_raidz_generate_parity_pq(raidz_map_t *rm) in vdev_raidz_generate_parity_pq() argument
555 pcnt = rm->rm_col[VDEV_RAIDZ_P].rc_size / sizeof (src[0]); in vdev_raidz_generate_parity_pq()
556 ASSERT(rm->rm_col[VDEV_RAIDZ_P].rc_size == in vdev_raidz_generate_parity_pq()
557 rm->rm_col[VDEV_RAIDZ_Q].rc_size); in vdev_raidz_generate_parity_pq()
559 for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { in vdev_raidz_generate_parity_pq()
560 src = rm->rm_col[c].rc_data; in vdev_raidz_generate_parity_pq()
561 p = rm->rm_col[VDEV_RAIDZ_P].rc_data; in vdev_raidz_generate_parity_pq()
562 q = rm->rm_col[VDEV_RAIDZ_Q].rc_data; in vdev_raidz_generate_parity_pq()
564 ccnt = rm->rm_col[c].rc_size / sizeof (src[0]); in vdev_raidz_generate_parity_pq()
566 if (c == rm->rm_firstdatacol) { in vdev_raidz_generate_parity_pq()
602 vdev_raidz_generate_parity_pqr(raidz_map_t *rm) in vdev_raidz_generate_parity_pqr() argument
607 pcnt = rm->rm_col[VDEV_RAIDZ_P].rc_size / sizeof (src[0]); in vdev_raidz_generate_parity_pqr()
608 ASSERT(rm->rm_col[VDEV_RAIDZ_P].rc_size == in vdev_raidz_generate_parity_pqr()
609 rm->rm_col[VDEV_RAIDZ_Q].rc_size); in vdev_raidz_generate_parity_pqr()
610 ASSERT(rm->rm_col[VDEV_RAIDZ_P].rc_size == in vdev_raidz_generate_parity_pqr()
611 rm->rm_col[VDEV_RAIDZ_R].rc_size); in vdev_raidz_generate_parity_pqr()
613 for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { in vdev_raidz_generate_parity_pqr()
614 src = rm->rm_col[c].rc_data; in vdev_raidz_generate_parity_pqr()
615 p = rm->rm_col[VDEV_RAIDZ_P].rc_data; in vdev_raidz_generate_parity_pqr()
616 q = rm->rm_col[VDEV_RAIDZ_Q].rc_data; in vdev_raidz_generate_parity_pqr()
617 r = rm->rm_col[VDEV_RAIDZ_R].rc_data; in vdev_raidz_generate_parity_pqr()
619 ccnt = rm->rm_col[c].rc_size / sizeof (src[0]); in vdev_raidz_generate_parity_pqr()
621 if (c == rm->rm_firstdatacol) { in vdev_raidz_generate_parity_pqr()
667 vdev_raidz_generate_parity(raidz_map_t *rm) in vdev_raidz_generate_parity() argument
669 switch (rm->rm_firstdatacol) { in vdev_raidz_generate_parity()
671 vdev_raidz_generate_parity_p(rm); in vdev_raidz_generate_parity()
674 vdev_raidz_generate_parity_pq(rm); in vdev_raidz_generate_parity()
677 vdev_raidz_generate_parity_pqr(rm); in vdev_raidz_generate_parity()
839 vdev_raidz_matrix_init(raidz_map_t *rm __unused, int n, int nmap, int *map, in vdev_raidz_matrix_init()
845 ASSERT(n == rm->rm_cols - rm->rm_firstdatacol); in vdev_raidz_matrix_init()
869 vdev_raidz_matrix_invert(raidz_map_t *rm, int n, int nmissing, int *missing, in vdev_raidz_matrix_invert() argument
881 ASSERT3S(used[i], <, rm->rm_firstdatacol); in vdev_raidz_matrix_invert()
884 ASSERT3S(used[i], >=, rm->rm_firstdatacol); in vdev_raidz_matrix_invert()
901 ASSERT3U(used[j], >=, rm->rm_firstdatacol); in vdev_raidz_matrix_invert()
902 jj = used[j] - rm->rm_firstdatacol; in vdev_raidz_matrix_invert()
963 vdev_raidz_matrix_reconstruct(raidz_map_t *rm, int n, int nmissing, in vdev_raidz_matrix_reconstruct() argument
999 ASSERT3U(c, <, rm->rm_cols); in vdev_raidz_matrix_reconstruct()
1001 src = rm->rm_col[c].rc_data; in vdev_raidz_matrix_reconstruct()
1002 ccount = rm->rm_col[c].rc_size; in vdev_raidz_matrix_reconstruct()
1004 cc = missing[j] + rm->rm_firstdatacol; in vdev_raidz_matrix_reconstruct()
1005 ASSERT3U(cc, >=, rm->rm_firstdatacol); in vdev_raidz_matrix_reconstruct()
1006 ASSERT3U(cc, <, rm->rm_cols); in vdev_raidz_matrix_reconstruct()
1009 dst[j] = rm->rm_col[cc].rc_data; in vdev_raidz_matrix_reconstruct()
1010 dcount[j] = rm->rm_col[cc].rc_size; in vdev_raidz_matrix_reconstruct()
1013 ASSERT(ccount >= rm->rm_col[missing[0]].rc_size || i > 0); in vdev_raidz_matrix_reconstruct()
1043 vdev_raidz_reconstruct_general(raidz_map_t *rm, int *tgts, int ntgts) in vdev_raidz_reconstruct_general() argument
1060 n = rm->rm_cols - rm->rm_firstdatacol; in vdev_raidz_reconstruct_general()
1067 if (tgts[t] >= rm->rm_firstdatacol) { in vdev_raidz_reconstruct_general()
1069 tgts[t] - rm->rm_firstdatacol; in vdev_raidz_reconstruct_general()
1079 ASSERT(c < rm->rm_firstdatacol); in vdev_raidz_reconstruct_general()
1118 for (tt = 0, c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { in vdev_raidz_reconstruct_general()
1120 c == missing_rows[tt] + rm->rm_firstdatacol) { in vdev_raidz_reconstruct_general()
1133 vdev_raidz_matrix_init(rm, n, nmissing_rows, parity_map, rows); in vdev_raidz_reconstruct_general()
1138 vdev_raidz_matrix_invert(rm, n, nmissing_rows, missing_rows, rows, in vdev_raidz_reconstruct_general()
1144 vdev_raidz_matrix_reconstruct(rm, n, nmissing_rows, missing_rows, in vdev_raidz_reconstruct_general()
1153 vdev_raidz_reconstruct(raidz_map_t *rm, int *t, int nt) in vdev_raidz_reconstruct() argument
1168 nbadparity = rm->rm_firstdatacol; in vdev_raidz_reconstruct()
1169 nbaddata = rm->rm_cols - nbadparity; in vdev_raidz_reconstruct()
1171 for (i = 0, c = 0; c < rm->rm_cols; c++) { in vdev_raidz_reconstruct()
1175 } else if (rm->rm_col[c].rc_error != 0) { in vdev_raidz_reconstruct()
1177 } else if (c >= rm->rm_firstdatacol) { in vdev_raidz_reconstruct()
1188 code = vdev_raidz_reconstruct_general(rm, tgts, ntgts); in vdev_raidz_reconstruct()
1198 raidz_map_t *rm; in vdev_raidz_map_alloc() local
1220 rm = malloc(offsetof(raidz_map_t, rm_col[scols])); in vdev_raidz_map_alloc()
1221 if (rm == NULL) in vdev_raidz_map_alloc()
1222 return (rm); in vdev_raidz_map_alloc()
1224 rm->rm_cols = acols; in vdev_raidz_map_alloc()
1225 rm->rm_scols = scols; in vdev_raidz_map_alloc()
1226 rm->rm_bigcols = bc; in vdev_raidz_map_alloc()
1227 rm->rm_skipstart = bc; in vdev_raidz_map_alloc()
1228 rm->rm_missingdata = 0; in vdev_raidz_map_alloc()
1229 rm->rm_missingparity = 0; in vdev_raidz_map_alloc()
1230 rm->rm_firstdatacol = nparity; in vdev_raidz_map_alloc()
1231 rm->rm_reports = 0; in vdev_raidz_map_alloc()
1232 rm->rm_freed = 0; in vdev_raidz_map_alloc()
1233 rm->rm_ecksuminjected = 0; in vdev_raidz_map_alloc()
1244 rm->rm_col[c].rc_devidx = col; in vdev_raidz_map_alloc()
1245 rm->rm_col[c].rc_offset = coff; in vdev_raidz_map_alloc()
1246 rm->rm_col[c].rc_data = NULL; in vdev_raidz_map_alloc()
1247 rm->rm_col[c].rc_error = 0; in vdev_raidz_map_alloc()
1248 rm->rm_col[c].rc_tried = 0; in vdev_raidz_map_alloc()
1249 rm->rm_col[c].rc_skipped = 0; in vdev_raidz_map_alloc()
1252 rm->rm_col[c].rc_size = 0; in vdev_raidz_map_alloc()
1254 rm->rm_col[c].rc_size = (q + 1) << unit_shift; in vdev_raidz_map_alloc()
1256 rm->rm_col[c].rc_size = q << unit_shift; in vdev_raidz_map_alloc()
1258 asize += rm->rm_col[c].rc_size; in vdev_raidz_map_alloc()
1262 rm->rm_asize = roundup(asize, (nparity + 1) << unit_shift); in vdev_raidz_map_alloc()
1263 rm->rm_nskip = roundup(tot, nparity + 1) - tot; in vdev_raidz_map_alloc()
1264 ASSERT3U(rm->rm_asize - asize, ==, rm->rm_nskip << unit_shift); in vdev_raidz_map_alloc()
1265 ASSERT3U(rm->rm_nskip, <=, nparity); in vdev_raidz_map_alloc()
1267 for (c = 0; c < rm->rm_firstdatacol; c++) { in vdev_raidz_map_alloc()
1268 rm->rm_col[c].rc_data = malloc(rm->rm_col[c].rc_size); in vdev_raidz_map_alloc()
1269 if (rm->rm_col[c].rc_data == NULL) { in vdev_raidz_map_alloc()
1272 free(rm->rm_col[--c].rc_data); in vdev_raidz_map_alloc()
1273 free(rm); in vdev_raidz_map_alloc()
1278 rm->rm_col[c].rc_data = data; in vdev_raidz_map_alloc()
1281 rm->rm_col[c].rc_data = (char *)rm->rm_col[c - 1].rc_data + in vdev_raidz_map_alloc()
1282 rm->rm_col[c - 1].rc_size; in vdev_raidz_map_alloc()
1304 ASSERT(rm->rm_cols >= 2); in vdev_raidz_map_alloc()
1305 ASSERT(rm->rm_col[0].rc_size == rm->rm_col[1].rc_size); in vdev_raidz_map_alloc()
1307 if (rm->rm_firstdatacol == 1 && (offset & (1ULL << 20))) { in vdev_raidz_map_alloc()
1308 devidx = rm->rm_col[0].rc_devidx; in vdev_raidz_map_alloc()
1309 o = rm->rm_col[0].rc_offset; in vdev_raidz_map_alloc()
1310 rm->rm_col[0].rc_devidx = rm->rm_col[1].rc_devidx; in vdev_raidz_map_alloc()
1311 rm->rm_col[0].rc_offset = rm->rm_col[1].rc_offset; in vdev_raidz_map_alloc()
1312 rm->rm_col[1].rc_devidx = devidx; in vdev_raidz_map_alloc()
1313 rm->rm_col[1].rc_offset = o; in vdev_raidz_map_alloc()
1315 if (rm->rm_skipstart == 0) in vdev_raidz_map_alloc()
1316 rm->rm_skipstart = 1; in vdev_raidz_map_alloc()
1319 return (rm); in vdev_raidz_map_alloc()
1323 vdev_raidz_map_free(raidz_map_t *rm) in vdev_raidz_map_free() argument
1327 for (c = rm->rm_firstdatacol - 1; c >= 0; c--) in vdev_raidz_map_free()
1328 free(rm->rm_col[c].rc_data); in vdev_raidz_map_free()
1330 free(rm); in vdev_raidz_map_free()
1365 raidz_parity_verify(raidz_map_t *rm) in raidz_parity_verify() argument
1371 for (c = 0; c < rm->rm_firstdatacol; c++) { in raidz_parity_verify()
1372 rc = &rm->rm_col[c]; in raidz_parity_verify()
1383 vdev_raidz_generate_parity(rm); in raidz_parity_verify()
1385 for (c = rm->rm_firstdatacol - 1; c >= 0; c--) { in raidz_parity_verify()
1386 rc = &rm->rm_col[c]; in raidz_parity_verify()
1409 vdev_raidz_combrec(const spa_t *spa, raidz_map_t *rm, const blkptr_t *bp, in vdev_raidz_combrec() argument
1420 ASSERT(total_errors < rm->rm_firstdatacol); in vdev_raidz_combrec()
1427 for (n = 1; n <= rm->rm_firstdatacol - total_errors; n++) { in vdev_raidz_combrec()
1439 c < rm->rm_firstdatacol) { in vdev_raidz_combrec()
1440 c = rm->rm_firstdatacol; in vdev_raidz_combrec()
1443 while (rm->rm_col[c].rc_error != 0) { in vdev_raidz_combrec()
1445 ASSERT3S(c, <, rm->rm_cols); in vdev_raidz_combrec()
1454 tgts[n] = rm->rm_cols; in vdev_raidz_combrec()
1463 orig[n - 1] = malloc(rm->rm_col[0].rc_size); in vdev_raidz_combrec()
1484 ASSERT3S(c, <, rm->rm_cols); in vdev_raidz_combrec()
1485 rc = &rm->rm_col[c]; in vdev_raidz_combrec()
1493 code = vdev_raidz_reconstruct(rm, tgts, n); in vdev_raidz_combrec()
1497 rc = &rm->rm_col[c]; in vdev_raidz_combrec()
1511 rc = &rm->rm_col[c]; in vdev_raidz_combrec()
1521 next < rm->rm_cols && in vdev_raidz_combrec()
1522 rm->rm_col[next].rc_error != 0; next++) in vdev_raidz_combrec()
1538 rm->rm_col[c].rc_error != 0; c++) in vdev_raidz_combrec()
1562 raidz_map_t *rm; in vdev_raidz_read() local
1577 rm = vdev_raidz_map_alloc(data, offset, bytes, tvd->v_ashift, in vdev_raidz_read()
1579 if (rm == NULL) in vdev_raidz_read()
1586 for (c = rm->rm_cols - 1; c >= 0; c--) { in vdev_raidz_read()
1587 rc = &rm->rm_col[c]; in vdev_raidz_read()
1590 if (c >= rm->rm_firstdatacol) in vdev_raidz_read()
1591 rm->rm_missingdata++; in vdev_raidz_read()
1593 rm->rm_missingparity++; in vdev_raidz_read()
1601 if (c >= rm->rm_firstdatacol) in vdev_raidz_read()
1602 rm->rm_missingdata++; in vdev_raidz_read()
1604 rm->rm_missingparity++; in vdev_raidz_read()
1610 if (c >= rm->rm_firstdatacol || rm->rm_missingdata > 0) { in vdev_raidz_read()
1625 ASSERT(rm->rm_missingparity <= rm->rm_firstdatacol); in vdev_raidz_read()
1626 ASSERT(rm->rm_missingdata <= rm->rm_cols - rm->rm_firstdatacol); in vdev_raidz_read()
1628 for (c = 0; c < rm->rm_cols; c++) { in vdev_raidz_read()
1629 rc = &rm->rm_col[c]; in vdev_raidz_read()
1634 if (c < rm->rm_firstdatacol) in vdev_raidz_read()
1643 } else if (c < rm->rm_firstdatacol && !rc->rc_tried) { in vdev_raidz_read()
1665 if (total_errors <= rm->rm_firstdatacol - parity_untried) { in vdev_raidz_read()
1680 rm->rm_firstdatacol) { in vdev_raidz_read()
1681 n = raidz_parity_verify(rm); in vdev_raidz_read()
1684 rm->rm_firstdatacol); in vdev_raidz_read()
1697 ASSERT(parity_errors < rm->rm_firstdatacol); in vdev_raidz_read()
1703 for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) { in vdev_raidz_read()
1704 rc = &rm->rm_col[c]; in vdev_raidz_read()
1711 ASSERT(rm->rm_firstdatacol >= n); in vdev_raidz_read()
1713 code = vdev_raidz_reconstruct(rm, tgts, n); in vdev_raidz_read()
1730 if (parity_errors < rm->rm_firstdatacol - n) { in vdev_raidz_read()
1731 n = raidz_parity_verify(rm); in vdev_raidz_read()
1734 rm->rm_firstdatacol); in vdev_raidz_read()
1751 rm->rm_missingdata = 0; in vdev_raidz_read()
1752 rm->rm_missingparity = 0; in vdev_raidz_read()
1755 for (c = 0; c < rm->rm_cols; c++) { in vdev_raidz_read()
1756 rc = &rm->rm_col[c]; in vdev_raidz_read()
1787 if (total_errors > rm->rm_firstdatacol) { in vdev_raidz_read()
1789 } else if (total_errors < rm->rm_firstdatacol && in vdev_raidz_read()
1790 (code = vdev_raidz_combrec(vd->v_spa, rm, bp, data, offset, bytes, in vdev_raidz_read()
1797 if (code != (1 << rm->rm_firstdatacol) - 1) in vdev_raidz_read()
1798 (void) raidz_parity_verify(rm); in vdev_raidz_read()
1816 vdev_raidz_map_free(rm); in vdev_raidz_read()