diff options
author | Eric Lambert <eric.lambert@seagate.com> | 2014-10-02 22:31:34 -0400 |
---|---|---|
committer | Eric Lambert <eric.lambert@seagate.com> | 2014-10-02 22:31:34 -0400 |
commit | 581afe3199dcf1171f750a96ef4d83512ea1ba66 (patch) | |
tree | 343e39099a151679312d3aef58ec7ba34019baf4 | |
parent | dbacee6f986ddf475bbca1a02d33875bfae7f2c7 (diff) | |
download | liberasurecode-581afe3199dcf1171f750a96ef4d83512ea1ba66.tar.gz |
libec version is now stored in fragment header
-rw-r--r-- | include/erasurecode/erasurecode.h | 2 | ||||
-rw-r--r-- | include/erasurecode/erasurecode_helpers.h | 7 | ||||
-rw-r--r-- | src/erasurecode_helpers.c | 33 | ||||
-rw-r--r-- | src/erasurecode_postprocessing.c | 2 | ||||
-rw-r--r-- | test/liberasurecode_test.c | 7 |
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); } } |