btrfs-progs: check: return value of check_extent_refs

In original check mode (without option --repair), check_extent_refs()
always returns 0.

Add a variable @err to record status while checking extents.  At the end
of check_extent_refs(), let it return -EIO if @err is non-zero.

The test fsck/006-bad-root-items will fail after this patch and fixed by
the following patches.

Example:
$ btrfs check bad-extent-inline-ref-type.raw
Checking filesystem on bad-extent-inline-ref-type.raw
UUID: 1942d6fe-617b-4499-9982-cc8ffae5447f
checking extents
corrupt extent record: key 29360128 169 16384
ref mismatch on [29360128 16384] extent item 0, found 1
Backref 29360128 parent 5 root 5 not found in extent tree
backpointer mismatch on [29360128 16384]
bad extent [29360128, 29376512), type mismatch with chunk
checking free space cache
checking fs roots
checking csums
checking root refs
found 114688 bytes used, no error found
total csum bytes: 0
total tree bytes: 114688
total fs tree bytes: 32768
total extent tree bytes: 16384
btree space waste bytes: 109471
file data blocks allocated: 0
 referenced 0

Signed-off-by: Su Yue <suy.fnst@cn.fujitsu.com>
[ add note about the failing test, rename variable to err ]
Signed-off-by: David Sterba <dsterba@suse.com>
master
Su Yue 2017-09-27 14:34:36 +08:00 committed by David Sterba
parent 3ebf6564cd
commit eb4e4dbfea
1 changed files with 6 additions and 1 deletions

View File

@ -10829,6 +10829,7 @@ static int check_extent_refs(struct btrfs_root *root,
struct cache_extent *cache;
int ret = 0;
int had_dups = 0;
int err = 0;
if (repair) {
/*
@ -10972,6 +10973,7 @@ static int check_extent_refs(struct btrfs_root *root,
cur_err = 1;
}
err = cur_err;
remove_cache_extent(extent_cache, cache);
free_all_extent_backrefs(rec);
if (!init_extent_tree && repair && (!cur_err || fix))
@ -11004,7 +11006,10 @@ repair_abort:
}
return ret;
}
return 0;
if (err)
err = -EIO;
return err;
}
u64 calc_stripe_length(u64 type, u64 length, int num_stripes)