git://git.camperquake.de
/
zfs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add snapdev=[hidden|visible] dataset property
[zfs.git]
/
module
/
zfs
/
vdev_raidz.c
diff --git
a/module/zfs/vdev_raidz.c
b/module/zfs/vdev_raidz.c
index
af2de40
..
cb806c5
100644
(file)
--- 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) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012 by Delphix. All rights reserved.
*/
#include <sys/zfs_context.h>
*/
#include <sys/zfs_context.h>
@@
-456,7
+457,7
@@
vdev_raidz_map_alloc(zio_t *zio, uint64_t unit_shift, uint64_t dcols,
ASSERT3U(acols, <=, scols);
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;
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];
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;
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;
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;
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;
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
}
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;
{
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;
}
*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;
*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;
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;
{
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;
if (ret != 0 && zbc.zbc_injected != 0)
rm->rm_ecksuminjected = 1;
@@
-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];
void *orig[VDEV_RAIDZ_MAXPARITY];
int tstore[VDEV_RAIDZ_MAXPARITY + 2];
int *tgts = &tstore[1];
- int curr
ent
, next, i, c, n;
+ int curr, next, i, c, n;
int code, ret = 0;
ASSERT(total_errors < rm->rm_firstdatacol);
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);
orig[n - 1] = zio_buf_alloc(rm->rm_col[0].rc_size);
- curr
ent
= 0;
- next = tgts[curr
ent
];
+ curr = 0;
+ next = tgts[curr];
- while (curr
ent
!= n) {
- tgts[curr
ent
] = next;
- curr
ent
= 0;
+ while (curr != n) {
+ tgts[curr] = next;
+ curr = 0;
/*
* Save off the original data that we're going to
/*
* 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 {
/*
do {
/*
- * Find the next valid column after the curr
ent
+ * Find the next valid column after the curr
* position..
*/
* position..
*/
- for (next = tgts[curr
ent
] + 1;
+ for (next = tgts[curr] + 1;
next < rm->rm_cols &&
rm->rm_col[next].rc_error != 0; next++)
continue;
next < rm->rm_cols &&
rm->rm_col[next].rc_error != 0; next++)
continue;
- ASSERT(next <= tgts[curr
ent
+ 1]);
+ ASSERT(next <= tgts[curr + 1]);
/*
* If that spot is available, we're done here.
*/
/*
* If that spot is available, we're done here.
*/
- if (next != tgts[curr
ent
+ 1])
+ if (next != tgts[curr + 1])
break;
/*
* Otherwise, find the next valid column after
* the previous position.
*/
break;
/*
* Otherwise, find the next valid column after
* the previous position.
*/
- for (c = tgts[curr
ent
- 1] + 1;
+ for (c = tgts[curr - 1] + 1;
rm->rm_col[c].rc_error != 0; c++)
continue;
rm->rm_col[c].rc_error != 0; c++)
continue;
- tgts[curr
ent
] = c;
- curr
ent
++;
+ tgts[curr] = c;
+ curr++;
- } while (curr
ent
!= n);
+ } while (curr != n);
}
}
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;
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;
int unexpected_errors = 0;
int parity_errors = 0;
int parity_untried = 0;