@@ -39,22 +39,6 @@ static inline u64 fec_interleave(struct dm_verity *v, u64 offset)
3939 return offset + mod * (v -> fec -> rounds << v -> data_dev_block_bits );
4040}
4141
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-
5842/*
5943 * Read error-correcting codes for the requested RS block. Returns a pointer
6044 * 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,
132116{
133117 int r , corrected = 0 , res ;
134118 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 ;
137122 struct bio * bio = dm_bio_from_per_bio_data (io , v -> ti -> per_io_data_size );
138123
139124 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,
147132 */
148133 fec_for_each_buffer_rs_block (fio , n , i ) {
149134 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 );
152140 if (res < 0 ) {
153141 r = res ;
154142 goto error ;
@@ -166,7 +154,8 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_io *io,
166154 /* Check if parity bytes are split between blocks */
167155 if (offset < v -> fec -> io_size && (offset + v -> fec -> roots ) > v -> fec -> io_size ) {
168156 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 ];
170159 offset += par_buf_offset ;
171160 } else
172161 par_buf_offset = 0 ;
0 commit comments