]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
btrfs: pass bvec to csum_dirty_buffer instead of page
authorQu Wenruo <wqu@suse.com>
Tue, 3 Nov 2020 13:30:49 +0000 (21:30 +0800)
committerDavid Sterba <dsterba@suse.com>
Tue, 8 Dec 2020 14:54:04 +0000 (15:54 +0100)
Currently csum_dirty_buffer() uses page to grab extent buffer, but that
only works for sector size == PAGE_SIZE case.

For subpage we need page + page_offset to grab extent buffer.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c

index de18055bede4cd99b3040ef9974e197a13a39f04..3edbbbcbe75a2f9833d5827b6e59f8e7cccb4263 100644 (file)
@@ -444,12 +444,13 @@ static int btree_read_extent_buffer_pages(struct extent_buffer *eb,
 }
 
 /*
- * checksum a dirty tree block before IO.  This has extra checks to make sure
- * we only fill in the checksum field in the first page of a multi-page block
+ * Checksum a dirty tree block before IO.  This has extra checks to make sure
+ * we only fill in the checksum field in the first page of a multi-page block.
+ * For subpage extent buffers we need bvec to also read the offset in the page.
  */
-
-static int csum_dirty_buffer(struct btrfs_fs_info *fs_info, struct page *page)
+static int csum_dirty_buffer(struct btrfs_fs_info *fs_info, struct bio_vec *bvec)
 {
+       struct page *page = bvec->bv_page;
        u64 start = page_offset(page);
        u64 found_start;
        u8 result[BTRFS_CSUM_SIZE];
@@ -791,7 +792,7 @@ static blk_status_t btree_csum_one_bio(struct bio *bio)
        ASSERT(!bio_flagged(bio, BIO_CLONED));
        bio_for_each_segment_all(bvec, bio, iter_all) {
                root = BTRFS_I(bvec->bv_page->mapping->host)->root;
-               ret = csum_dirty_buffer(root->fs_info, bvec->bv_page);
+               ret = csum_dirty_buffer(root->fs_info, bvec);
                if (ret)
                        break;
        }