btrfs-progs: check: check main csum root if csum not in log tree
Fixes false positive in btrfs check that was causing btrfs/192 to fail. It looks like there's circumstances in which btrfs_log_changed_extents can also log unmodified extents, but not their csums. If that happens, check the main csum root as well before showing an error. Signed-off-by: Mark Harmstone <maharmstone@fb.com>
This commit is contained in:
parent
175cbfc5a2
commit
6c7d2a323c
13
check/main.c
13
check/main.c
|
@ -9681,7 +9681,7 @@ static int zero_log_tree(struct btrfs_root *root)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int check_log_csum(struct btrfs_root *root, u64 addr, u64 length)
|
static int check_range_csummed(struct btrfs_root *root, u64 addr, u64 length)
|
||||||
{
|
{
|
||||||
struct btrfs_path path = { 0 };
|
struct btrfs_path path = { 0 };
|
||||||
struct btrfs_key key = {
|
struct btrfs_key key = {
|
||||||
|
@ -9816,12 +9816,21 @@ static int check_log_root(struct btrfs_root *root, struct cache_tree *root_cache
|
||||||
length = btrfs_file_extent_num_bytes(leaf, fi);
|
length = btrfs_file_extent_num_bytes(leaf, fi);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = check_log_csum(root, addr, length);
|
ret = check_range_csummed(root, addr, length);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
err = 1;
|
err = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
ret = check_range_csummed(btrfs_csum_root(gfs_info, 0),
|
||||||
|
addr, length);
|
||||||
|
if (ret < 0) {
|
||||||
|
err = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
error(
|
error(
|
||||||
"csum missing in log (root %llu inode %llu offset %llu address 0x%llx length %llu)",
|
"csum missing in log (root %llu inode %llu offset %llu address 0x%llx length %llu)",
|
||||||
|
|
Loading…
Reference in New Issue