diff options
Diffstat (limited to 'xlators/cluster/ec/src/ec-method.c')
| -rw-r--r-- | xlators/cluster/ec/src/ec-method.c | 119 |
1 files changed, 55 insertions, 64 deletions
diff --git a/xlators/cluster/ec/src/ec-method.c b/xlators/cluster/ec/src/ec-method.c index d1b122fb6a4..55faed0b193 100644 --- a/xlators/cluster/ec/src/ec-method.c +++ b/xlators/cluster/ec/src/ec-method.c @@ -16,6 +16,7 @@ #include "ec-galois.h" #include "ec-code.h" #include "ec-method.h" +#include "ec-helpers.h" static void ec_method_matrix_normal(ec_gf_t *gf, uint32_t *matrix, uint32_t columns, @@ -69,7 +70,7 @@ ec_method_matrix_inverse(ec_gf_t *gf, uint32_t *matrix, uint32_t *values, } } -static gf_boolean_t +static void ec_method_matrix_init(ec_matrix_list_t *list, ec_matrix_t *matrix, uintptr_t mask, uint32_t *rows, gf_boolean_t inverse) { @@ -87,14 +88,9 @@ ec_method_matrix_init(ec_matrix_list_t *list, ec_matrix_t *matrix, matrix->rows); for (i = 0; i < matrix->rows; i++) { matrix->row_data[i].values = matrix->values + i * matrix->columns; - matrix->row_data[i].func.interleaved = - ec_code_build_interleaved(matrix->code, - EC_METHOD_WORD_SIZE, - matrix->row_data[i].values, - matrix->columns); - if (matrix->row_data[i].func.interleaved == NULL) { - return _gf_false; - } + matrix->row_data[i].func.interleaved = ec_code_build_interleaved( + matrix->code, EC_METHOD_WORD_SIZE, matrix->row_data[i].values, + matrix->columns); } } else { matrix->rows = list->rows; @@ -102,17 +98,11 @@ ec_method_matrix_init(ec_matrix_list_t *list, ec_matrix_t *matrix, matrix->columns, rows, matrix->rows); for (i = 0; i < matrix->rows; i++) { matrix->row_data[i].values = matrix->values + i * matrix->columns; - matrix->row_data[i].func.linear = - ec_code_build_linear(matrix->code, EC_METHOD_WORD_SIZE, - matrix->row_data[i].values, - matrix->columns); - if (matrix->row_data[i].func.linear == NULL) { - return _gf_false; - } + matrix->row_data[i].func.linear = ec_code_build_linear( + matrix->code, EC_METHOD_WORD_SIZE, matrix->row_data[i].values, + matrix->columns); } } - - return _gf_true; } static void @@ -233,19 +223,14 @@ ec_method_matrix_get(ec_matrix_list_t *list, uintptr_t mask, uint32_t *rows) } else { matrix = mem_get0(list->pool); if (matrix == NULL) { + matrix = EC_ERR(ENOMEM); goto out; } matrix->values = (uint32_t *)((uintptr_t)matrix + sizeof(ec_matrix_t) + sizeof(ec_matrix_row_t) * list->columns); } - if (!ec_method_matrix_init(list, matrix, mask, rows, _gf_true)) { - ec_method_matrix_unref(list, matrix); - - matrix = NULL; - - goto out; - } + ec_method_matrix_init(list, matrix, mask, rows, _gf_true); if (list->count < list->max) { ec_method_matrix_insert(list, matrix); @@ -269,18 +254,20 @@ ec_method_matrix_put(ec_matrix_list_t *list, ec_matrix_t *matrix) UNLOCK(&list->lock); } -static gf_boolean_t +static int32_t ec_method_setup(xlator_t *xl, ec_matrix_list_t *list, const char *gen) { ec_matrix_t *matrix; uint32_t values[list->rows]; uint32_t i; + int32_t err; matrix = GF_MALLOC(sizeof(ec_matrix_t) + - sizeof(ec_matrix_row_t) * list->rows + - sizeof(uint32_t) * list->columns * list->rows, + sizeof(ec_matrix_row_t) * list->rows + + sizeof(uint32_t) * list->columns * list->rows, ec_mt_ec_matrix_t); if (matrix == NULL) { + err = -ENOMEM; goto failed; } memset(matrix, 0, sizeof(ec_matrix_t)); @@ -288,31 +275,28 @@ ec_method_setup(xlator_t *xl, ec_matrix_list_t *list, const char *gen) sizeof(ec_matrix_row_t) * list->rows); list->code = ec_code_create(list->gf, ec_code_detect(xl, gen)); - if (list->code == NULL) { + if (EC_IS_ERR(list->code)) { + err = EC_GET_ERR(list->code); + list->code = NULL; goto failed_matrix; } - list->width = list->code->width; for (i = 0; i < list->rows; i++) { values[i] = i + 1; } - if (!ec_method_matrix_init(list, matrix, 0, values, _gf_false)) { - goto failed_code; - } + ec_method_matrix_init(list, matrix, 0, values, _gf_false); list->encode = matrix; - return _gf_true; + return 0; -failed_code: - ec_code_destroy(list->code); failed_matrix: GF_FREE(matrix); failed: - return _gf_false; + return err; } -gf_boolean_t +int32_t ec_method_init(xlator_t *xl, ec_matrix_list_t *list, uint32_t columns, uint32_t rows, uint32_t max, const char *gen) { @@ -321,32 +305,38 @@ ec_method_init(xlator_t *xl, ec_matrix_list_t *list, uint32_t columns, list->max = max; list->stripe = EC_METHOD_CHUNK_SIZE * list->columns; INIT_LIST_HEAD(&list->lru); + int32_t err; - list->pool = mem_pool_new_fn(sizeof(ec_matrix_t) + - sizeof(ec_matrix_row_t) * columns + - sizeof(uint32_t) * columns * columns, + list->pool = mem_pool_new_fn(xl->ctx, + sizeof(ec_matrix_t) + + sizeof(ec_matrix_row_t) * columns + + sizeof(uint32_t) * columns * columns, 128, "ec_matrix_t"); if (list->pool == NULL) { + err = -ENOMEM; goto failed; } list->objects = GF_MALLOC(sizeof(ec_matrix_t *) * max, ec_mt_ec_matrix_t); if (list->objects == NULL) { + err = -ENOMEM; goto failed_pool; } list->gf = ec_gf_prepare(EC_GF_BITS, EC_GF_MOD); - if (list->gf == NULL) { + if (EC_IS_ERR(list->gf)) { + err = EC_GET_ERR(list->gf); goto failed_objects; } - if (!ec_method_setup(xl, list, gen)) { + err = ec_method_setup(xl, list, gen); + if (err != 0) { goto failed_gf; } LOCK_INIT(&list->lock); - return _gf_true; + return 0; failed_gf: ec_gf_destroy(list->gf); @@ -358,7 +348,8 @@ failed: list->pool = NULL; list->objects = NULL; list->gf = NULL; - return _gf_false; + + return err; } void @@ -377,8 +368,8 @@ ec_method_fini(ec_matrix_list_t *list) GF_ASSERT(list->count == 0); - if (list->pool)/*Init was successful*/ - LOCK_DESTROY(&list->lock); + if (list->pool) /*Init was successful*/ + LOCK_DESTROY(&list->lock); ec_method_matrix_release(list->encode); GF_FREE(list->encode); @@ -386,57 +377,57 @@ ec_method_fini(ec_matrix_list_t *list) ec_code_destroy(list->code); ec_gf_destroy(list->gf); GF_FREE(list->objects); - mem_pool_destroy(list->pool); + + if (list->pool) + mem_pool_destroy(list->pool); } -gf_boolean_t +int32_t ec_method_update(xlator_t *xl, ec_matrix_list_t *list, const char *gen) { /* TODO: Allow changing code generator */ - return _gf_true; + return 0; } void -ec_method_encode(ec_matrix_list_t *list, size_t size, void *in, void **out) +ec_method_encode(ec_matrix_list_t *list, uint64_t size, void *in, void **out) { ec_matrix_t *matrix; - size_t pos; + uint64_t pos; uint32_t i; matrix = list->encode; for (pos = 0; pos < size; pos += list->stripe) { for (i = 0; i < matrix->rows; i++) { - matrix->row_data[i].func.linear(out[i], in, pos, - matrix->row_data[i].values, - list->columns); + matrix->row_data[i].func.linear( + out[i], in, pos, matrix->row_data[i].values, list->columns); out[i] += EC_METHOD_CHUNK_SIZE; } } } -gf_boolean_t -ec_method_decode(ec_matrix_list_t *list, size_t size, uintptr_t mask, +int32_t +ec_method_decode(ec_matrix_list_t *list, uint64_t size, uintptr_t mask, uint32_t *rows, void **in, void *out) { ec_matrix_t *matrix; - size_t pos; + uint64_t pos; uint32_t i; matrix = ec_method_matrix_get(list, mask, rows); - if (matrix == NULL) { - return _gf_false; + if (EC_IS_ERR(matrix)) { + return EC_GET_ERR(matrix); } for (pos = 0; pos < size; pos += EC_METHOD_CHUNK_SIZE) { for (i = 0; i < matrix->rows; i++) { - matrix->row_data[i].func.interleaved(out, in, pos, - matrix->row_data[i].values, - list->columns); + matrix->row_data[i].func.interleaved( + out, in, pos, matrix->row_data[i].values, list->columns); out += EC_METHOD_CHUNK_SIZE; } } ec_method_matrix_put(list, matrix); - return _gf_true; + return 0; } |
