History

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.

Stefan Behrens committed 14 years ago

Commit 256dd1b1 parent d280e5b1 file · +6 −2Browse files

Unified · Split

fs/btrfs/disk-io.c+6−2
@@ -377,9 +377,13 @@ static int btree_read_extent_buffer_pages(struct btrfs_root *root, · 376 unmodified lines
377 ret = read_extent_buffer_pages(io_tree, eb, start,377 ret = read_extent_buffer_pages(io_tree, eb, start,
378 WAIT_COMPLETE,378 WAIT_COMPLETE,
379 btree_get_extent, mirror_num);379 btree_get_extent, mirror_num);
380 if (!ret && !verify_parent_transid(io_tree, eb,380 if (!ret) {
381 if (!verify_parent_transid(io_tree, eb,
381 parent_transid, 0))382 parent_transid, 0))
382 break;383 break;
384 else
385 ret = -EIO;
386 }
383 387
384 /*388 /*
385 * This buffer's crc is fine, but its contents are corrupted, so389 * This buffer's crc is fine, but its contents are corrupted, so