@@ -116,17 +116,49 @@ int ErasureCodeIsa::decode_chunks(const set<int> &want_to_read,
116116
117117// -----------------------------------------------------------------------------
118118
119+ void
120+ ErasureCodeIsa::isa_xor (char **data, char **coding, int blocksize)
121+ {
122+ // If addresses are aligned to 32 bytes, then we can use xor_gen()
123+ // Otherwise, use byte_xor()
124+ int i;
125+ bool src_aligned = true ;
126+
127+ for (i = 0 ; i < k; i++) {
128+ src_aligned &= is_aligned (data[i], EC_ISA_ADDRESS_ALIGNMENT);
129+ }
130+
131+ if (src_aligned && is_aligned (coding[0 ], EC_ISA_ADDRESS_ALIGNMENT)) {
132+ xor_gen (k+1 , blocksize, (void **) data);
133+ }
134+ else {
135+ memcpy (coding[0 ], data[0 ], blocksize);
136+ for (i = 1 ; i < k; i++) {
137+ byte_xor (data[i], coding[0 ], data[i]+blocksize);
138+ }
139+ }
140+ }
141+
142+ void
143+ ErasureCodeIsa::byte_xor (char *data, char *coding, char *data_end)
144+ {
145+ while (data < data_end)
146+ *coding++ ^= *data++;
147+ }
148+
149+ // -----------------------------------------------------------------------------
150+
119151void
120152ErasureCodeIsaDefault::isa_encode (char **data,
121153 char **coding,
122154 int blocksize)
123155{
124- if (m == 1 )
125- // single parity stripe
126- xor_gen (k+m, blocksize, (void **) data);
127- else
156+ if (m == 1 ) {
157+ isa_xor (data, coding, blocksize);
158+ } else {
128159 ec_encode_data (blocksize, k, m, encode_tbls,
129160 (unsigned char **) data, (unsigned char **) coding);
161+ }
130162}
131163
132164// -----------------------------------------------------------------------------
@@ -158,7 +190,7 @@ ErasureCodeIsaDefault::isa_decode(int *erasures,
158190
159191 unsigned char *recover_source[k];
160192 unsigned char *recover_target[m];
161- unsigned char *recover_buf[k+1 ];
193+ char *recover_buf[k+1 ];
162194
163195 // count the errors
164196 for (int l = 0 ; erasures[l] != -1 ; l++) {
@@ -181,18 +213,18 @@ ErasureCodeIsaDefault::isa_decode(int *erasures,
181213 for (i = 0 ; i < (k + 1 ); i++) {
182214 if (erasure_contains (erasures, i)) {
183215 if (i < k) {
184- recover_buf[i] = ( unsigned char *) coding[0 ];
185- recover_buf[k] = ( unsigned char *) data[i];
216+ recover_buf[i] = coding[0 ];
217+ recover_buf[k] = data[i];
186218 parity_set = true ;
187219 } else {
188- recover_buf[i] = ( unsigned char *) coding[0 ];
220+ recover_buf[i] = coding[0 ];
189221 }
190222 } else {
191223 if (i < k) {
192- recover_buf[i] = ( unsigned char *) data[i];
224+ recover_buf[i] = data[i];
193225 } else {
194226 if (!parity_set) {
195- recover_buf[i] = ( unsigned char *) coding[0 ];
227+ recover_buf[i] = coding[0 ];
196228 }
197229 }
198230 }
@@ -230,7 +262,7 @@ ErasureCodeIsaDefault::isa_decode(int *erasures,
230262 ((matrixtype == kVandermonde ) && (nerrs == 1 ) && (erasures[0 ] < (k + 1 )))) {
231263 // single parity decoding
232264 dout (20 ) << " isa_decode: reconstruct using xor_gen [" << erasures[0 ] << " ]" << dendl;
233- xor_gen (k+ 1 , blocksize, ( void **) recover_buf );
265+ isa_xor (recover_buf, &recover_buf[k], blocksize );
234266 return 0 ;
235267 }
236268
0 commit comments