提交 cb2ced73 编写于 作者: S Stefan Behrens 提交者: Josef Bacik

Btrfs: in scrub repair code, optimize the reading of mirrors

In case that disk blocks need to be repaired (rewritten), the
current code at first (for simplicity reasons) reads all alternate
mirrors in the first step, afterwards selects the best one in a
second step. This is now changed to read one alternate mirror
after the other and to leave the loop early when a perfect mirror
is found.
Signed-off-by: NStefan Behrens <sbehrens@giantdisaster.de>
Signed-off-by: NChris Mason <chris.mason@fusionio.com>
上级 7a9e9987
...@@ -819,26 +819,8 @@ static int scrub_handle_errored_block(struct scrub_block *sblock_to_check) ...@@ -819,26 +819,8 @@ static int scrub_handle_errored_block(struct scrub_block *sblock_to_check)
/* /*
* now build and submit the bios for the other mirrors, check * now build and submit the bios for the other mirrors, check
* checksums * checksums.
*/ * First try to pick the mirror which is completely without I/O
for (mirror_index = 0;
mirror_index < BTRFS_MAX_MIRRORS &&
sblocks_for_recheck[mirror_index].page_count > 0;
mirror_index++) {
if (mirror_index == failed_mirror_index)
continue;
/* build and submit the bios, check checksums */
ret = scrub_recheck_block(fs_info,
sblocks_for_recheck + mirror_index,
is_metadata, have_csum, csum,
generation, sctx->csum_size);
if (ret)
goto did_not_correct_error;
}
/*
* first try to pick the mirror which is completely without I/O
* errors and also does not have a checksum error. * errors and also does not have a checksum error.
* If one is found, and if a checksum is present, the full block * If one is found, and if a checksum is present, the full block
* that is known to contain an error is rewritten. Afterwards * that is known to contain an error is rewritten. Afterwards
...@@ -854,10 +836,17 @@ static int scrub_handle_errored_block(struct scrub_block *sblock_to_check) ...@@ -854,10 +836,17 @@ static int scrub_handle_errored_block(struct scrub_block *sblock_to_check)
mirror_index < BTRFS_MAX_MIRRORS && mirror_index < BTRFS_MAX_MIRRORS &&
sblocks_for_recheck[mirror_index].page_count > 0; sblocks_for_recheck[mirror_index].page_count > 0;
mirror_index++) { mirror_index++) {
struct scrub_block *sblock_other = sblocks_for_recheck + struct scrub_block *sblock_other;
mirror_index;
if (!sblock_other->header_error && if (mirror_index == failed_mirror_index)
continue;
sblock_other = sblocks_for_recheck + mirror_index;
/* build and submit the bios, check checksums */
ret = scrub_recheck_block(fs_info, sblock_other, is_metadata,
have_csum, csum, generation,
sctx->csum_size);
if (!ret && !sblock_other->header_error &&
!sblock_other->checksum_error && !sblock_other->checksum_error &&
sblock_other->no_io_error_seen) { sblock_other->no_io_error_seen) {
int force_write = is_metadata || have_csum; int force_write = is_metadata || have_csum;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册