32#include "erasurecode.h"
33#include "erasurecode_backend.h"
34#include "erasurecode_helpers.h"
35#include "erasurecode_helpers_ext.h"
37#define JERASURE_RS_VAND_LIB_MAJOR 2
38#define JERASURE_RS_VAND_LIB_MINOR 0
39#define JERASURE_RS_VAND_LIB_REV 0
40#define JERASURE_RS_VAND_LIB_VER_STR "2.0"
41#define JERASURE_RS_VAND_LIB_NAME "jerasure_rs_vand"
42#if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
43#define JERASURE_RS_VAND_SO_NAME "libJerasure" LIBERASURECODE_SO_SUFFIX ".dylib"
45#define JERASURE_RS_VAND_SO_NAME "libJerasure" LIBERASURECODE_SO_SUFFIX ".so.2"
51typedef int* (*reed_sol_vandermonde_coding_matrix_func)(int, int, int);
55typedef int * (*jerasure_erasures_to_erased_func)(int, int,
int *);
92 jerasure_desc->
w, jerasure_desc->
matrix, data, parity, blocksize);
98 int *missing_idxs,
int blocksize)
105 jerasure_desc->
m, jerasure_desc->
w,
106 jerasure_desc->
matrix, 1, missing_idxs, data, parity, blocksize);
112 int *missing_idxs,
int destination_idx,
int blocksize)
118 int *decoding_matrix = NULL;
123 if (destination_idx < jerasure_desc->
k) {
124 dm_ids = (
int *) alloc_zeroed_buffer(
sizeof(
int) * jerasure_desc->
k);
125 decoding_matrix = (
int *)
126 alloc_zeroed_buffer(
sizeof(
int*) * jerasure_desc->
k * jerasure_desc->
k);
128 jerasure_desc->
m, missing_idxs);
129 if (NULL == decoding_matrix || NULL == dm_ids || NULL == erased) {
134 jerasure_desc->
m, jerasure_desc->
w, jerasure_desc->
matrix,
135 erased, decoding_matrix, dm_ids);
137 decoding_row = decoding_matrix + (destination_idx * jerasure_desc->
k);
141 jerasure_desc->
w, decoding_row, dm_ids, destination_idx,
142 data, parity, blocksize);
159 jerasure_desc->
m, jerasure_desc->
w,
160 jerasure_desc->
matrix, 1, missing_idxs, data, parity, blocksize);
161 goto parity_reconstr_out;
166 free(decoding_matrix);
174 int *fragments_to_exclude,
int *fragments_needed)
179 struct ec_bm exclude_bm = NEW_BM, missing_bm = NEW_BM;
180 convert_list_to_bitmap(fragments_to_exclude, &exclude_bm);
181 convert_list_to_bitmap(missing_idxs, &missing_bm);
182 bm_combine_or(&exclude_bm, &missing_bm);
187 for (i = 0; i < (jerasure_desc->
k + jerasure_desc->
m); i++) {
188 if (!bm_get_value(&missing_bm, i)) {
189 fragments_needed[j] = i;
192 if (j == jerasure_desc->
k) {
194 fragments_needed[j] = -1;
204 void *backend_sohandle)
214 desc->
k = args->uargs.k;
215 desc->
m = args->uargs.m;
217 if (args->uargs.w <= 0)
221 desc->
w = args->uargs.w;
225 long long max_symbols;
226 if (desc->
w != 8 && desc->
w != 16 && desc->
w != 32) {
229 max_symbols = 1LL << desc->
w;
230 if ((desc->
k + desc->
m) > max_symbols) {
249 } func_handle = {.vptr = NULL};
253 func_handle.vptr = NULL;
254 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_matrix_encode");
260 func_handle.vptr = NULL;
261 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_matrix_decode");
267 func_handle.vptr = NULL;
268 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_make_decoding_matrix");
274 func_handle.vptr = NULL;
275 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_matrix_dotprod");
281 func_handle.vptr = NULL;
282 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_erasures_to_erased");
288 func_handle.vptr = NULL;
289 func_handle.vptr = dlsym(backend_sohandle,
"reed_sol_vandermonde_coding_matrix");
295 func_handle.vptr = NULL;
296 func_handle.vptr = dlsym(backend_sohandle,
"galois_uninit_field");
303 desc->
k, desc->
m, desc->
w);
304 if (NULL == desc->
matrix) {
330 return jerasure_desc->
w;
348 free(jerasure_desc->
matrix);
372 .GETMETADATASIZE = get_backend_metadata_size_zero,
373 .GETENCODEOFFSET = get_encode_offset_zero,
378 .id = EC_BACKEND_JERASURE_RS_VAND,
int(* jerasure_matrix_decode_func)(int, int, int, int *, int, int *, char **, char **, int)
#define JERASURE_RS_VAND_LIB_NAME
#define JERASURE_RS_VAND_LIB_VER_STR
#define JERASURE_RS_VAND_LIB_MINOR
static int jerasure_rs_vand_min_fragments(void *desc, int *missing_idxs, int *fragments_to_exclude, int *fragments_needed)
static bool jerasure_rs_vand_is_compatible_with(uint32_t version)
void(* galois_uninit_field_func)(int)
void(* jerasure_matrix_encode_func)(int, int, int, int *, char **, char **, int)
static int jerasure_rs_vand_exit(void *desc)
static int jerasure_rs_vand_element_size(void *desc)
Return the element-size, which is the number of bits stored on a given device, per codeword.
int *(* jerasure_erasures_to_erased_func)(int, int, int *)
int *(* reed_sol_vandermonde_coding_matrix_func)(int, int, int)
#define JERASURE_RS_VAND_LIB_MAJOR
__attribute__((visibility("internal")))
#define JERASURE_RS_VAND_SO_NAME
static void * jerasure_rs_vand_init(struct ec_backend_args *args, void *backend_sohandle)
int(* jerasure_make_decoding_matrix_func)(int, int, int, int *, int *, int *, int *)
#define JERASURE_RS_VAND_LIB_REV
static int jerasure_rs_vand_reconstruct(void *desc, char **data, char **parity, int *missing_idxs, int destination_idx, int blocksize)
struct ec_backend_common backend_jerasure_rs_vand
void(* jerasure_matrix_dotprod_func)(int, int, int *, int *, int, char **, char **, int)
static int jerasure_rs_vand_encode(void *desc, char **data, char **parity, int blocksize)
static struct ec_backend_op_stubs jerasure_rs_vand_op_stubs
static int jerasure_rs_vand_decode(void *desc, char **data, char **parity, int *missing_idxs, int blocksize)
jerasure_matrix_dotprod_func jerasure_matrix_dotprod
reed_sol_vandermonde_coding_matrix_func reed_sol_vandermonde_coding_matrix
galois_uninit_field_func galois_uninit_field
jerasure_make_decoding_matrix_func jerasure_make_decoding_matrix
jerasure_erasures_to_erased_func jerasure_erasures_to_erased
jerasure_matrix_encode_func jerasure_matrix_encode
jerasure_matrix_decode_func jerasure_matrix_decode