mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 20:14:06 +02:00
dm-verity-fec: simplify computation of ileaved
fec_read_bufs() just iterates over a sequence of message blocks with
step size region_blocks. At each step, 'ileaved' is just the offset (in
bytes) to one of these blocks. Compute it in the straightforward way,
eliminating fec_interleave().
In more detail, previously the code computed
'ileaved = (n / k) + (n % k) * (region_blocks * block_size)'
where n = rsb * k + i and 0 <= i < k. Substituting 'n' gives:
ileaved = ((rsb * k + i) / k) + ((rsb * k + i) % k) * region_blocks * block_size
= rsb + (i * region_blocks * block_size)
The result is more efficient and easier to understand.
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
This commit is contained in:
parent
8ef45923fd
commit
5ef22361fa
|
|
@ -23,17 +23,6 @@ static inline unsigned int fec_max_nbufs(struct dm_verity *v)
|
|||
return 1 << (v->data_dev_block_bits - DM_VERITY_FEC_BUF_RS_BITS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return an interleaved offset for a byte in RS block.
|
||||
*/
|
||||
static inline u64 fec_interleave(struct dm_verity *v, u64 offset)
|
||||
{
|
||||
u32 mod;
|
||||
|
||||
mod = do_div(offset, v->fec->rs_k);
|
||||
return offset + mod * (v->fec->region_blocks << v->data_dev_block_bits);
|
||||
}
|
||||
|
||||
/* Loop over each allocated buffer. */
|
||||
#define fec_for_each_buffer(io, __i) \
|
||||
for (__i = 0; __i < (io)->nbufs; __i++)
|
||||
|
|
@ -204,7 +193,7 @@ static int fec_read_bufs(struct dm_verity *v, struct dm_verity_io *io,
|
|||
* interleave contents to available bufs
|
||||
*/
|
||||
for (i = 0; i < v->fec->rs_k; i++) {
|
||||
ileaved = fec_interleave(v, rsb * v->fec->rs_k + i);
|
||||
ileaved = rsb + i * (v->fec->region_blocks << v->data_dev_block_bits);
|
||||
|
||||
/*
|
||||
* target is the data block we want to correct, target_index is
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user