diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 147bafdb862896d7c91404f22926221d8dcb8aa3..b74a6d23a0fe629818e5e5bf0af8c7c11280389a 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -8180,6 +8180,7 @@ static int __btrfs_subio_endio_read(struct inode *inode, int nr_sectors; unsigned int pgoff; int csum_pos; + bool uptodate = (err == 0); int ret; fs_info = BTRFS_I(inode)->root->fs_info; @@ -8195,12 +8196,13 @@ static int __btrfs_subio_endio_read(struct inode *inode, pgoff = bvec.bv_offset; next_block: - csum_pos = BTRFS_BYTES_TO_BLKS(fs_info, offset); - ret = __readpage_endio_check(inode, io_bio, csum_pos, - bvec.bv_page, pgoff, start, - sectorsize); - if (likely(!ret)) - goto next; + if (uptodate) { + csum_pos = BTRFS_BYTES_TO_BLKS(fs_info, offset); + ret = __readpage_endio_check(inode, io_bio, csum_pos, + bvec.bv_page, pgoff, start, sectorsize); + if (likely(!ret)) + goto next; + } try_again: done.uptodate = 0; done.start = start;