summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Greenan <kmgreen2@gmail.com>2015-01-11 09:41:27 -0800
committerKevin Greenan <kmgreen2@gmail.com>2015-01-11 09:41:27 -0800
commit2e153037af2539cc517388c6f6aac2184a703706 (patch)
treedf5cf092e0485631ddad0ce4210c61661b117532
parenta11fcb022d9c51f13b1ca787c7476403b112cdc0 (diff)
downloadliberasurecode-2e153037af2539cc517388c6f6aac2184a703706.tar.gz
Changing stripe verification to properly work with clients.
-rw-r--r--include/erasurecode/erasurecode.h2
-rw-r--r--src/erasurecode.c29
2 files changed, 27 insertions, 4 deletions
diff --git a/include/erasurecode/erasurecode.h b/include/erasurecode/erasurecode.h
index e8ad056..691d470 100644
--- a/include/erasurecode/erasurecode.h
+++ b/include/erasurecode/erasurecode.h
@@ -333,6 +333,8 @@ typedef enum {
EBACKENDINITERR = 202,
EBACKENDINUSE = 203,
EBACKENDNOTAVAIL = 204,
+ EBADCHKSUM = 205,
+ EINVALIDPARAMS = 206,
} LIBERASURECODE_ERROR_CODES;
/* =~=*=~==~=*=~==~=*=~==~=*=~===~=*=~==~=*=~===~=*=~==~=*=~===~=*=~==~=*=~= */
diff --git a/src/erasurecode.c b/src/erasurecode.c
index ad29673..9040159 100644
--- a/src/erasurecode.c
+++ b/src/erasurecode.c
@@ -937,6 +937,8 @@ int liberasurecode_get_fragment_metadata(char *fragment,
computed_chksum = crc32(0, fragment_data, fragment_size);
if (stored_chksum != computed_chksum) {
fragment_metadata->chksum_mismatch = 1;
+ } else {
+ fragment_metadata->chksum_mismatch = 0;
}
break;
}
@@ -992,23 +994,42 @@ int is_valid_fragment(int desc, char *fragment)
return 0;
}
+int is_valid_fragment_metadata(int desc, fragment_metadata_t *fragment_metadata)
+{
+ ec_backend_t be = liberasurecode_backend_instance_get_by_desc(desc);
+ if (!be) {
+ log_error("Unable to verify stripe metadata: invalid backend id %d.",
+ desc);
+ return 1;
+ }
+ if (liberasurecode_verify_fragment_metadata(be,
+ fragment_metadata) != 0) {
+ return 1;
+ }
+ if (fragment_metadata->chksum_mismatch == 1) {
+ return -EBADCHKSUM;
+ }
+ return 0;
+}
+
int liberasurecode_verify_stripe_metadata(int desc,
char **fragments, int num_fragments)
{
int i = 0;
if (!fragments) {
log_error("Unable to verify stripe metadata: fragments missing.");
- return 1;
+ return -EINVALIDPARAMS;
}
if (num_fragments <= 0) {
log_error("Unable to verify stripe metadata: "
"number of fragments must be greater than 0.");
- return 1;
+ return -EINVALIDPARAMS;
}
for (i = 0; i < num_fragments; i++) {
- if (is_valid_fragment(desc, fragments[i]) == 1) {
- return 1;
+ fragment_metadata_t *fragment_metadata = (fragment_metadata_t*)fragments[i];
+ if (is_valid_fragment_metadata(desc, fragment_metadata) == -EBADCHKSUM) {
+ return -EBADCHKSUM;
}
}