Btrfs: fix that repair code is spuriously executed for transid failures
If verify_parent_transid() fails for all mirrors, the current code calls repair_io_failure() anyway which means: - that the disk block is rewritten without repairing anything and - that a kernel log message is printed which misleadingly claims that a read error was corrected. This is an example: parent transid verify failed on 615015833600 wanted 110423 found 110424 parent transid verify failed on 615015833600 wanted 110423 found 110424 btrfs read error corrected: ino 1 off 615015833600 (dev /dev/...) It is wrong to ignore the results from verify_parent_transid() and to call repair_eb_io_failure() when the verification of the transids failed. This commit fixes the issue. Signed-off-by: Stefan Behrens <sbehrens@giantdisaster.de> Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
parent
d280e5be94
commit
256dd1bb37
1 changed files with 6 additions and 2 deletions
|
@ -377,9 +377,13 @@ static int btree_read_extent_buffer_pages(struct btrfs_root *root,
|
||||||
ret = read_extent_buffer_pages(io_tree, eb, start,
|
ret = read_extent_buffer_pages(io_tree, eb, start,
|
||||||
WAIT_COMPLETE,
|
WAIT_COMPLETE,
|
||||||
btree_get_extent, mirror_num);
|
btree_get_extent, mirror_num);
|
||||||
if (!ret && !verify_parent_transid(io_tree, eb,
|
if (!ret) {
|
||||||
|
if (!verify_parent_transid(io_tree, eb,
|
||||||
parent_transid, 0))
|
parent_transid, 0))
|
||||||
break;
|
break;
|
||||||
|
else
|
||||||
|
ret = -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This buffer's crc is fine, but its contents are corrupted, so
|
* This buffer's crc is fine, but its contents are corrupted, so
|
||||||
|
|
Loading…
Add table
Reference in a new issue