30#include "erasurecode_backend.h"
31#include "erasurecode_helpers.h"
32#include "erasurecode_helpers_ext.h"
33#include "erasurecode_log.h"
34#include "erasurecode_stdinc.h"
38void add_fragment_metadata(ec_backend_t be,
char *fragment,
39 int idx, uint64_t orig_data_size,
int blocksize,
40 ec_checksum_type_t ct,
int add_chksum)
43 set_libec_version(fragment);
44 set_fragment_idx(fragment, idx);
45 set_orig_data_size(fragment, orig_data_size);
46 set_fragment_payload_size(fragment, blocksize);
47 set_backend_id(fragment, be->common.id);
48 set_backend_version(fragment, be->common.ec_backend_version);
49 set_fragment_backend_metadata_size(fragment, be->common.ops->get_backend_metadata_size(
50 be->desc.backend_desc,
54 set_checksum(ct, fragment, blocksize);
57 fragment_header_t* header = (fragment_header_t*) fragment;
59 if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) {
60 log_error(
"Invalid fragment header (add fragment metadata)!\n");
64 char *flag = getenv(
"LIBERASURECODE_WRITE_LEGACY_CRC");
65 if (flag && !(flag[0] ==
'\0' || (flag[0] ==
'0' && flag[1] ==
'\0'))) {
67 0, &header->meta,
sizeof(fragment_metadata_t));
69 header->metadata_chksum = crc32(0, (
unsigned char *) &header->meta,
70 sizeof(fragment_metadata_t));
75int finalize_fragments_after_encode(ec_backend_t instance,
76 int k,
int m,
int blocksize, uint64_t orig_data_size,
77 char **encoded_data,
char **encoded_parity)
79 int i, set_chksum = 1;
80 ec_checksum_type_t ct = instance->args.uargs.ct;
83 for (i = 0; i < k; i++) {
84 char *fragment = get_fragment_ptr_from_data(encoded_data[i]);
85 add_fragment_metadata(instance, fragment, i, orig_data_size,
86 blocksize, ct, set_chksum);
87 encoded_data[i] = fragment;
91 for (i = 0; i < m; i++) {
92 char *fragment = get_fragment_ptr_from_data(encoded_parity[i]);
93 add_fragment_metadata(instance, fragment, i + k, orig_data_size,
94 blocksize, ct, set_chksum);
95 encoded_parity[i] = fragment;
int liberasurecode_crc32_alt(int crc, const void *buf, size_t size)
__attribute__((visibility("internal")))