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.dylib" 45 #define JERASURE_RS_VAND_SO_NAME "libJerasure.so.2" 53 typedef int* (*reed_sol_vandermonde_coding_matrix_func)(int, int, int);
57 typedef int * (*jerasure_erasures_to_erased_func)(int, int,
int *);
90 jerasure_desc->
w, jerasure_desc->
matrix, data, parity, blocksize);
96 int *missing_idxs,
int blocksize)
103 jerasure_desc->
m, jerasure_desc->
w,
104 jerasure_desc->
matrix, 1, missing_idxs, data, parity, blocksize);
110 int *missing_idxs,
int destination_idx,
int blocksize)
116 int *decoding_matrix = NULL;
121 if (destination_idx < jerasure_desc->
k) {
123 decoding_matrix = (
int *)
126 jerasure_desc->
m, missing_idxs);
127 if (NULL == decoding_matrix || NULL == dm_ids || NULL == erased) {
132 jerasure_desc->
m, jerasure_desc->
w, jerasure_desc->
matrix,
133 erased, decoding_matrix, dm_ids);
135 decoding_row = decoding_matrix + (destination_idx * jerasure_desc->
k);
139 jerasure_desc->
w, decoding_row, dm_ids, destination_idx,
140 data, parity, blocksize);
157 jerasure_desc->
m, jerasure_desc->
w,
158 jerasure_desc->
matrix, 1, missing_idxs, data, parity, blocksize);
159 goto parity_reconstr_out;
164 free(decoding_matrix);
172 int *fragments_to_exclude,
int *fragments_needed)
177 uint64_t exclude_bm = convert_list_to_bitmap(fragments_to_exclude);
178 uint64_t missing_bm = convert_list_to_bitmap(missing_idxs) | exclude_bm;
183 for (i = 0; i < (jerasure_desc->
k + jerasure_desc->
m); i++) {
184 if (!(missing_bm & (1 << i))) {
185 fragments_needed[j] = i;
188 if (j == jerasure_desc->
k) {
190 fragments_needed[j] = -1;
200 void *backend_sohandle)
210 desc->
k = args->uargs.k;
211 desc->
m = args->uargs.m;
213 if (args->uargs.w <= 0)
217 desc->
w = args->uargs.w;
221 long long max_symbols;
222 if (desc->
w != 8 && desc->
w != 16 && desc->
w != 32) {
225 max_symbols = 1LL << desc->
w;
226 if ((desc->
k + desc->
m) > max_symbols) {
244 } func_handle = {.vptr = NULL};
248 func_handle.vptr = NULL;
249 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_matrix_encode");
255 func_handle.vptr = NULL;
256 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_matrix_decode");
262 func_handle.vptr = NULL;
263 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_make_decoding_matrix");
269 func_handle.vptr = NULL;
270 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_matrix_dotprod");
276 func_handle.vptr = NULL;
277 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_erasures_to_erased");
283 func_handle.vptr = NULL;
284 func_handle.vptr = dlsym(backend_sohandle,
"reed_sol_vandermonde_coding_matrix");
291 desc->
k, desc->
m, desc->
w);
292 if (NULL == desc->
matrix) {
318 return jerasure_desc->
w;
326 free(jerasure_desc->
matrix);
352 .id = EC_BACKEND_JERASURE_RS_VAND,
357 .backend_metadata_size = 0,
jerasure_matrix_decode_func jerasure_matrix_decode
void(* jerasure_matrix_encode_func)(int, int, int, int *, char **, char **, int)
int *(* reed_sol_vandermonde_coding_matrix_func)(int, int, int)
struct ec_backend_common backend_jerasure_rs_vand
int(* jerasure_make_decoding_matrix_func)(int, int, int, int *, int *, int *, int *)
struct ec_backend_op_stubs jerasure_rs_vand_op_stubs
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...
void * alloc_zeroed_buffer(int size)
Allocate a zero-ed buffer of a specific size.
int(* jerasure_matrix_decode_func)(int, int, int, int *, int, int *, char **, char **, int)
struct ec_backend_op_stubs jerasure_rs_vand_ops
jerasure_make_decoding_matrix_func jerasure_make_decoding_matrix
static int jerasure_rs_vand_encode(void *desc, char **data, char **parity, int blocksize)
static int jerasure_rs_vand_decode(void *desc, char **data, char **parity, int *missing_idxs, int blocksize)
reed_sol_vandermonde_coding_matrix_func reed_sol_vandermonde_coding_matrix
#define JERASURE_RS_VAND_LIB_REV
jerasure_matrix_dotprod_func jerasure_matrix_dotprod
#define JERASURE_RS_VAND_LIB_MAJOR
int *(* jerasure_erasures_to_erased_func)(int, int, int *)
static int jerasure_rs_vand_exit(void *desc)
static int jerasure_rs_vand_min_fragments(void *desc, int *missing_idxs, int *fragments_to_exclude, int *fragments_needed)
static int jerasure_rs_vand_reconstruct(void *desc, char **data, char **parity, int *missing_idxs, int destination_idx, int blocksize)
jerasure_erasures_to_erased_func jerasure_erasures_to_erased
#define JERASURE_RS_VAND_LIB_NAME
struct ec_backend jerasure_rs_vand
static void * jerasure_rs_vand_init(struct ec_backend_args *args, void *backend_sohandle)
#define JERASURE_RS_VAND_LIB_VER_STR
#define JERASURE_RS_VAND_LIB_MINOR
static bool jerasure_rs_vand_is_compatible_with(uint32_t version)
#define JERASURE_RS_VAND_SO_NAME
void(* jerasure_matrix_dotprod_func)(int, int, int *, int *, int, char **, char **, int)
jerasure_matrix_encode_func jerasure_matrix_encode