]> git.baikalelectronics.ru Git - kernel.git/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 May 2023 09:35:57 +0000 (11:35 +0200)
[ Upstream commit 7ade3849b2fd7ea2bd53b610af6334ae683c4124 ]

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>
Stable-dep-of: e8c5d45f82ce ("dm verity: fix error handling for check_at_most_once on FEC")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/md/dm-verity-target.c

index 9dcdf34b7e32dc5f0887702824b4b1b1c70c445f..aad0018cc7b2d74fded2c3a0d0624a388fa78eb9 100644 (file)
@@ -471,6 +471,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;
@@ -525,9 +526,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;