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
ef20542
..
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;
@@
-1196,7
+1197,7
@@
vdev_raidz_matrix_reconstruct(raidz_map_t *rm, int n, int nmissing,
size_t psize;
psize = sizeof (invlog[0][0]) * n * nmissing;
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;
@@
-1719,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);
@@
-1767,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
@@
-1820,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--;