Commit 771aba0d authored by David Sterba's avatar David Sterba
Browse files

btrfs: scrub: simplify data block checksum calculation



We have sectorsize same as PAGE_SIZE, the checksum can be calculated in
one go.

Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent c7460541
Loading
Loading
Loading
Loading
+3 −21
Original line number Diff line number Diff line
@@ -1789,37 +1789,19 @@ static int scrub_checksum_data(struct scrub_block *sblock)
	u8 *on_disk_csum;
	struct page *page;
	char *kaddr;
	u64 len;
	int index;

	BUG_ON(sblock->page_count < 1);
	if (!sblock->pagev[0]->have_csum)
		return 0;

	shash->tfm = fs_info->csum_shash;
	crypto_shash_init(shash);

	on_disk_csum = sblock->pagev[0]->csum;
	page = sblock->pagev[0]->page;
	kaddr = page_address(page);

	len = sctx->fs_info->sectorsize;
	index = 0;
	for (;;) {
		u64 l = min_t(u64, len, PAGE_SIZE);

		crypto_shash_update(shash, kaddr, l);
		len -= l;
		if (len == 0)
			break;
		index++;
		BUG_ON(index >= sblock->page_count);
		BUG_ON(!sblock->pagev[index]->page);
		page = sblock->pagev[index]->page;
		kaddr = page_address(page);
	}
	shash->tfm = fs_info->csum_shash;
	crypto_shash_init(shash);
	crypto_shash_digest(shash, kaddr, PAGE_SIZE, csum);

	crypto_shash_final(shash, csum);
	if (memcmp(csum, on_disk_csum, sctx->csum_size))
		sblock->checksum_error = 1;