diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index f1a77449d032..d6630dc130ba 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -6779,17 +6779,16 @@ unlock_err: | |||
6779 | static void btrfs_endio_direct_read(struct bio *bio, int err) | 6779 | static void btrfs_endio_direct_read(struct bio *bio, int err) |
6780 | { | 6780 | { |
6781 | struct btrfs_dio_private *dip = bio->bi_private; | 6781 | struct btrfs_dio_private *dip = bio->bi_private; |
6782 | struct bio_vec *bvec_end = bio->bi_io_vec + bio->bi_vcnt - 1; | 6782 | struct bio_vec *bvec; |
6783 | struct bio_vec *bvec = bio->bi_io_vec; | ||
6784 | struct inode *inode = dip->inode; | 6783 | struct inode *inode = dip->inode; |
6785 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6784 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6786 | struct bio *dio_bio; | 6785 | struct bio *dio_bio; |
6787 | u32 *csums = (u32 *)dip->csum; | 6786 | u32 *csums = (u32 *)dip->csum; |
6788 | int index = 0; | ||
6789 | u64 start; | 6787 | u64 start; |
6788 | int i; | ||
6790 | 6789 | ||
6791 | start = dip->logical_offset; | 6790 | start = dip->logical_offset; |
6792 | do { | 6791 | bio_for_each_segment_all(bvec, bio, i) { |
6793 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) { | 6792 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) { |
6794 | struct page *page = bvec->bv_page; | 6793 | struct page *page = bvec->bv_page; |
6795 | char *kaddr; | 6794 | char *kaddr; |
@@ -6805,18 +6804,16 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) | |||
6805 | local_irq_restore(flags); | 6804 | local_irq_restore(flags); |
6806 | 6805 | ||
6807 | flush_dcache_page(bvec->bv_page); | 6806 | flush_dcache_page(bvec->bv_page); |
6808 | if (csum != csums[index]) { | 6807 | if (csum != csums[i]) { |
6809 | btrfs_err(root->fs_info, "csum failed ino %llu off %llu csum %u expected csum %u", | 6808 | btrfs_err(root->fs_info, "csum failed ino %llu off %llu csum %u expected csum %u", |
6810 | btrfs_ino(inode), start, csum, | 6809 | btrfs_ino(inode), start, csum, |
6811 | csums[index]); | 6810 | csums[i]); |
6812 | err = -EIO; | 6811 | err = -EIO; |
6813 | } | 6812 | } |
6814 | } | 6813 | } |
6815 | 6814 | ||
6816 | start += bvec->bv_len; | 6815 | start += bvec->bv_len; |
6817 | bvec++; | 6816 | } |
6818 | index++; | ||
6819 | } while (bvec <= bvec_end); | ||
6820 | 6817 | ||
6821 | unlock_extent(&BTRFS_I(inode)->io_tree, dip->logical_offset, | 6818 | unlock_extent(&BTRFS_I(inode)->io_tree, dip->logical_offset, |
6822 | dip->logical_offset + dip->bytes - 1); | 6819 | dip->logical_offset + dip->bytes - 1); |