else if (verity_handle_err(v,
                                           DM_VERITY_BLOCK_TYPE_METADATA,
                                           hash_block)) {
-                       struct bio *bio =
-                               dm_bio_from_per_bio_data(io,
-                                                        v->ti->per_io_data_size);
+                       struct bio *bio;
+                       io->had_mismatch = true;
+                       bio = dm_bio_from_per_bio_data(io, v->ti->per_io_data_size);
                        dm_audit_log_bio(DM_MSG_PREFIX, "verify-metadata", bio,
                                         block, 0);
                        r = -EIO;
                return -EIO; /* Error correction failed; Just return error */
 
        if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA, blkno)) {
+               io->had_mismatch = true;
                dm_audit_log_bio(DM_MSG_PREFIX, "verify-data", bio, blkno, 0);
                return -EIO;
        }
 
        if (unlikely(status != BLK_STS_OK) &&
            unlikely(!(bio->bi_opf & REQ_RAHEAD)) &&
+           !io->had_mismatch &&
            !verity_is_system_shutting_down()) {
                if (v->error_mode == DM_VERITY_MODE_PANIC) {
                        panic("dm-verity device has I/O error");
        io->orig_bi_end_io = bio->bi_end_io;
        io->block = bio->bi_iter.bi_sector >> (v->data_dev_block_bits - SECTOR_SHIFT);
        io->n_blocks = bio->bi_iter.bi_size >> v->data_dev_block_bits;
+       io->had_mismatch = false;
 
        bio->bi_end_io = verity_end_io;
        bio->bi_private = io;