To compute 'rsb', verity_fec_decode() divides 'offset' by
'v->fec->region_blocks << v->data_dev_block_bits', then subtracts the
quotient times that divisor.  That's simply the long way to do a modulo
operation, i.e. a - b * floor(a / b) instead of just a % b.  Use
div64_u64_rem() to get the remainder more concisely.

Signed-off-by: Eric Biggers <[email protected]>
---
 drivers/md/dm-verity-fec.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c
index 28b47497c3d3f..63eeef26a3999 100644
--- a/drivers/md/dm-verity-fec.c
+++ b/drivers/md/dm-verity-fec.c
@@ -375,11 +375,11 @@ int verity_fec_decode(struct dm_verity *v, struct 
dm_verity_io *io,
                      enum verity_block_type type, const u8 *want_digest,
                      sector_t block, u8 *dest)
 {
        int r;
        struct dm_verity_fec_io *fio;
-       u64 offset, res, rsb;
+       u64 offset, rsb;
 
        if (!verity_fec_is_enabled(v))
                return -EOPNOTSUPP;
 
        fio = io->fec_io;
@@ -403,17 +403,17 @@ int verity_fec_decode(struct dm_verity *v, struct 
dm_verity_io *io,
         * and each code is interleaved over k blocks to make it less likely
         * that bursty corruption will leave us in unrecoverable state.
         */
 
        offset = block << v->data_dev_block_bits;
-       res = div64_u64(offset, v->fec->region_blocks << 
v->data_dev_block_bits);
 
        /*
         * The base RS block we can feed to the interleaver to find out all
         * blocks required for decoding.
         */
-       rsb = offset - res * (v->fec->region_blocks << v->data_dev_block_bits);
+       div64_u64_rem(offset, v->fec->region_blocks << v->data_dev_block_bits,
+                     &rsb);
 
        /*
         * Locating erasures is slow, so attempt to recover the block without
         * them first. Do a second attempt with erasures if the corruption is
         * bad enough.
-- 
2.52.0


Reply via email to