summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Lambert <eric.lambert@seagate.com>2014-10-02 22:31:34 -0400
committerEric Lambert <eric.lambert@seagate.com>2014-10-02 22:31:34 -0400
commit581afe3199dcf1171f750a96ef4d83512ea1ba66 (patch)
tree343e39099a151679312d3aef58ec7ba34019baf4
parentdbacee6f986ddf475bbca1a02d33875bfae7f2c7 (diff)
downloadliberasurecode-581afe3199dcf1171f750a96ef4d83512ea1ba66.tar.gz
libec version is now stored in fragment header
-rw-r--r--include/erasurecode/erasurecode.h2
-rw-r--r--include/erasurecode/erasurecode_helpers.h7
-rw-r--r--src/erasurecode_helpers.c33
-rw-r--r--src/erasurecode_postprocessing.c2
-rw-r--r--test/liberasurecode_test.c7
5 files changed, 41 insertions, 10 deletions
diff --git a/include/erasurecode/erasurecode.h b/include/erasurecode/erasurecode.h
index 78fe98d..a8b1e43 100644
--- a/include/erasurecode/erasurecode.h
+++ b/include/erasurecode/erasurecode.h
@@ -248,6 +248,8 @@ fragment_metadata
uint8_t chksum_type; /* 1 */
uint32_t chksum[LIBERASURECODE_MAX_CHECKSUM_LEN]; /* 32 */
uint8_t chksum_mismatch; /* 1 */
+ uint8_t backend_id; /* 1 */
+ uint32_t backend_version; /* 4 */
} fragment_metadata_t;
#define FRAGSIZE_2_BLOCKSIZE(fragment_size) \
diff --git a/include/erasurecode/erasurecode_helpers.h b/include/erasurecode/erasurecode_helpers.h
index e8fddaa..0e53e63 100644
--- a/include/erasurecode/erasurecode_helpers.h
+++ b/include/erasurecode/erasurecode_helpers.h
@@ -45,11 +45,12 @@
typedef struct __attribute__((__packed__)) fragment_header_s
{
- fragment_metadata_t meta; /* 50 bytes */
+ fragment_metadata_t meta; /* 55 bytes */
uint32_t magic; /* 4 bytes */
+ uint32_t libec_version; /* 4 bytes */
// We must be aligned to 16-byte boundaries
// So, size this array accordingly
- uint8_t aligned_padding[10];
+ uint8_t aligned_padding[1];
} fragment_header_t;
/* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */
@@ -137,6 +138,8 @@ int get_orig_data_size(char *buf);
int validate_fragment(char *buf);
int set_checksum(ec_checksum_type_t ct, char *buf, int blocksize);
int get_checksum(char *buf);
+int set_libec_version(char *fragment);
+int get_libec_version(char *fragment, uint32_t *ver);
/* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */
diff --git a/src/erasurecode_helpers.c b/src/erasurecode_helpers.c
index e07e02a..2f97b17 100644
--- a/src/erasurecode_helpers.c
+++ b/src/erasurecode_helpers.c
@@ -31,10 +31,23 @@
#include "erasurecode_backend.h"
#include "erasurecode_helpers.h"
#include "erasurecode_stdinc.h"
+#include "erasurecode_version.h"
#include "erasurecode/alg_sig.h"
/* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */
+static bool is_valid_fragment(char *buf)
+{
+ fragment_header_t *header = (fragment_header_t *) buf;
+
+ assert(NULL != header);
+ if (header->magic == LIBERASURECODE_FRAG_HEADER_MAGIC) {
+ return true;
+ }
+
+ return false;
+}
+
/**
* Memory Management Methods
*
@@ -328,17 +341,21 @@ int get_orig_data_size(char *buf)
return header->meta.orig_data_size;
}
-/* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */
-
-int validate_fragment(char *buf)
-{
+int set_libec_version(char *buf) {
+ if (!is_valid_fragment(buf)) {
+ return -1;
+ }
fragment_header_t *header = (fragment_header_t *) buf;
+ header->libec_version = (uint32_t)LIBERASURECODE_VERSION;
+ return 0;
+}
- assert(NULL != header);
- if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) {
- return -1;
+int get_libec_version(char *buf, uint32_t *ver) {
+ if (!is_valid_fragment(buf)) {
+ return -1;
}
-
+ fragment_header_t *header = (fragment_header_t *) buf;
+ *ver = header->libec_version;
return 0;
}
diff --git a/src/erasurecode_postprocessing.c b/src/erasurecode_postprocessing.c
index 8315d7a..682638b 100644
--- a/src/erasurecode_postprocessing.c
+++ b/src/erasurecode_postprocessing.c
@@ -34,9 +34,11 @@ void add_fragment_metadata(char *fragment,
int idx, uint64_t orig_data_size, int blocksize,
ec_checksum_type_t ct, int add_chksum)
{
+ set_libec_version(fragment);
set_fragment_idx(fragment, idx);
set_orig_data_size(fragment, orig_data_size);
set_fragment_payload_size(fragment, blocksize);
+
if (add_chksum) {
set_checksum(ct, fragment, blocksize);
}
diff --git a/test/liberasurecode_test.c b/test/liberasurecode_test.c
index 813813e..9ab44d7 100644
--- a/test/liberasurecode_test.c
+++ b/test/liberasurecode_test.c
@@ -740,13 +740,17 @@ static void test_get_fragment_metadata(const ec_backend_id_t be_id, struct ec_ar
for (i = 0; i < num_fragments; i++) {
char * data = NULL;
+ uint32_t ver = 0;
+ char *header = NULL;
memset(&cur_frag, -1, sizeof(fragment_metadata_t));
if (i < args->k) {
rc = liberasurecode_get_fragment_metadata(encoded_data[i], &cur_frag);
data = get_data_ptr_from_fragment(encoded_data[i]);
+ header = encoded_data[i];
} else {
rc = liberasurecode_get_fragment_metadata(encoded_parity[i - args->k], &cur_frag);
data = get_data_ptr_from_fragment(encoded_parity[i - args->k]);
+ header = encoded_parity[i - args->k];
}
assert(rc == 0);
assert(cur_frag.orig_data_size == orig_data_size);
@@ -755,6 +759,9 @@ static void test_get_fragment_metadata(const ec_backend_id_t be_id, struct ec_ar
validate_fragment_checksum(args, &cur_frag, data);
rc = memcmp(&cur_frag, &cmp_frag, sizeof(fragment_metadata_t));
assert(rc != 0);
+ rc = get_libec_version(header, &ver);
+ assert(rc == 0);
+ assert(ver == LIBERASURECODE_VERSION);
}
}