The log message for a FEC error or correction includes the data device
name and index_in_region as the context.  Although the result of FEC
(for a particular dm-verity instance) is expected to be the same for a
given index_in_region, index_in_region does not uniquely identify the
actual target block that is being corrected.  Since that value
(target_block) is likely more useful, log it instead.

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

diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c
index 59ff3d58f49df..fbe01f809aca3 100644
--- a/drivers/md/dm-verity-fec.c
+++ b/drivers/md/dm-verity-fec.c
@@ -47,12 +47,13 @@ static inline u8 *fec_buffer_rs_message(struct dm_verity *v,
 /*
  * Decode all RS codewords whose message bytes were loaded into fio->bufs.  
Copy
  * the corrected bytes into fio->output starting from out_pos.
  */
 static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_io *io,
-                          struct dm_verity_fec_io *fio, u64 index_in_region,
-                          int target_region, unsigned int out_pos, int neras)
+                          struct dm_verity_fec_io *fio, u64 target_block,
+                          unsigned int target_region, u64 index_in_region,
+                          unsigned int out_pos, int neras)
 {
        int r = 0, corrected = 0, res;
        struct dm_buffer *buf;
        unsigned int n, i, j, parity_pos, to_copy;
        uint16_t par_buf[DM_VERITY_FEC_MAX_ROOTS];
@@ -73,11 +74,11 @@ static int fec_decode_bufs(struct dm_verity *v, struct 
dm_verity_io *io,
        parity_block >>= v->data_dev_block_bits;
        par = dm_bufio_read_with_ioprio(v->fec->bufio, parity_block, &buf,
                                        bio->bi_ioprio);
        if (IS_ERR(par)) {
                DMERR("%s: FEC %llu: parity read failed (block %llu): %ld",
-                     v->data_dev->name, index_in_region, parity_block,
+                     v->data_dev->name, target_block, parity_block,
                      PTR_ERR(par));
                return PTR_ERR(par);
        }
 
        /*
@@ -103,11 +104,11 @@ static int fec_decode_bufs(struct dm_verity *v, struct 
dm_verity_io *io,
                        par = dm_bufio_read_with_ioprio(v->fec->bufio,
                                                        parity_block, &buf,
                                                        bio->bi_ioprio);
                        if (IS_ERR(par)) {
                                DMERR("%s: FEC %llu: parity read failed (block 
%llu): %ld",
-                                     v->data_dev->name, index_in_region,
+                                     v->data_dev->name, target_block,
                                      parity_block, PTR_ERR(par));
                                return PTR_ERR(par);
                        }
                        for (; j < v->fec->roots; j++)
                                par_buf[j] = par[parity_pos++];
@@ -129,14 +130,14 @@ static int fec_decode_bufs(struct dm_verity *v, struct 
dm_verity_io *io,
 done:
        dm_bufio_release(buf);
 
        if (r < 0 && neras)
                DMERR_LIMIT("%s: FEC %llu: failed to correct: %d",
-                           v->data_dev->name, index_in_region, r);
+                           v->data_dev->name, target_block, r);
        else if (r == 0 && corrected > 0)
                DMWARN_LIMIT("%s: FEC %llu: corrected %d errors",
-                            v->data_dev->name, index_in_region, corrected);
+                            v->data_dev->name, target_block, corrected);
 
        return r;
 }
 
 /*
@@ -155,11 +156,12 @@ static int fec_is_erasure(struct dm_verity *v, struct 
dm_verity_io *io,
 /*
  * Read data blocks that are part of the RS block and deinterleave as much as
  * fits into buffers. Check for erasure locations if @neras is non-NULL.
  */
 static int fec_read_bufs(struct dm_verity *v, struct dm_verity_io *io,
-                        u64 index_in_region, unsigned int out_pos, int *neras)
+                        u64 target_block, u64 index_in_region,
+                        unsigned int out_pos, int *neras)
 {
        bool is_zero;
        int i, j;
        struct dm_buffer *buf;
        struct dm_bufio_client *bufio;
@@ -199,11 +201,11 @@ static int fec_read_bufs(struct dm_verity *v, struct 
dm_verity_io *io,
                }
 
                bbuf = dm_bufio_read_with_ioprio(bufio, block, &buf, 
bio->bi_ioprio);
                if (IS_ERR(bbuf)) {
                        DMWARN_LIMIT("%s: FEC %llu: read failed (%llu): %ld",
-                                    v->data_dev->name, index_in_region, block,
+                                    v->data_dev->name, target_block, block,
                                     PTR_ERR(bbuf));
 
                        /* assume the block is corrupted */
                        if (neras && *neras <= v->fec->roots)
                                fio->erasures[(*neras)++] = i;
@@ -324,17 +326,17 @@ static int fec_decode(struct dm_verity *v, struct 
dm_verity_io *io,
                return -EIO;
 
        for (out_pos = 0; out_pos < v->fec->block_size;) {
                fec_init_bufs(v, fio);
 
-               r = fec_read_bufs(v, io, index_in_region, out_pos,
+               r = fec_read_bufs(v, io, target_block, index_in_region, out_pos,
                                  use_erasures ? &neras : NULL);
                if (unlikely(r < 0))
                        return r;
 
-               r = fec_decode_bufs(v, io, fio, index_in_region, target_region,
-                                   out_pos, neras);
+               r = fec_decode_bufs(v, io, fio, target_block, target_region,
+                                   index_in_region, out_pos, neras);
                if (r < 0)
                        return r;
 
                out_pos += fio->nbufs << DM_VERITY_FEC_BUF_RS_BITS;
        }
@@ -344,11 +346,11 @@ static int fec_decode(struct dm_verity *v, struct 
dm_verity_io *io,
        if (unlikely(r < 0))
                return r;
 
        if (memcmp(io->tmp_digest, want_digest, v->digest_size)) {
                DMERR_LIMIT("%s: FEC %llu: failed to correct (%d erasures)",
-                           v->data_dev->name, index_in_region, neras);
+                           v->data_dev->name, target_block, neras);
                return -EILSEQ;
        }
 
        return 0;
 }
-- 
2.52.0


Reply via email to