diff options
Diffstat (limited to 'fs/btrfs/scrub.c')
| -rw-r--r-- | fs/btrfs/scrub.c | 51 | 
1 files changed, 41 insertions, 10 deletions
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 52b346795f66..69c93ae333f6 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -229,7 +229,7 @@ struct full_stripe_lock {  };  #ifndef CONFIG_64BIT -/* This structure is for archtectures whose (void *) is smaller than u64 */ +/* This structure is for architectures whose (void *) is smaller than u64 */  struct scrub_page_private {  	u64 logical;  }; @@ -2053,20 +2053,33 @@ static int scrub_checksum_tree_block(struct scrub_block *sblock)  	 * a) don't have an extent buffer and  	 * b) the page is already kmapped  	 */ -	if (sblock->logical != btrfs_stack_header_bytenr(h)) +	if (sblock->logical != btrfs_stack_header_bytenr(h)) {  		sblock->header_error = 1; - -	if (sector->generation != btrfs_stack_header_generation(h)) { -		sblock->header_error = 1; -		sblock->generation_error = 1; +		btrfs_warn_rl(fs_info, +		"tree block %llu mirror %u has bad bytenr, has %llu want %llu", +			      sblock->logical, sblock->mirror_num, +			      btrfs_stack_header_bytenr(h), +			      sblock->logical); +		goto out;  	} -	if (!scrub_check_fsid(h->fsid, sector)) +	if (!scrub_check_fsid(h->fsid, sector)) {  		sblock->header_error = 1; +		btrfs_warn_rl(fs_info, +		"tree block %llu mirror %u has bad fsid, has %pU want %pU", +			      sblock->logical, sblock->mirror_num, +			      h->fsid, sblock->dev->fs_devices->fsid); +		goto out; +	} -	if (memcmp(h->chunk_tree_uuid, fs_info->chunk_tree_uuid, -		   BTRFS_UUID_SIZE)) +	if (memcmp(h->chunk_tree_uuid, fs_info->chunk_tree_uuid, BTRFS_UUID_SIZE)) {  		sblock->header_error = 1; +		btrfs_warn_rl(fs_info, +		"tree block %llu mirror %u has bad chunk tree uuid, has %pU want %pU", +			      sblock->logical, sblock->mirror_num, +			      h->chunk_tree_uuid, fs_info->chunk_tree_uuid); +		goto out; +	}  	shash->tfm = fs_info->csum_shash;  	crypto_shash_init(shash); @@ -2079,9 +2092,27 @@ static int scrub_checksum_tree_block(struct scrub_block *sblock)  	}  	crypto_shash_final(shash, calculated_csum); -	if (memcmp(calculated_csum, on_disk_csum, sctx->fs_info->csum_size)) +	if (memcmp(calculated_csum, on_disk_csum, sctx->fs_info->csum_size)) {  		sblock->checksum_error = 1; +		btrfs_warn_rl(fs_info, +		"tree block %llu mirror %u has bad csum, has " CSUM_FMT " want " CSUM_FMT, +			      sblock->logical, sblock->mirror_num, +			      CSUM_FMT_VALUE(fs_info->csum_size, on_disk_csum), +			      CSUM_FMT_VALUE(fs_info->csum_size, calculated_csum)); +		goto out; +	} + +	if (sector->generation != btrfs_stack_header_generation(h)) { +		sblock->header_error = 1; +		sblock->generation_error = 1; +		btrfs_warn_rl(fs_info, +		"tree block %llu mirror %u has bad generation, has %llu want %llu", +			      sblock->logical, sblock->mirror_num, +			      btrfs_stack_header_generation(h), +			      sector->generation); +	} +out:  	return sblock->header_error || sblock->checksum_error;  }  |