btrfs_subpage_end_reader(fs_info, page, start, len);
 }
 
-static blk_status_t submit_data_read_repair(struct inode *inode,
-                                           struct bio *failed_bio,
-                                           u32 bio_offset, struct page *page,
-                                           unsigned int pgoff,
-                                           u64 start, u64 end,
-                                           int failed_mirror,
-                                           unsigned int error_bitmap)
+static void submit_data_read_repair(struct inode *inode, struct bio *failed_bio,
+                                   u32 bio_offset, const struct bio_vec *bvec,
+                                   int failed_mirror, unsigned int error_bitmap)
 {
+       const unsigned int pgoff = bvec->bv_offset;
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
+       struct page *page = bvec->bv_page;
+       const u64 start = page_offset(bvec->bv_page) + bvec->bv_offset;
+       const u64 end = start + bvec->bv_len - 1;
        const u32 sectorsize = fs_info->sectorsize;
        const int nr_bits = (end + 1 - start) >> fs_info->sectorsize_bits;
-       int error = 0;
        int i;
 
        BUG_ON(bio_op(failed_bio) == REQ_OP_WRITE);
                        continue;
                }
                /*
-                * Repair failed, just record the error but still continue.
-                * Or the remaining sectors will not be properly unlocked.
+                * Continue on failed repair, otherwise the remaining sectors
+                * will not be properly unlocked.
                 */
-               if (!error)
-                       error = ret;
 next:
                end_page_read(page, uptodate, start + offset, sectorsize);
                if (uptodate)
                                start + offset + sectorsize - 1,
                                &cached);
        }
-       return errno_to_blk_status(error);
 }
 
 /* lots and lots of room for performance fixes in the end_bio funcs */
                         * submit_data_read_repair() will handle all the good
                         * and bad sectors, we just continue to the next bvec.
                         */
-                       submit_data_read_repair(inode, bio, bio_offset, page,
-                                               start - page_offset(page),
-                                               start, end, mirror,
-                                               error_bitmap);
+                       submit_data_read_repair(inode, bio, bio_offset, bvec,
+                                               mirror, error_bitmap);
 
                        ASSERT(bio_offset + len > bio_offset);
                        bio_offset += len;