Fix verity_fec_ctr() to reject too-small FEC devices by correctly
computing the number of parity blocks as 'f->rounds * f->roots'.
Previously it incorrectly used 'div64_u64(f->rounds * f->roots,
v->fec->roots << SECTOR_SHIFT)' which is a much smaller value.

Note that the units of 'rounds' are blocks, not bytes.  This matches the
units of the value returned by dm_bufio_get_device_size(), which are
also blocks.  A later commit will give 'rounds' a clearer name.

Fixes: a739ff3f543a ("dm verity: add support for forward error correction")
Cc: [email protected]
Signed-off-by: Eric Biggers <[email protected]>
---
 drivers/md/dm-verity-fec.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c
index 7583607a8aa62..5c276d0fc20c0 100644
--- a/drivers/md/dm-verity-fec.c
+++ b/drivers/md/dm-verity-fec.c
@@ -623,11 +623,11 @@ int verity_fec_ctr_alloc(struct dm_verity *v)
  */
 int verity_fec_ctr(struct dm_verity *v)
 {
        struct dm_verity_fec *f = v->fec;
        struct dm_target *ti = v->ti;
-       u64 hash_blocks, fec_blocks;
+       u64 hash_blocks;
        int ret;
 
        if (!verity_fec_is_enabled(v)) {
                verity_fec_dtr(v);
                return 0;
@@ -704,12 +704,11 @@ int verity_fec_ctr(struct dm_verity *v)
                return PTR_ERR(f->bufio);
        }
 
        dm_bufio_set_sector_offset(f->bufio, f->start << 
(v->data_dev_block_bits - SECTOR_SHIFT));
 
-       fec_blocks = div64_u64(f->rounds * f->roots, v->fec->roots << 
SECTOR_SHIFT);
-       if (dm_bufio_get_device_size(f->bufio) < fec_blocks) {
+       if (dm_bufio_get_device_size(f->bufio) < f->rounds * f->roots) {
                ti->error = "FEC device is too small";
                return -E2BIG;
        }
 
        f->data_bufio = dm_bufio_client_create(v->data_dev->bdev,
-- 
2.52.0


Reply via email to