]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
erasure code: move shec.cc into ErasureCodeShec.cc
authorTakanori Nakao <nakao.takanori@jp.fujitsu.com>
Mon, 15 Jun 2015 07:32:22 +0000 (16:32 +0900)
committerTakeshi Miyamae <miyamae.takeshi@jp.fujitsu.com>
Wed, 8 Jul 2015 13:04:15 +0000 (22:04 +0900)
Signed-off-by: Takanori Nakao <nakao.takanori@jp.fujitsu.com>
src/erasure-code/shec/ErasureCodeShec.cc
src/erasure-code/shec/ErasureCodeShec.h
src/erasure-code/shec/Makefile.am
src/erasure-code/shec/shec.cc [deleted file]
src/erasure-code/shec/shec.h [deleted file]

index 148525e6bbff2208110f779983655055e348da68..61a51d5a3c34a68ec7063709b294b0f7ac0e4229 100644 (file)
  *
  */
 
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <errno.h>
 #include <algorithm>
 #include "common/debug.h"
 #include "ErasureCodeShec.h"
 #include "crush/CrushWrapper.h"
 #include "osd/osd_types.h"
-#include "shec.h"
 extern "C" {
 #include "jerasure/include/jerasure.h"
 #include "jerasure/include/galois.h"
+
+#define talloc(type, num) (type *) malloc(sizeof(type)*(num))
+
+extern int calc_determinant(int *matrix, int dim);
+extern int* reed_sol_vandermonde_coding_matrix(int k, int m, int w);
 }
 
 #define dout_subsys ceph_subsys_osd
@@ -116,8 +123,7 @@ int ErasureCodeShec::minimum_to_decode(const set<int> &want_to_decode,
       }
     }
 
-    if (shec_make_decoding_matrix(true, k, m, w, matrix, erased,
-                                 avails, 0, dm_ids, minimum) < 0) {
+    if (shec_make_decoding_matrix(true, erased, avails, 0, dm_ids, minimum) < 0) {
       return -EIO;
     }
 
@@ -270,8 +276,7 @@ int ErasureCodeShecReedSolomonVandermonde::shec_decode(int *erased,
                                            char **coding,
                                            int blocksize)
 {
-  return shec_matrix_decode(k, m, w, matrix,
-                           erased, avails, data, coding, blocksize);
+  return shec_matrix_decode(erased, avails, data, coding, blocksize);
 }
 
 unsigned ErasureCodeShecReedSolomonVandermonde::get_alignment() const
@@ -389,12 +394,26 @@ void ErasureCodeShecReedSolomonVandermonde::prepare()
     dout(10) << "[ cache tables ] creating coeff for k=" <<
       k << " m=" << m << " c=" << c << " w=" << w << dendl;
 
-    matrix = shec_reedsolomon_coding_matrix(k, m, c, w, technique);
+    matrix = shec_reedsolomon_coding_matrix(technique);
 
     // either our new created table is stored or if it has been
     // created in the meanwhile the locally allocated table will be
     // freed by setEncodingTable
     matrix = tcache.setEncodingTable(technique, k, m, c, w, matrix);
+
+    dout(10) << "matrix = " << dendl;
+    for (int i=0; i<m; i++) {
+      char mat[k+1];
+      for (int j=0; j<k; j++) {
+        if (matrix[i*k+j] > 0) {
+          mat[j] = '1';
+        } else {
+          mat[j] = '0';
+        }
+      }
+      mat[k] = '\0';
+      dout(10) << mat << dendl;
+    }
   } else {
     matrix = *p_enc_table;
   }
@@ -405,3 +424,298 @@ void ErasureCodeShecReedSolomonVandermonde::prepare()
   assert((technique == SINGLE) || (technique == MULTIPLE));
 
 }
+
+// ErasureCodeShec::
+// Mearged from shec.cc.
+
+double ErasureCodeShec::shec_calc_recovery_efficiency1(int k, int m1, int m2, int c1, int c2){
+  int r_eff_k[k];
+  double r_e1;
+  int i, rr, cc, start, end;
+  int first_flag;
+
+  if (m1 < c1 || m2 < c2) return -1;
+  if ((m1 == 0 && c1 != 0) || (m2 == 0 && c2 != 0)) return -1;
+
+  for (i=0; i<k; i++) r_eff_k[i] = 100000000;
+  r_e1 = 0;
+
+  for (rr=0; rr<m1; rr++){
+    start = ((rr*k)/m1) % k;
+    end = (((rr+c1)*k)/m1) % k;
+    for (cc=start, first_flag=1; first_flag || cc!=end; cc=(cc+1)%k){
+      first_flag = 0;
+      r_eff_k[cc] = std::min(r_eff_k[cc], ((rr+c1)*k)/m1 - (rr*k)/m1);
+    }
+    r_e1 += ((rr+c1)*k)/m1 - (rr*k)/m1;
+  }
+
+  for (rr=0; rr<m2; rr++){
+    start = ((rr*k)/m2) % k;
+    end = (((rr+c2)*k)/m2) % k;
+    for (cc=start, first_flag=1; first_flag || cc!=end; cc=(cc+1)%k){
+      first_flag = 0;
+      r_eff_k[cc] = std::min(r_eff_k[cc], ((rr+c2)*k)/m2 - (rr*k)/m2);
+    }
+    r_e1 += ((rr+c2)*k)/m2 - (rr*k)/m2;
+  }
+
+  for (i=0; i<k; i++){
+    r_e1 += r_eff_k[i];
+  }
+
+  r_e1 /= (k+m1+m2);
+
+  return r_e1;
+}
+
+int* ErasureCodeShec::shec_reedsolomon_coding_matrix(int is_single)
+{
+  int *matrix;
+  int rr, cc, start, end;
+  int m1, m2, c1, c2;
+
+  if (w != 8 && w != 16 && w != 32) return NULL;
+
+  if (!is_single){
+    int c1_best = -1, m1_best = -1;
+    double min_r_e1 = 100.0;
+
+    // create all multiple shec pattern and choose best.
+
+    for (c1=0; c1 <= c/2; c1++){
+      for (m1=0; m1 <= m; m1++){
+        c2 = c-c1;
+        m2 = m-m1;
+
+        if (m1 < c1 || m2 < c2) continue;
+        if ((m1 == 0 && c1 != 0) || (m2 == 0 && c2 != 0)) continue;
+        if ((m1 != 0 && c1 == 0) || (m2 != 0 && c2 == 0)) continue;
+
+        // minimize r_e1
+
+        if (true) {
+          double r_e1;
+          r_e1 = shec_calc_recovery_efficiency1(k, m1, m2, c1, c2);
+          if (r_e1 < min_r_e1){
+            min_r_e1 = r_e1;
+            c1_best = c1;
+            m1_best = m1;
+          }
+        }
+      }
+    }
+    m1 = m1_best;
+    c1 = c1_best;
+    m2 = m - m1_best;
+    c2 = c - c1_best;
+  } else {
+    m1 = 0;
+    c1 = 0;
+    m2 = m;
+    c2 = c;
+  }
+
+  // create matrix
+  matrix = reed_sol_vandermonde_coding_matrix(k, m, w);
+
+  for (rr=0; rr<m1; rr++){
+    end = ((rr*k)/m1) % k;
+    start = (((rr+c1)*k)/m1) % k;
+    for (cc=start; cc!=end; cc=(cc+1)%k){
+      matrix[cc + rr*k] = 0;
+    }
+  }
+
+  for (rr=0; rr<m2; rr++){
+    end = ((rr*k)/m2) % k;
+    start = (((rr+c2)*k)/m2) % k;
+    for (cc=start; cc!=end; cc=(cc+1)%k){
+      matrix[cc + (rr+m1)*k] = 0;
+    }
+  }
+
+  return matrix;
+}
+
+int ErasureCodeShec::shec_make_decoding_matrix(bool prepare, int *erased, int *avails,
+                                               int *decoding_matrix, int *dm_ids, int *minimum)
+{
+  int i, j, det = 0;
+  int ek;
+  int *tmpmat = NULL, tmprow[k+m], element, dup, mindup;
+
+  for (i = 0, j = 0, ek = 0; i < k; i++) {
+    if (erased[i] == 1) {
+      ek++;
+    } else {
+      dm_ids[j] = i;
+      j++;
+    }
+  }
+
+  tmpmat = talloc(int, k*k);
+  if (tmpmat == NULL) { return -1; }
+  for (i = 0; i < k-ek; i++) {
+    for (j = 0; j < k; j++) tmpmat[i*k+j] = 0;
+    tmpmat[i*k+dm_ids[i]] = 1;
+  }
+
+  if (ek > m){
+    free(tmpmat);
+    return -1;
+  }
+
+  mindup = k+1;
+  int minc[ek];
+  for (i=0; i<ek; i++){
+    minc[i] = -1;
+  }
+  int p[ek];
+  int pp[k+m];
+  for (i=0; i<ek; i++){
+    pp[i] = 1;
+  }
+  for (i=ek; i<m; i++){
+    pp[i] = 0;
+  }
+
+  do {
+    i=0;
+    for (j=0; j<m; j++){
+      if (pp[j]){
+        p[i++] = j;
+      }
+    }
+
+    bool ok = true;
+    for (i = 0; i < ek; i++) {
+      if (erased[k+p[i]] == 1 || avails[k+p[i]] == 0) ok = false;
+      for (j = 0; j < k; j++) {
+        element = matrix[(p[i])*k+j];
+        if (element != 0) {
+          if (erased[j] == 0 && avails[j] == 0) ok = false;
+        }
+      }
+    }
+    if (ok == false) continue;
+
+    for (i = 0; i < k+m; i++) tmprow[i] = 0;
+    for (i = 0; i < m; i++) {
+      if (erased[k+i] == 1) {
+        for (j = 0; j < k; j++) {
+          if (matrix[i*k+j] != 0 && erased[j] == 0) tmprow[j] = 1;
+        }
+      }
+    }
+    for (i = 0; i < ek; i++) {
+      tmprow[k+p[i]] = 1;
+      for (j = 0; j < k; j++) {
+        element = matrix[(p[i])*k+j];
+        tmpmat[(k-ek+i)*k+j] = element;
+        if (element != 0 && erased[j] == 0) tmprow[j] = 1;
+      }
+    }
+    dup = 0;
+    for (j = 0; j < k; j++) {
+      if (tmprow[j] > 0) dup++;
+    }
+    if (dup < mindup) {
+      det = calc_determinant(tmpmat, k);
+      if (det != 0) {
+        mindup = dup;
+        for (int i=0; i<ek; i++){
+          minc[i] = p[i];
+        }
+      }
+    }
+  } while (std::prev_permutation(pp, pp+m));
+
+  if (minc[0] == -1 && mindup == k+1) {
+    fprintf(stderr, "shec_make_decoding_matrix(): can't find recover matrix.\n");
+    free(tmpmat);
+    return -1;
+  }
+
+  for (i = 0; i < k+m; i++) minimum[i] = 0;
+  for (i = 0; i < m; i++) {
+    if (erased[k+i] == 1) {
+      for (j = 0; j < k; j++) {
+        if (matrix[i*k+j] != 0 && erased[j] == 0) minimum[j] = 1;
+      }
+    }
+  }
+  for (i = 0; i < ek; i++) {
+    dm_ids[k-ek+i] = k+minc[i];
+    minimum[k+minc[i]] = 1;
+    for (j = 0; j < k; j++) {
+      element = matrix[(minc[i])*k+j];
+      tmpmat[(k-ek+i)*k+j] = element;
+      if (element != 0 && erased[j] == 0) minimum[j] = 1;
+    }
+  }
+
+  if (prepare == true) {
+    free(tmpmat);
+    return 0;
+  }
+
+  i = jerasure_invert_matrix(tmpmat, decoding_matrix, k, w);
+
+  free(tmpmat);
+
+  return i;
+}
+
+int ErasureCodeShec::shec_matrix_decode(int *erased, int *avails, char **data_ptrs,
+                                        char **coding_ptrs, int size)
+{
+  int i, edd;
+  int *decoding_matrix = NULL, dm_ids[k];
+  int minimum[k + m];
+
+  memset(dm_ids, 0, sizeof(dm_ids));
+  memset(minimum, -1, sizeof(minimum));
+
+  if (w != 8 && w != 16 && w != 32) return -1;
+
+  /* Find the number of data drives failed */
+
+  edd = 0;
+  for (i = 0; i < k; i++) {
+    if (erased[i]) {
+      edd++;
+    }
+  }
+
+  decoding_matrix = talloc(int, k*k);
+  if (decoding_matrix == NULL) { return -1; }
+
+  if (shec_make_decoding_matrix(false, erased, avails, decoding_matrix, dm_ids, minimum) < 0) {
+    free(decoding_matrix);
+    return -1;
+  }
+
+  /* Decode the data drives */
+
+  for (i = 0; edd > 0 && i < k; i++) {
+    if (erased[i]) {
+      jerasure_matrix_dotprod(k, w, decoding_matrix+(i*k),
+                              dm_ids, i, data_ptrs, coding_ptrs, size);
+      edd--;
+    }
+  }
+
+  /* Re-encode any erased coding devices */
+
+  for (i = 0; i < m; i++) {
+    if (erased[k+i]) {
+      jerasure_matrix_dotprod(k, w, matrix+(i*k), NULL, i+k,
+                              data_ptrs, coding_ptrs, size);
+    }
+  }
+
+  if (decoding_matrix != NULL) free(decoding_matrix);
+
+  return 0;
+}
index a943f0859725f2f9a0fdf5dcf1a7c6277c43ef2c..9c6fd33f9eed24bfec0782eee6c8888025fd7a8e 100644 (file)
@@ -116,8 +116,17 @@ public:
                          int blocksize) = 0;
   virtual unsigned get_alignment() const = 0;
   virtual void prepare() = 0;
+
+  virtual int shec_matrix_decode(int *erased, int *avails,
+                                 char **data_ptrs, char **coding_ptrs, int size);
+  virtual int* shec_reedsolomon_coding_matrix(int is_single);
+
 private:
   virtual int parse(const ErasureCodeProfile &profile) = 0;
+
+  virtual double shec_calc_recovery_efficiency1(int k, int m1, int m2, int c1, int c2);
+  virtual int shec_make_decoding_matrix(bool prepare, int *erased, int *avails,
+                                        int *decoding_matrix, int *dm_ids, int *minimum);
 };
 
 class ErasureCodeShecReedSolomonVandermonde : public ErasureCodeShec {
index 148f1c30d0d1a29567b84e1afdc5119e0ac2979b..e4ca5f8e72f561a214254b5f1f3d6927eca55e3d 100644 (file)
@@ -5,7 +5,6 @@ libec_shec_la_SOURCES = \
        erasure-code/shec/ErasureCodePluginShec.cc \
        erasure-code/shec/ErasureCodeShec.cc \
        erasure-code/shec/ErasureCodeShecTableCache.cc \
-       erasure-code/shec/shec.cc \
        erasure-code/shec/determinant.c \
        erasure-code/jerasure/jerasure/src/cauchy.c \
        erasure-code/jerasure/jerasure/src/galois.c \
@@ -26,7 +25,6 @@ libec_shec_la_SOURCES = \
 noinst_HEADERS += \
        erasure-code/shec/ErasureCodeShec.h \
        erasure-code/shec/ErasureCodeShecTableCache.h \
-       erasure-code/shec/shec.h \
        erasure-code/jerasure/jerasure/include/cauchy.h \
        erasure-code/jerasure/jerasure/include/galois.h \
        erasure-code/jerasure/jerasure/include/jerasure.h \
@@ -51,8 +49,6 @@ libec_shec_la_CXXFLAGS= ${AM_CXXFLAGS} \
        -I$(srcdir)/erasure-code/jerasure \
        -I$(srcdir)/erasure-code/shec
 libec_shec_la_LIBADD = $(LIBCRUSH) $(PTHREAD_LIBS) $(EXTRALIBS)
-#libec_shec_la_LIBADD = $(PTHREAD_LIBS) $(EXTRALIBS)
-#libec_shec_la_LDFLAGS = ${AM_LDFLAGS} -version-info 1:0:0 -export-symbols-regex '.*__erasure_code_.*'
 libec_shec_la_LDFLAGS = ${AM_LDFLAGS} -version-info 1:0:0
 if LINUX
 libec_shec_la_LDFLAGS += -export-symbols-regex '.*__erasure_code_.*'
diff --git a/src/erasure-code/shec/shec.cc b/src/erasure-code/shec/shec.cc
deleted file mode 100644 (file)
index 18528a1..0000000
+++ /dev/null
@@ -1,331 +0,0 @@
-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-// vim: ts=8 sw=2 smarttab
-/*
- * Ceph - scalable distributed file system
- *
- * Copyright (C) 2014 FUJITSU LIMITED
- * Copyright (C) 2014, James S. Plank and Kevin Greenan
- *
- * Author: Takanori Nakao <nakao.takanori@jp.fujitsu.com>
- * Author: Takeshi Miyamae <miyamae.takeshi@jp.fujitsu.com>
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- */
-
-/* Jerasure's authors:
-
-   Revision 2.x - 2014: James S. Plank and Kevin M. Greenan
-   Revision 1.2 - 2008: James S. Plank, Scott Simmerman and Catherine D. Schuman.
-   Revision 1.0 - 2007: James S. Plank
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <algorithm>
-
-#include "shec.h"
-
-extern "C"{
-#include "jerasure/include/jerasure.h"
-#include "jerasure/include/reed_sol.h"
-
-#define talloc(type, num) (type *) malloc(sizeof(type)*(num))
-
-extern int calc_determinant(int *matrix, int dim);
-}
-
-double shec_calc_recovery_efficiency1(int k, int m1, int m2, int c1, int c2){
-  int r_eff_k[k];
-  double r_e1;
-  int i, rr, cc, start, end;
-  int first_flag;
-
-  if (m1 < c1 || m2 < c2) return -1;
-  if ((m1 == 0 && c1 != 0) || (m2 == 0 && c2 != 0)) return -1;
-
-  for (i=0; i<k; i++) r_eff_k[i] = 100000000;
-  r_e1 = 0;
-
-  for (rr=0; rr<m1; rr++){
-    start = ((rr*k)/m1) % k;
-    end = (((rr+c1)*k)/m1) % k;
-    for (cc=start, first_flag=1; first_flag || cc!=end; cc=(cc+1)%k){
-      first_flag = 0;
-      r_eff_k[cc] = std::min(r_eff_k[cc], ((rr+c1)*k)/m1 - (rr*k)/m1);
-    }
-    r_e1 += ((rr+c1)*k)/m1 - (rr*k)/m1;
-  }
-
-  for (rr=0; rr<m2; rr++){
-    start = ((rr*k)/m2) % k;
-    end = (((rr+c2)*k)/m2) % k;
-    for (cc=start, first_flag=1; first_flag || cc!=end; cc=(cc+1)%k){
-      first_flag = 0;
-      r_eff_k[cc] = std::min(r_eff_k[cc], ((rr+c2)*k)/m2 - (rr*k)/m2);
-    }
-    r_e1 += ((rr+c2)*k)/m2 - (rr*k)/m2;
-  }
-
-  for (i=0; i<k; i++){
-    r_e1 += r_eff_k[i];
-  }
-
-  r_e1 /= (k+m1+m2);
-
-  return r_e1;
-}
-
-int *shec_reedsolomon_coding_matrix(int k, int m, int c, int w, int is_single)
-{
-  int *matrix;
-  int rr, cc, start, end;
-  int m1, m2, c1, c2;
-
-  if (w != 8 && w != 16 && w != 32) return NULL;
-
-  if (!is_single){
-    int c1_best = -1, m1_best = -1;
-    double min_r_e1 = 100.0;
-
-    // create all multiple shec pattern and choose best.
-
-    for (c1=0; c1 <= c/2; c1++){
-      for (m1=0; m1 <= m; m1++){
-       c2 = c-c1;
-       m2 = m-m1;
-
-       if (m1 < c1 || m2 < c2) continue;
-       if ((m1 == 0 && c1 != 0) || (m2 == 0 && c2 != 0)) continue;
-       if ((m1 != 0 && c1 == 0) || (m2 != 0 && c2 == 0)) continue;
-
-       // minimize r_e1
-
-       if (true) {
-         double r_e1;
-         r_e1 = shec_calc_recovery_efficiency1(k, m1, m2, c1, c2);
-         if (r_e1 < min_r_e1){
-           min_r_e1 = r_e1;
-           c1_best = c1;
-           m1_best = m1;
-         }
-       }
-      }
-    }
-    m1 = m1_best;
-    c1 = c1_best;
-    m2 = m - m1_best;
-    c2 = c - c1_best;
-  } else {
-    m1 = 0;
-    c1 = 0;
-    m2 = m;
-    c2 = c;
-  }
-
-  // create matrix
-  matrix = reed_sol_vandermonde_coding_matrix(k, m, w);
-
-  for (rr=0; rr<m1; rr++){
-    end = ((rr*k)/m1) % k;
-    start = (((rr+c1)*k)/m1) % k;
-    for (cc=start; cc!=end; cc=(cc+1)%k){
-      matrix[cc + rr*k] = 0;
-    }
-  }
-
-  for (rr=0; rr<m2; rr++){
-    end = ((rr*k)/m2) % k;
-    start = (((rr+c2)*k)/m2) % k;
-    for (cc=start; cc!=end; cc=(cc+1)%k){
-      matrix[cc + (rr+m1)*k] = 0;
-    }
-  }
-
-  return matrix;
-}
-
-int shec_make_decoding_matrix(bool prepare, int k, int m, int w, int *matrix, int *erased, int *avails, int *decoding_matrix, int *dm_ids, int *minimum)
-{
-  int i, j, det = 0;
-  int ek;
-  int *tmpmat = NULL, tmprow[k+m], element, dup, mindup;
-
-  for (i = 0, j = 0, ek = 0; i < k; i++) {
-    if (erased[i] == 1) {
-      ek++;
-    } else {
-      dm_ids[j] = i;
-      j++;
-    }
-  }
-
-  tmpmat = talloc(int, k*k);
-  if (tmpmat == NULL) { return -1; }
-  for (i = 0; i < k-ek; i++) {
-    for (j = 0; j < k; j++) tmpmat[i*k+j] = 0;
-    tmpmat[i*k+dm_ids[i]] = 1;
-  }
-
-  if (ek > m){
-    free(tmpmat);
-    return -1;
-  }
-
-  mindup = k+1;
-  int minc[ek];
-  for (i=0; i<ek; i++){
-    minc[i] = -1;
-  }
-  int p[ek];
-  int pp[k+m];
-  for (i=0; i<ek; i++){
-    pp[i] = 1;
-  }
-  for (i=ek; i<m; i++){
-    pp[i] = 0;
-  }
-
-  do {
-    i=0;
-    for (j=0; j<m; j++){
-      if (pp[j]){
-       p[i++] = j;
-      }
-    }
-
-    bool ok = true;
-    for (i = 0; i < ek; i++) {
-      if (erased[k+p[i]] == 1 || avails[k+p[i]] == 0) ok = false;
-      for (j = 0; j < k; j++) {
-       element = matrix[(p[i])*k+j];
-       if (element != 0) {
-         if (erased[j] == 0 && avails[j] == 0) ok = false;
-       }
-      }
-    }
-    if (ok == false) continue;
-
-    for (i = 0; i < k+m; i++) tmprow[i] = 0;
-    for (i = 0; i < m; i++) {
-      if (erased[k+i] == 1) {
-       for (j = 0; j < k; j++) {
-         if (matrix[i*k+j] != 0 && erased[j] == 0) tmprow[j] = 1;
-       }
-      }
-    }
-    for (i = 0; i < ek; i++) {
-      tmprow[k+p[i]] = 1;
-      for (j = 0; j < k; j++) {
-       element = matrix[(p[i])*k+j];
-       tmpmat[(k-ek+i)*k+j] = element;
-       if (element != 0 && erased[j] == 0) tmprow[j] = 1;
-      }
-    }
-    dup = 0;
-    for (j = 0; j < k; j++) {
-      if (tmprow[j] > 0) dup++;
-    }
-    if (dup < mindup) {
-      det = calc_determinant(tmpmat, k);
-      if (det != 0) {
-       mindup = dup;
-       for (int i=0; i<ek; i++){
-         minc[i] = p[i];
-       }
-      }
-    }
-  } while (std::prev_permutation(pp, pp+m));
-
-  if (minc[0] == -1 && mindup == k+1) {
-    fprintf(stderr, "shec_make_decoding_matrix(): can't find recover matrix.\n");
-    free(tmpmat);
-    return -1;
-  }
-
-  for (i = 0; i < k+m; i++) minimum[i] = 0;
-  for (i = 0; i < m; i++) {
-    if (erased[k+i] == 1) {
-      for (j = 0; j < k; j++) {
-       if (matrix[i*k+j] != 0 && erased[j] == 0) minimum[j] = 1;
-      }
-    }
-  }
-  for (i = 0; i < ek; i++) {
-    dm_ids[k-ek+i] = k+minc[i];
-    minimum[k+minc[i]] = 1;
-    for (j = 0; j < k; j++) {
-      element = matrix[(minc[i])*k+j];
-      tmpmat[(k-ek+i)*k+j] = element;
-      if (element != 0 && erased[j] == 0) minimum[j] = 1;
-    }
-  }
-
-  if (prepare == true) {
-    free(tmpmat);
-    return 0;
-  }
-
-  i = jerasure_invert_matrix(tmpmat, decoding_matrix, k, w);
-
-  free(tmpmat);
-
-  return i;
-}
-
-int shec_matrix_decode(int k, int m, int w, int *matrix,
-                      int *erased, int *avails, char **data_ptrs, char **coding_ptrs, int size)
-{
-  int i, edd;
-  int *decoding_matrix = NULL, dm_ids[k];
-  int minimum[k + m];
-
-  memset(dm_ids, 0, sizeof(dm_ids));
-
-  if (w != 8 && w != 16 && w != 32) return -1;
-
-  /* Find the number of data drives failed */
-
-  edd = 0;
-  for (i = 0; i < k; i++) {
-    if (erased[i]) {
-      edd++;
-    }
-  }
-
-  decoding_matrix = talloc(int, k*k);
-  if (decoding_matrix == NULL) { return -1; }
-
-  if (shec_make_decoding_matrix(false, k, m, w, matrix, erased,
-                               avails, decoding_matrix, dm_ids, minimum) < 0) {
-    free(decoding_matrix);
-    return -1;
-  }
-
-  /* Decode the data drives */
-
-  for (i = 0; edd > 0 && i < k; i++) {
-    if (erased[i]) {
-      jerasure_matrix_dotprod(k, w, decoding_matrix+(i*k),
-                             dm_ids, i, data_ptrs, coding_ptrs, size);
-      edd--;
-    }
-  }
-
-  /* Re-encode any erased coding devices */
-
-  for (i = 0; i < m; i++) {
-    if (erased[k+i]) {
-      jerasure_matrix_dotprod(k, w, matrix+(i*k), NULL, i+k,
-                             data_ptrs, coding_ptrs, size);
-    }
-  }
-
-  if (decoding_matrix != NULL) free(decoding_matrix);
-
-  return 0;
-}
diff --git a/src/erasure-code/shec/shec.h b/src/erasure-code/shec/shec.h
deleted file mode 100755 (executable)
index fe4471f..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-// vim: ts=8 sw=2 smarttab
-/*
- * Ceph - scalable distributed file system
- *
- * Copyright (C) 2014 FUJITSU LIMITED
- * Copyright (C) 2014, James S. Plank and Kevin Greenan
- *
- * Author: Takanori Nakao <nakao.takanori@jp.fujitsu.com>
- * Author: Takeshi Miyamae <miyamae.takeshi@jp.fujitsu.com>
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- */
-
-/* Jerasure's authors:
-
-   Revision 2.x - 2014: James S. Plank and Kevin M. Greenan
-   Revision 1.2 - 2008: James S. Plank, Scott Simmerman and Catherine D. Schuman.
-   Revision 1.0 - 2007: James S. Plank
- */
-
-#ifndef SHEC_H
-#define SHEC_H
-
-int *shec_reedsolomon_coding_matrix(int k, int m, int c, int w, int is_single);
-int shec_make_decoding_matrix(bool prepare, int k, int m, int w, int *matrix,
-    int *erased, int *avails, int *decoding_matrix, int *dm_ids, int *minimum);
-int shec_matrix_decode(int k, int m, int w, int *matrix,
-    int *erased, int *avails, char **data_ptrs, char **coding_ptrs, int size);
-
-#endif