]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
btrfs: make csum_tree_block() handle node smaller than page
authorQu Wenruo <wqu@suse.com>
Tue, 3 Nov 2020 13:30:47 +0000 (21:30 +0800)
committerDavid Sterba <dsterba@suse.com>
Tue, 8 Dec 2020 14:54:04 +0000 (15:54 +0100)
For subpage size support, metadata blocks of nodesize are smaller than
one page and this needs to be handled when calculating the checksum.

The checksummed start and length need to be adjusted but only for the
first page:

- start is simply offset in the page

- length is nodesize (subpage) or PAGE_SIZE for all other cases

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Goldwyn Rodrigues <rgoldwyn@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 abc929a47d4b814ebbd5969409df5d608440ee77..1c8c94dbe98463aff34653b4f7949e6b3426c9cb 100644 (file)
@@ -212,15 +212,16 @@ static void csum_tree_block(struct extent_buffer *buf, u8 *result)
 {
        struct btrfs_fs_info *fs_info = buf->fs_info;
        const int num_pages = fs_info->nodesize >> PAGE_SHIFT;
+       const int first_page_part = min_t(u32, PAGE_SIZE, fs_info->nodesize);
        SHASH_DESC_ON_STACK(shash, fs_info->csum_shash);
        char *kaddr;
        int i;
 
        shash->tfm = fs_info->csum_shash;
        crypto_shash_init(shash);
-       kaddr = page_address(buf->pages[0]);
+       kaddr = page_address(buf->pages[0]) + offset_in_page(buf->start);
        crypto_shash_update(shash, kaddr + BTRFS_CSUM_SIZE,
-                           PAGE_SIZE - BTRFS_CSUM_SIZE);
+                           first_page_part - BTRFS_CSUM_SIZE);
 
        for (i = 1; i < num_pages; i++) {
                kaddr = page_address(buf->pages[i]);