diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index a53b6cc4787a46..ccba55218c0690 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -2489,6 +2489,7 @@ static void end_bio_extent_writepage(struct bio *bio, int err) bio_for_each_page_all(bvec, bio, iter) { struct page *page = bvec.bv_page; + unsigned int bv_len = min_t(unsigned int, bvec.bv_len, PAGE_CACHE_SIZE); /* We always issue full-page reads, but if some block * in a page fails to read, blk_update_request() will @@ -2496,20 +2497,19 @@ static void end_bio_extent_writepage(struct bio *bio, int err) * Print a warning for nonzero offsets, and an error * if they don't add up to a full page. */ if (bvec.bv_offset) { - if (bvec.bv_offset + bvec.bv_len != PAGE_CACHE_SIZE) + if (bvec.bv_offset + bv_len != PAGE_CACHE_SIZE) btrfs_err(BTRFS_I(page->mapping->host)->root->fs_info, "partial page write in btrfs with offset %u and length %u", - bvec.bv_offset, bvec.bv_len); + bvec.bv_offset, bv_len); else btrfs_info(BTRFS_I(page->mapping->host)->root->fs_info, "incomplete page write in btrfs with offset %u and " "length %u", - bvec.bv_offset, bvec.bv_len); + bvec.bv_offset, bv_len); } start = page_offset(page); - end = start + bvec.bv_offset - + min_t(unsigned int, bvec.bv_len, PAGE_CACHE_SIZE) - 1; + end = start + bvec.bv_offset + bv_len - 1; if (end_extent_writepage(page, err, start, end)) continue; @@ -2565,6 +2565,7 @@ static void end_bio_extent_readpage(struct bio *bio, int err) bio_for_each_page_all(bvec, bio, iter) { struct page *page = bvec.bv_page; struct inode *inode = page->mapping->host; + unsigned int bv_len = min_t(unsigned int, bvec.bv_len, PAGE_CACHE_SIZE); pr_debug("end_bio_extent_readpage: bi_sector=%llu, err=%d, " "mirror=%u\n", (u64)bio->bi_iter.bi_sector, err, @@ -2577,21 +2578,20 @@ static void end_bio_extent_readpage(struct bio *bio, int err) * Print a warning for nonzero offsets, and an error * if they don't add up to a full page. */ if (bvec.bv_offset) { - if (bvec.bv_offset + bvec.bv_len != PAGE_CACHE_SIZE) + if (bvec.bv_offset + bv_len != PAGE_CACHE_SIZE) btrfs_err(BTRFS_I(page->mapping->host)->root->fs_info, "partial page read in btrfs with offset %u and length %u", - bvec.bv_offset, bvec.bv_len); + bvec.bv_offset, bv_len); else btrfs_info(BTRFS_I(page->mapping->host)->root->fs_info, "incomplete page read in btrfs with offset %u and " "length %u", - bvec.bv_offset, bvec.bv_len); + bvec.bv_offset, bv_len); } start = page_offset(page); - end = start + bvec.bv_offset - + min_t(unsigned int, bvec.bv_len, PAGE_CACHE_SIZE) - 1; - len = bvec.bv_len; + end = start + bvec.bv_offset + bv_len - 1; + len = bv_len; mirror = io_bio->mirror_num; if (likely(uptodate && tree->ops && diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index 9138b3b734af46..475144fee44052 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c @@ -448,6 +448,8 @@ int btrfs_csum_one_bio(struct btrfs_root *root, struct inode *inode, index = 0; bio_for_each_page(bvec, bio, iter) { + unsigned int bv_len = min_t(unsigned int, bvec.bv_len, PAGE_CACHE_SIZE); + if (!contig) offset = page_offset(bvec.bv_page) + bvec.bv_offset; @@ -472,14 +474,14 @@ int btrfs_csum_one_bio(struct btrfs_root *root, struct inode *inode, sums->sums[index] = ~(u32)0; sums->sums[index] = btrfs_csum_data(data + bvec.bv_offset, sums->sums[index], - bvec.bv_len); + bv_len); kunmap_atomic(data); btrfs_csum_final(sums->sums[index], (char *)(sums->sums + index)); index++; - offset += bvec.bv_len; - this_sum_bytes += bvec.bv_len; + offset += bv_len; + this_sum_bytes += bv_len; } this_sum_bytes = 0; btrfs_add_ordered_sum(inode, ordered, sums);