return 0;
 }
 
-bool btrfs_check_repairable(struct inode *inode, unsigned failed_bio_pages,
-                          struct io_failure_record *failrec, int failed_mirror)
+bool btrfs_check_repairable(struct inode *inode, bool needs_validation,
+                           struct io_failure_record *failrec,
+                           int failed_mirror)
 {
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
        int num_copies;
         *      a) deliver good data to the caller
         *      b) correct the bad sectors on disk
         */
-       if (failed_bio_pages > 1) {
+       if (needs_validation) {
                /*
                 * to fulfill b), we need to know the exact failing sectors, as
                 * we don't want to rewrite any more than the failed ones. thus,
        return bio;
 }
 
+static bool btrfs_io_needs_validation(struct inode *inode, struct bio *bio)
+{
+       struct bio_vec *bvec;
+       u64 len = 0;
+       int i;
+
+       /*
+        * We need to validate each sector individually if the failed I/O was
+        * for multiple sectors.
+        */
+       bio_for_each_bvec_all(bvec, bio, i) {
+               len += bvec->bv_len;
+               if (len > inode->i_sb->s_blocksize)
+                       return true;
+       }
+       return false;
+}
+
 /*
  * This is a generic handler for readpage errors. If other copies exist, read
  * those and write back good data to the failed position. Does not investigate
        struct inode *inode = page->mapping->host;
        struct extent_io_tree *tree = &BTRFS_I(inode)->io_tree;
        struct extent_io_tree *failure_tree = &BTRFS_I(inode)->io_failure_tree;
+       bool need_validation;
        struct bio *bio;
        int read_mode = 0;
        blk_status_t status;
        int ret;
-       unsigned failed_bio_pages = failed_bio->bi_iter.bi_size >> PAGE_SHIFT;
 
        BUG_ON(bio_op(failed_bio) == REQ_OP_WRITE);
 
        if (ret)
                return ret;
 
-       if (!btrfs_check_repairable(inode, failed_bio_pages, failrec,
+       need_validation = btrfs_io_needs_validation(inode, failed_bio);
+
+       if (!btrfs_check_repairable(inode, need_validation, failrec,
                                    failed_mirror)) {
                free_io_failure(failure_tree, tree, failrec);
                return -EIO;
        }
 
-       if (failed_bio_pages > 1)
+       if (need_validation)
                read_mode |= REQ_FAILFAST_DEV;
 
        phy_offset >>= inode->i_sb->s_blocksize_bits;
 
 };
 
 
-bool btrfs_check_repairable(struct inode *inode, unsigned failed_bio_pages,
-                           struct io_failure_record *failrec, int fail_mirror);
+bool btrfs_check_repairable(struct inode *inode, bool needs_validation,
+                           struct io_failure_record *failrec,
+                           int failed_mirror);
 struct bio *btrfs_create_repair_bio(struct inode *inode, struct bio *failed_bio,
                                    struct io_failure_record *failrec,
                                    struct page *page, int pg_offset, int icsum,