summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQu Wenruo <wqu@suse.com>2018-04-03 13:39:46 +0800
committerDavid Sterba <dsterba@suse.com>2018-04-24 13:00:11 +0200
commit2777e53911c51e33cf689eccab285ec557f13b12 (patch)
tree26973410118a351903f01fc15cc1e618d37a94bf
parentef810bf0adb06e991ca16ea295f047e10288a802 (diff)
downloadbtrfs-progs-2777e53911c51e33cf689eccab285ec557f13b12.tar.gz
btrfs-progs-2777e53911c51e33cf689eccab285ec557f13b12.tar.bz2
btrfs-progs-2777e53911c51e33cf689eccab285ec557f13b12.zip
btrfs-progs: check: Skip data csum verification for metadata dump
For metadata dump (fs restored by btrfs-image), no data is restored and check sum verification will definitely report error. Add such check in check_csums() and prompt for user input. Issue: #103 Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: Nikolay Borisov <nborisov@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--check/main.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/check/main.c b/check/main.c
index 891a6d79..15c94543 100644
--- a/check/main.c
+++ b/check/main.c
@@ -5601,6 +5601,7 @@ static int check_csums(struct btrfs_root *root)
int ret;
u64 data_len;
unsigned long leaf_offset;
+ bool verify_csum = !!check_data_csum;
root = root->fs_info->csum_root;
if (!extent_buffer_uptodate(root->node)) {
@@ -5623,6 +5624,16 @@ static int check_csums(struct btrfs_root *root)
path.slots[0]--;
ret = 0;
+ /*
+ * For metadata dump (btrfs-image) all data is wiped so verifying data
+ * csum is meaningless and will always report csum error.
+ */
+ if (check_data_csum && (btrfs_super_flags(root->fs_info->super_copy) &
+ (BTRFS_SUPER_FLAG_METADUMP | BTRFS_SUPER_FLAG_METADUMP_V2))) {
+ printf("skip data csum verification for metadata dump\n");
+ verify_csum = false;
+ }
+
while (1) {
if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
ret = btrfs_next_leaf(root, &path);
@@ -5644,7 +5655,7 @@ static int check_csums(struct btrfs_root *root)
data_len = (btrfs_item_size_nr(leaf, path.slots[0]) /
csum_size) * root->fs_info->sectorsize;
- if (!check_data_csum)
+ if (!verify_csum)
goto skip_csum_check;
leaf_offset = btrfs_item_ptr_offset(leaf, path.slots[0]);
ret = check_extent_csums(root, key.offset, data_len,