dm verity: skip redundant verity_handle_err() on I/O errors
authorAkilesh Kailash <akailash@google.com>
Mon, 13 Sep 2021 09:26:42 +0000 (09:26 +0000)
committerMike Snitzer <snitzer@redhat.com>
Tue, 12 Oct 2021 17:54:09 +0000 (13:54 -0400)
Without FEC, dm-verity won't call verity_handle_err() when I/O fails,
but with FEC enabled, it currently does even if an I/O error has
occurred.

If there is an I/O error and FEC correction fails, return the error
instead of calling verity_handle_err() again.

Suggested-by: Sami Tolvanen <samitolvanen@google.com>
Signed-off-by: Akilesh Kailash <akailash@google.com>
Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-verity-target.c

index 22a5ac8..88288c8 100644 (file)
@@ -475,6 +475,7 @@ static int verity_verify_io(struct dm_verity_io *io)
        struct bvec_iter start;
        unsigned b;
        struct crypto_wait wait;
+       struct bio *bio = dm_bio_from_per_bio_data(io, v->ti->per_io_data_size);
 
        for (b = 0; b < io->n_blocks; b++) {
                int r;
@@ -529,9 +530,17 @@ static int verity_verify_io(struct dm_verity_io *io)
                else if (verity_fec_decode(v, io, DM_VERITY_BLOCK_TYPE_DATA,
                                           cur_block, NULL, &start) == 0)
                        continue;
-               else if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA,
-                                          cur_block))
-                       return -EIO;
+               else {
+                       if (bio->bi_status) {
+                               /*
+                                * Error correction failed; Just return error
+                                */
+                               return -EIO;
+                       }
+                       if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA,
+                                             cur_block))
+                               return -EIO;
+               }
        }
 
        return 0;