Skip to content

Instantly share code, notes, and snippets.

@tuxoko
Created October 23, 2015 23:43
Show Gist options
  • Save tuxoko/35f1a682308674f175a4 to your computer and use it in GitHub Desktop.
Save tuxoko/35f1a682308674f175a4 to your computer and use it in GitHub Desktop.
diff --git a/module/zfs/vdev_raidz.c b/module/zfs/vdev_raidz.c
index fcb2e2f..4604cf7 100644
--- a/module/zfs/vdev_raidz.c
+++ b/module/zfs/vdev_raidz.c
@@ -618,12 +618,14 @@ vdev_raidz_p_func(const void *buf, uint64_t size, void *private)
{
struct pqr_struct *pqr = private;
const uint64_t *src = buf;
+ uint64_t *p = pqr->p;
int i, cnt = size / sizeof (src[0]);
ASSERT(pqr->p && !pqr->q && !pqr->r);
- for (i = 0; i < cnt; i++, src++, pqr->p++)
- *pqr->p ^= *src;
+ for (i = 0; i < cnt; i++, src++, p++)
+ *p ^= *src;
+ pqr->p = p;
return (0);
}
@@ -632,16 +634,19 @@ vdev_raidz_pq_func(const void *buf, uint64_t size, void *private)
{
struct pqr_struct *pqr = private;
const uint64_t *src = buf;
+ uint64_t *p = pqr->p, *q = pqr->q;
uint64_t mask;
int i, cnt = size / sizeof (src[0]);
ASSERT(pqr->p && pqr->q && !pqr->r);
- for (i = 0; i < cnt; i++, src++, pqr->p++, pqr->q++) {
- *pqr->p ^= *src;
- VDEV_RAIDZ_64MUL_2(*pqr->q, mask);
- *pqr->q ^= *src;
+ for (i = 0; i < cnt; i++, src++, p++, q++) {
+ *p ^= *src;
+ VDEV_RAIDZ_64MUL_2(*q, mask);
+ *q ^= *src;
}
+ pqr->p = p;
+ pqr->q = q;
return (0);
}
@@ -650,18 +655,22 @@ vdev_raidz_pqr_func(const void *buf, uint64_t size, void *private)
{
struct pqr_struct *pqr = private;
const uint64_t *src = buf;
+ uint64_t *p = pqr->p, *q = pqr->q, *r = pqr->r;
uint64_t mask;
int i, cnt = size / sizeof (src[0]);
ASSERT(pqr->p && pqr->q && pqr->r);
- for (i = 0; i < cnt; i++, src++, pqr->p++, pqr->q++, pqr->r++) {
- *pqr->p ^= *src;
- VDEV_RAIDZ_64MUL_2(*pqr->q, mask);
- *pqr->q ^= *src;
- VDEV_RAIDZ_64MUL_4(*pqr->r, mask);
- *pqr->r ^= *src;
+ for (i = 0; i < cnt; i++, src++, p++, q++, r++) {
+ *p ^= *src;
+ VDEV_RAIDZ_64MUL_2(*q, mask);
+ *q ^= *src;
+ VDEV_RAIDZ_64MUL_4(*r, mask);
+ *r ^= *src;
}
+ pqr->p = p;
+ pqr->q = q;
+ pqr->r = r;
return (0);
}
@@ -850,15 +859,17 @@ vdev_raidz_reconst_q_post_func(void *buf, uint64_t size, void *private)
{
struct reconst_q_struct *rq = private;
uint64_t *dst = buf;
+ uint64_t *q = rq->q;
uint8_t *b;
int i, j, cnt = size / sizeof (dst[0]);
- for (i = 0; i < cnt; i++, dst++, rq->q++) {
- *dst ^= *rq->q;
+ for (i = 0; i < cnt; i++, dst++, q++) {
+ *dst ^= *q;
for (j = 0, b = (uint8_t *)dst; j < 8; j++, b++) {
*b = vdev_raidz_exp2(*b, rq->exp);
}
}
+ rq->q = q;
return (0);
}
@@ -877,18 +888,22 @@ vdev_raidz_reconst_pq_func(void *xbuf, void *ybuf, uint64_t xsize,
{
struct reconst_pq_struct *rpq = private;
uint8_t *xd = xbuf, *yd = ybuf;
+ uint8_t *p = rpq->p, *q = rpq->q, *pxy = rpq->pxy, *qxy = rpq->qxy;
int i;
ASSERT(xsize >= ysize);
- for (i = 0; i < xsize; i++, rpq->p++, rpq->q++, rpq->pxy++, rpq->qxy++,
- xd++, yd++) {
- *xd = vdev_raidz_exp2(*rpq->p ^ *rpq->pxy, rpq->aexp) ^
- vdev_raidz_exp2(*rpq->q ^ *rpq->qxy, rpq->bexp);
+ for (i = 0; i < xsize; i++, xd++, yd++, p++, q++, pxy++, qxy++) {
+ *xd = vdev_raidz_exp2(*p ^ *pxy, rpq->aexp) ^
+ vdev_raidz_exp2(*q ^ *qxy, rpq->bexp);
if (i < ysize)
- *yd = *rpq->p ^ *rpq->pxy ^ *xd;
+ *yd = *p ^ *pxy ^ *xd;
}
+ rpq->p = p;
+ rpq->q = q;
+ rpq->pxy = pxy;
+ rpq->qxy = qxy;
return (0);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment