+10
-21
drivers/md/dm-verity-fec.c
+10
-21
drivers/md/dm-verity-fec.c
···
40
40
}
41
41
42
42
/*
43
-
* Decode an RS block using Reed-Solomon.
44
-
*/
45
-
static int fec_decode_rs8(struct dm_verity *v, struct dm_verity_fec_io *fio,
46
-
u8 *data, u8 *fec, int neras)
47
-
{
48
-
int i;
49
-
uint16_t par[DM_VERITY_FEC_RSM - DM_VERITY_FEC_MIN_RSN];
50
-
51
-
for (i = 0; i < v->fec->roots; i++)
52
-
par[i] = fec[i];
53
-
54
-
return decode_rs8(fio->rs, data, par, v->fec->rsn, NULL, neras,
55
-
fio->erasures, 0, NULL);
56
-
}
57
-
58
-
/*
59
43
* Read error-correcting codes for the requested RS block. Returns a pointer
60
44
* to the data block. Caller is responsible for releasing buf.
61
45
*/
···
116
132
{
117
133
int r, corrected = 0, res;
118
134
struct dm_buffer *buf;
119
-
unsigned int n, i, offset, par_buf_offset = 0;
120
-
u8 *par, *block, par_buf[DM_VERITY_FEC_RSM - DM_VERITY_FEC_MIN_RSN];
135
+
unsigned int n, i, j, offset, par_buf_offset = 0;
136
+
uint16_t par_buf[DM_VERITY_FEC_RSM - DM_VERITY_FEC_MIN_RSN];
137
+
u8 *par, *block;
121
138
struct bio *bio = dm_bio_from_per_bio_data(io, v->ti->per_io_data_size);
122
139
123
140
par = fec_read_parity(v, rsb, block_offset, &offset,
···
132
147
*/
133
148
fec_for_each_buffer_rs_block(fio, n, i) {
134
149
block = fec_buffer_rs_block(v, fio, n, i);
135
-
memcpy(&par_buf[par_buf_offset], &par[offset], v->fec->roots - par_buf_offset);
136
-
res = fec_decode_rs8(v, fio, block, par_buf, neras);
150
+
for (j = 0; j < v->fec->roots - par_buf_offset; j++)
151
+
par_buf[par_buf_offset + j] = par[offset + j];
152
+
/* Decode an RS block using Reed-Solomon */
153
+
res = decode_rs8(fio->rs, block, par_buf, v->fec->rsn,
154
+
NULL, neras, fio->erasures, 0, NULL);
137
155
if (res < 0) {
138
156
r = res;
139
157
goto error;
···
154
166
/* Check if parity bytes are split between blocks */
155
167
if (offset < v->fec->io_size && (offset + v->fec->roots) > v->fec->io_size) {
156
168
par_buf_offset = v->fec->io_size - offset;
157
-
memcpy(par_buf, &par[offset], par_buf_offset);
169
+
for (j = 0; j < par_buf_offset; j++)
170
+
par_buf[j] = par[offset + j];
158
171
offset += par_buf_offset;
159
172
} else
160
173
par_buf_offset = 0;