Created
October 23, 2015 23:43
-
-
Save tuxoko/35f1a682308674f175a4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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