btrfs: avoid access to .bi_vcnt directly
authorMing Lei <ming.lei@redhat.com>
Mon, 18 Dec 2017 12:22:11 +0000 (20:22 +0800)
committerJens Axboe <axboe@kernel.dk>
Sat, 6 Jan 2018 16:18:00 +0000 (09:18 -0700)
BTRFS uses bio->bi_vcnt to figure out page numbers, this approach is no
longer valid once we start enabling multipage bvecs.
correct once we start to enable multipage bvec.

Use bio_nr_pages() to do that instead.

Cc: Chris Mason <clm@fb.com>
Cc: Josef Bacik <jbacik@fb.com>
Cc: David Sterba <dsterba@suse.com>
Cc: linux-btrfs@vger.kernel.org
Acked-by: David Sterba <dsterba@suse.com>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/btrfs/extent_io.c
fs/btrfs/extent_io.h

index 69cd63d4503dfcbf1b4b30e55ce3d47b399f195c..d43360b33ef67fb2e042504e6508e4f2097fede4 100644 (file)
@@ -2257,7 +2257,7 @@ int btrfs_get_io_failure_record(struct inode *inode, u64 start, u64 end,
        return 0;
 }
 
-bool btrfs_check_repairable(struct inode *inode, struct bio *failed_bio,
+bool btrfs_check_repairable(struct inode *inode, unsigned failed_bio_pages,
                           struct io_failure_record *failrec, int failed_mirror)
 {
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
@@ -2281,7 +2281,7 @@ bool btrfs_check_repairable(struct inode *inode, struct bio *failed_bio,
         *      a) deliver good data to the caller
         *      b) correct the bad sectors on disk
         */
-       if (failed_bio->bi_vcnt > 1) {
+       if (failed_bio_pages > 1) {
                /*
                 * 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,
@@ -2374,6 +2374,7 @@ static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset,
        int read_mode = 0;
        blk_status_t status;
        int ret;
+       unsigned failed_bio_pages = bio_pages_all(failed_bio);
 
        BUG_ON(bio_op(failed_bio) == REQ_OP_WRITE);
 
@@ -2381,13 +2382,13 @@ static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset,
        if (ret)
                return ret;
 
-       if (!btrfs_check_repairable(inode, failed_bio, failrec,
+       if (!btrfs_check_repairable(inode, failed_bio_pages, failrec,
                                    failed_mirror)) {
                free_io_failure(failure_tree, tree, failrec);
                return -EIO;
        }
 
-       if (failed_bio->bi_vcnt > 1)
+       if (failed_bio_pages > 1)
                read_mode |= REQ_FAILFAST_DEV;
 
        phy_offset >>= inode->i_sb->s_blocksize_bits;
index 93dcae0c3183009c3668dfa34b449051c7576719..20854d63c75b79f26cebf9d144e129672422782e 100644 (file)
@@ -540,7 +540,7 @@ void btrfs_free_io_failure_record(struct btrfs_inode *inode, u64 start,
                u64 end);
 int btrfs_get_io_failure_record(struct inode *inode, u64 start, u64 end,
                                struct io_failure_record **failrec_ret);
-bool btrfs_check_repairable(struct inode *inode, struct bio *failed_bio,
+bool btrfs_check_repairable(struct inode *inode, unsigned failed_bio_pages,
                            struct io_failure_record *failrec, int fail_mirror);
 struct bio *btrfs_create_repair_bio(struct inode *inode, struct bio *failed_bio,
                                    struct io_failure_record *failrec,