Since there are multiple places tries to decode the whole object, it is nice to
have a helper function to do it.

Signed-off-by: Liu Yuan <[email protected]>
---
 dog/vdi.c        |   31 +++++++++++--------------------
 include/fec.h    |    2 ++
 lib/fec.c        |   16 ++++++++++++++++
 sheep/recovery.c |   13 +++----------
 4 files changed, 32 insertions(+), 30 deletions(-)

diff --git a/dog/vdi.c b/dog/vdi.c
index 4362f13..e6d2bdb 100644
--- a/dog/vdi.c
+++ b/dog/vdi.c
@@ -1581,16 +1581,11 @@ static void check_erasure_object(struct vdi_check_info 
*info)
                        idx[i] = i;
 
                for (k = 0; k < p; k++) {
-                       for (i = 0; i < SD_EC_NR_STRIPE_PER_OBJECT; i++) {
-                               const uint8_t *ds[d];
-                               uint8_t out[strip_size];
-
-                               for (j = 0; j < d; j++)
-                                       ds[j] = info->vcw[j].buf + strip_size
-                                               * i;
-                               ec_decode(ctx, ds, idx, out, d + k);
-                               memcpy(obj + strip_size * i, out, strip_size);
-                       }
+                       uint8_t *ds[d];
+                       for (j = 0; j < d; j++)
+                               ds[j] = info->vcw[j].buf;
+                       ec_decode_buffer(ctx, ds, idx, obj, d + k, strip_size,
+                                        SD_EC_NR_STRIPE_PER_OBJECT);
                        if (memcmp(obj, info->vcw[d + k].buf, len) != 0) {
                                /* TODO repair the inconsistency */
                                sd_err("object %"PRIx64" is inconsistent", oid);
@@ -1603,17 +1598,13 @@ static void check_erasure_object(struct vdi_check_info 
*info)
                goto out;
        } else {
                for (k = 0; k < j; k++) {
-                       int m = miss_idx[k], n;
-
-                       for (i = 0; i < SD_EC_NR_STRIPE_PER_OBJECT; i++) {
-                               const uint8_t *ds[d];
-                               uint8_t out[strip_size];
+                       int m = miss_idx[k];
+                       uint8_t *ds[d];
 
-                               for (n = 0; n < d; n++)
-                                       ds[n] = input[n] + strip_size * i;
-                               ec_decode(ctx, ds, input_idx, out, m);
-                               memcpy(obj + strip_size * i, out, strip_size);
-                       }
+                       for (i = 0; i < d; i++)
+                               ds[i] = input[i];
+                       ec_decode_buffer(ctx, ds, input_idx, obj, m, strip_size,
+                                        SD_EC_NR_STRIPE_PER_OBJECT);
                        write_object_to(info->vcw[m].vnode, oid, obj, true,
                                        info->vcw[m].ec_index);
                        fprintf(stdout, "fixed missing %"PRIx64", "
diff --git a/include/fec.h b/include/fec.h
index 78b3fc8..a71b315 100644
--- a/include/fec.h
+++ b/include/fec.h
@@ -196,4 +196,6 @@ static inline void ec_destroy(struct fec *ctx)
        fec_free(ctx);
 }
 
+void ec_decode_buffer(struct fec *ctx, uint8_t *input[], const int in_idx[],
+                     char *buf, int idx, size_t strip_size, int nr_stripe);
 #endif
diff --git a/lib/fec.c b/lib/fec.c
index 8877b68..75d6205 100644
--- a/lib/fec.c
+++ b/lib/fec.c
@@ -680,3 +680,19 @@ void ec_decode(struct fec *ctx, const uint8_t *input[], 
const int inidx[],
 out:
        memcpy(output, dp[idx], strip_size);
 }
+
+void ec_decode_buffer(struct fec *ctx, uint8_t *input[], const int in_idx[],
+                     char *buf, int idx, size_t strip_size, int nr_stripe)
+{
+       int i, j, d = ctx->d;
+
+       for (i = 0; i < nr_stripe; i++) {
+               const uint8_t *in[d];
+               uint8_t out[strip_size];
+
+               for (j = 0; j < d; j++)
+                       in[j] = input[j] + strip_size * i;
+               ec_decode(ctx, in, in_idx, out, idx);
+               memcpy(buf + strip_size * i, out, strip_size);
+       }
+}
diff --git a/sheep/recovery.c b/sheep/recovery.c
index 790bca8..37dde3c 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -423,16 +423,9 @@ static void *rebuild_erasure_object(uint64_t oid, uint8_t 
idx,
        }
 
        /* Rebuild the lost replica */
-       for (i = 0; i < SD_EC_NR_STRIPE_PER_OBJECT; i++) {
-               const uint8_t *in[ed];
-               int strip_size = SD_EC_DATA_STRIPE_SIZE / ed;
-               uint8_t out[strip_size];
-
-               for (j = 0; j < ed; j++)
-                       in[j] = bufs[j] + strip_size * i;
-               ec_decode(ctx, in, idxs, out, idx);
-               memcpy(lost + strip_size * i, out, strip_size);
-       }
+       ec_decode_buffer(ctx, bufs, idxs, lost, idx,
+                        SD_EC_DATA_STRIPE_SIZE / ed,
+                        SD_EC_NR_STRIPE_PER_OBJECT);
 out:
        ec_destroy(ctx);
        for (i = 0; i < ed; i++)
-- 
1.7.9.5

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to