diff options
| author | Eric Biggers <ebiggers@kernel.org> | 2026-02-06 07:59:33 +0300 |
|---|---|---|
| committer | Mikulas Patocka <mpatocka@redhat.com> | 2026-03-09 17:12:53 +0300 |
| commit | 5ef22361fa98a44409f11a10cb7d08b5cbf6d57c (patch) | |
| tree | 34f54298372a6c1e5366854f33e83d902043ce38 | |
| parent | 8ef45923fdcb7ec44e3a965bcbf41723e20814e4 (diff) | |
| download | linux-5ef22361fa98a44409f11a10cb7d08b5cbf6d57c.tar.xz | |
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>
| -rw-r--r-- | drivers/md/dm-verity-fec.c | 13 |
1 files changed, 1 insertions, 12 deletions
diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c index d2c55896e6f7..baf988c29761 100644 --- a/drivers/md/dm-verity-fec.c +++ b/drivers/md/dm-verity-fec.c @@ -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 |
