diff options
Diffstat (limited to 'xlators/cluster/ec/src/ec-method.c')
| -rw-r--r-- | xlators/cluster/ec/src/ec-method.c | 84 |
1 files changed, 28 insertions, 56 deletions
diff --git a/xlators/cluster/ec/src/ec-method.c b/xlators/cluster/ec/src/ec-method.c index 41bf0406ecb..55faed0b193 100644 --- a/xlators/cluster/ec/src/ec-method.c +++ b/xlators/cluster/ec/src/ec-method.c @@ -70,12 +70,11 @@ ec_method_matrix_inverse(ec_gf_t *gf, uint32_t *matrix, uint32_t *values, } } -static int32_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) { uint32_t i; - int32_t err = 0; matrix->refs = 1; matrix->mask = mask; @@ -89,16 +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 (EC_IS_ERR(matrix->row_data[i].func.interleaved)) { - err = EC_GET_ERR(matrix->row_data[i].func.interleaved); - matrix->row_data[i].func.interleaved = NULL; - break; - } + 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; @@ -106,19 +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 (EC_IS_ERR(matrix->row_data[i].func.linear)) { - err = EC_GET_ERR(matrix->row_data[i].func.linear); - matrix->row_data[i].func.linear = NULL; - break; - } + matrix->row_data[i].func.linear = ec_code_build_linear( + matrix->code, EC_METHOD_WORD_SIZE, matrix->row_data[i].values, + matrix->columns); } } - - return err; } static void @@ -218,7 +202,6 @@ ec_method_matrix_get(ec_matrix_list_t *list, uintptr_t mask, uint32_t *rows) { ec_matrix_t *matrix; uint32_t pos; - int32_t err = 0; LOCK(&list->lock); @@ -247,13 +230,7 @@ ec_method_matrix_get(ec_matrix_list_t *list, uintptr_t mask, uint32_t *rows) sizeof(ec_matrix_row_t) * list->columns); } - err = ec_method_matrix_init(list, matrix, mask, rows, _gf_true); - if (err != 0) { - ec_method_matrix_unref(list, matrix); - matrix = EC_ERR(err); - - goto out; - } + ec_method_matrix_init(list, matrix, mask, rows, _gf_true); if (list->count < list->max) { ec_method_matrix_insert(list, matrix); @@ -286,8 +263,8 @@ ec_method_setup(xlator_t *xl, ec_matrix_list_t *list, const char *gen) 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; @@ -303,22 +280,16 @@ ec_method_setup(xlator_t *xl, ec_matrix_list_t *list, const char *gen) list->code = NULL; goto failed_matrix; } - list->width = list->code->width; for (i = 0; i < list->rows; i++) { values[i] = i + 1; } - err = ec_method_matrix_init(list, matrix, 0, values, _gf_false); - if (err != 0) { - goto failed_code; - } + ec_method_matrix_init(list, matrix, 0, values, _gf_false); list->encode = matrix; return 0; -failed_code: - ec_code_destroy(list->code); failed_matrix: GF_FREE(matrix); failed: @@ -336,9 +307,10 @@ ec_method_init(xlator_t *xl, ec_matrix_list_t *list, uint32_t 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; @@ -396,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); @@ -405,7 +377,9 @@ 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); } int32_t @@ -417,29 +391,28 @@ ec_method_update(xlator_t *xl, ec_matrix_list_t *list, const char *gen) } 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; } } } int32_t -ec_method_decode(ec_matrix_list_t *list, size_t size, uintptr_t mask, +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); @@ -448,9 +421,8 @@ ec_method_decode(ec_matrix_list_t *list, size_t size, uintptr_t mask, } 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; } } |
