X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Fvdev_raidz.c;h=cb806c5098bacbaac9e067530e3609df2c377890;hb=1bd201e70d57464fd26bf9089ea4b44fd49e4f2d;hp=526385e01119d0bd98877ffca31b8657871f8182;hpb=c5b3a7bbcc321846bb15ff73c6fd6f1c483b6aa6;p=zfs.git diff --git a/module/zfs/vdev_raidz.c b/module/zfs/vdev_raidz.c index 526385e..cb806c5 100644 --- a/module/zfs/vdev_raidz.c +++ b/module/zfs/vdev_raidz.c @@ -21,6 +21,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include @@ -456,7 +457,7 @@ vdev_raidz_map_alloc(zio_t *zio, uint64_t unit_shift, uint64_t dcols, ASSERT3U(acols, <=, scols); - rm = kmem_alloc(offsetof(raidz_map_t, rm_col[scols]), KM_SLEEP); + rm = kmem_alloc(offsetof(raidz_map_t, rm_col[scols]), KM_PUSHPAGE); rm->rm_cols = acols; rm->rm_scols = scols; @@ -1189,14 +1190,14 @@ vdev_raidz_matrix_reconstruct(raidz_map_t *rm, int n, int nmissing, uint64_t ccount; uint8_t *dst[VDEV_RAIDZ_MAXPARITY]; uint64_t dcount[VDEV_RAIDZ_MAXPARITY]; - uint8_t log, val; + uint8_t log = 0, val; int ll; uint8_t *invlog[VDEV_RAIDZ_MAXPARITY]; uint8_t *p, *pp; size_t psize; psize = sizeof (invlog[0][0]) * n * nmissing; - p = kmem_alloc(psize, KM_SLEEP); + p = kmem_alloc(psize, KM_PUSHPAGE); for (pp = p, i = 0; i < nmissing; i++) { invlog[i] = pp; @@ -1313,7 +1314,7 @@ vdev_raidz_reconstruct_general(raidz_map_t *rm, int *tgts, int ntgts) psize = (sizeof (rows[0][0]) + sizeof (invrows[0][0])) * nmissing_rows * n + sizeof (used[0]) * n; - p = kmem_alloc(psize, KM_SLEEP); + p = kmem_alloc(psize, KM_PUSHPAGE); for (pp = p, i = 0; i < nmissing_rows; i++) { rows[i] = pp; @@ -1441,7 +1442,8 @@ vdev_raidz_reconstruct(raidz_map_t *rm, int *t, int nt) } static int -vdev_raidz_open(vdev_t *vd, uint64_t *asize, uint64_t *ashift) +vdev_raidz_open(vdev_t *vd, uint64_t *asize, uint64_t *max_asize, + uint64_t *ashift) { vdev_t *cvd; uint64_t nparity = vd->vdev_nparity; @@ -1469,10 +1471,12 @@ vdev_raidz_open(vdev_t *vd, uint64_t *asize, uint64_t *ashift) } *asize = MIN(*asize - 1, cvd->vdev_asize - 1) + 1; + *max_asize = MIN(*max_asize - 1, cvd->vdev_max_asize - 1) + 1; *ashift = MAX(*ashift, cvd->vdev_ashift); } *asize *= vd->vdev_children; + *max_asize *= vd->vdev_children; if (numerrors > nparity) { vd->vdev_stat.vs_aux = VDEV_AUX_NO_REPLICAS; @@ -1638,8 +1642,11 @@ raidz_checksum_verify(zio_t *zio) { zio_bad_cksum_t zbc; raidz_map_t *rm = zio->io_vsd; + int ret; - int ret = zio_checksum_error(zio, &zbc); + bzero(&zbc, sizeof (zio_bad_cksum_t)); + + ret = zio_checksum_error(zio, &zbc); if (ret != 0 && zbc.zbc_injected != 0) rm->rm_ecksuminjected = 1; @@ -1692,9 +1699,9 @@ static uint64_t raidz_corrected[1 << VDEV_RAIDZ_MAXPARITY]; static int vdev_raidz_worst_error(raidz_map_t *rm) { - int error = 0; + int c, error = 0; - for (int c = 0; c < rm->rm_cols; c++) + for (c = 0; c < rm->rm_cols; c++) error = zio_worst_error(error, rm->rm_col[c].rc_error); return (error); @@ -1716,7 +1723,7 @@ vdev_raidz_combrec(zio_t *zio, int total_errors, int data_errors) void *orig[VDEV_RAIDZ_MAXPARITY]; int tstore[VDEV_RAIDZ_MAXPARITY + 2]; int *tgts = &tstore[1]; - int current, next, i, c, n; + int curr, next, i, c, n; int code, ret = 0; ASSERT(total_errors < rm->rm_firstdatacol); @@ -1764,12 +1771,12 @@ vdev_raidz_combrec(zio_t *zio, int total_errors, int data_errors) orig[n - 1] = zio_buf_alloc(rm->rm_col[0].rc_size); - current = 0; - next = tgts[current]; + curr = 0; + next = tgts[curr]; - while (current != n) { - tgts[current] = next; - current = 0; + while (curr != n) { + tgts[curr] = next; + curr = 0; /* * Save off the original data that we're going to @@ -1817,34 +1824,34 @@ vdev_raidz_combrec(zio_t *zio, int total_errors, int data_errors) do { /* - * Find the next valid column after the current + * Find the next valid column after the curr * position.. */ - for (next = tgts[current] + 1; + for (next = tgts[curr] + 1; next < rm->rm_cols && rm->rm_col[next].rc_error != 0; next++) continue; - ASSERT(next <= tgts[current + 1]); + ASSERT(next <= tgts[curr + 1]); /* * If that spot is available, we're done here. */ - if (next != tgts[current + 1]) + if (next != tgts[curr + 1]) break; /* * Otherwise, find the next valid column after * the previous position. */ - for (c = tgts[current - 1] + 1; + for (c = tgts[curr - 1] + 1; rm->rm_col[c].rc_error != 0; c++) continue; - tgts[current] = c; - current++; + tgts[curr] = c; + curr++; - } while (current != n); + } while (curr != n); } } n--; @@ -1862,7 +1869,7 @@ vdev_raidz_io_done(zio_t *zio) vdev_t *vd = zio->io_vd; vdev_t *cvd; raidz_map_t *rm = zio->io_vsd; - raidz_col_t *rc; + raidz_col_t *rc = NULL; int unexpected_errors = 0; int parity_errors = 0; int parity_untried = 0;