@@ -39,22 +39,6 @@ static inline u64 fec_interleave(struct dm_verity *v, u64 offset)
39
39
return offset + mod * (v -> fec -> rounds << v -> data_dev_block_bits );
40
40
}
41
41
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
42
/*
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.
@@ -132,8 +116,9 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_io *io,
132
116
{
133
117
int r , corrected = 0 , res ;
134
118
struct dm_buffer * buf ;
135
- unsigned int n , i , offset , par_buf_offset = 0 ;
136
- u8 * par , * block , par_buf [DM_VERITY_FEC_RSM - DM_VERITY_FEC_MIN_RSN ];
119
+ unsigned int n , i , j , offset , par_buf_offset = 0 ;
120
+ uint16_t par_buf [DM_VERITY_FEC_RSM - DM_VERITY_FEC_MIN_RSN ];
121
+ u8 * par , * block ;
137
122
struct bio * bio = dm_bio_from_per_bio_data (io , v -> ti -> per_io_data_size );
138
123
139
124
par = fec_read_parity (v , rsb , block_offset , & offset ,
@@ -147,8 +132,11 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_io *io,
147
132
*/
148
133
fec_for_each_buffer_rs_block (fio , n , i ) {
149
134
block = fec_buffer_rs_block (v , fio , n , i );
150
- memcpy (& par_buf [par_buf_offset ], & par [offset ], v -> fec -> roots - par_buf_offset );
151
- res = fec_decode_rs8 (v , fio , block , par_buf , neras );
135
+ for (j = 0 ; j < v -> fec -> roots - par_buf_offset ; j ++ )
136
+ par_buf [par_buf_offset + j ] = par [offset + j ];
137
+ /* Decode an RS block using Reed-Solomon */
138
+ res = decode_rs8 (fio -> rs , block , par_buf , v -> fec -> rsn ,
139
+ NULL , neras , fio -> erasures , 0 , NULL );
152
140
if (res < 0 ) {
153
141
r = res ;
154
142
goto error ;
@@ -166,7 +154,8 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_io *io,
166
154
/* Check if parity bytes are split between blocks */
167
155
if (offset < v -> fec -> io_size && (offset + v -> fec -> roots ) > v -> fec -> io_size ) {
168
156
par_buf_offset = v -> fec -> io_size - offset ;
169
- memcpy (par_buf , & par [offset ], par_buf_offset );
157
+ for (j = 0 ; j < par_buf_offset ; j ++ )
158
+ par_buf [j ] = par [offset + j ];
170
159
offset += par_buf_offset ;
171
160
} else
172
161
par_buf_offset = 0 ;
0 commit comments