summaryrefslogtreecommitdiff
path: root/fs/btrfs
diff options
context:
space:
mode:
authorZhao Lei <zhaolei@cn.fujitsu.com>2015-01-20 10:11:40 +0300
committerChris Mason <clm@fb.com>2015-01-22 05:06:49 +0300
commit8d6738c1bd74a27ff6a5043c5211c7bff7745420 (patch)
tree5a62834b17957c5ec0bb274799864e4274a11eb6 /fs/btrfs
parentdc5f7a3bd820883793bb0d9789e938a34aa4da5f (diff)
downloadlinux-8d6738c1bd74a27ff6a5043c5211c7bff7745420.tar.xz
Btrfs: Separate finding-right-mirror and writing-to-target's process in scrub_handle_errored_block()
In corrent code, code of finding-right-mirror and writing-to-target are mixed in logic, if we find a right mirror but failed in writing to target, it will treat as "hadn't found right block", and fill the target with sblock_bad. Actually, "failed in writing to target" does not mean "source block is wrong", this patch separate above two condition in logic, and do some cleanup to make code clean. Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com> Signed-off-by: Miao Xie <miaox@cn.fujitsu.com> Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/scrub.c44
1 files changed, 17 insertions, 27 deletions
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
index 68867b2e4620..c40ffbc9581f 100644
--- a/fs/btrfs/scrub.c
+++ b/fs/btrfs/scrub.c
@@ -1114,35 +1114,21 @@ nodatasum_case:
success = 1;
for (page_num = 0; page_num < sblock_bad->page_count;
page_num++) {
- int sub_success;
+ struct scrub_block *sblock_other = NULL;
- sub_success = 0;
for (mirror_index = 0;
mirror_index < BTRFS_MAX_MIRRORS &&
sblocks_for_recheck[mirror_index].page_count > 0;
mirror_index++) {
- struct scrub_block *sblock_other =
- sblocks_for_recheck + mirror_index;
- struct scrub_page *page_other =
- sblock_other->pagev[page_num];
-
- if (!page_other->io_error) {
- ret = scrub_write_page_to_dev_replace(
- sblock_other, page_num);
- if (ret == 0) {
- /* succeeded for this page */
- sub_success = 1;
- break;
- } else {
- btrfs_dev_replace_stats_inc(
- &sctx->dev_root->
- fs_info->dev_replace.
- num_write_errors);
- }
+ if (!sblocks_for_recheck[mirror_index].
+ pagev[page_num]->io_error) {
+ sblock_other = sblocks_for_recheck +
+ mirror_index;
+ break;
}
}
- if (!sub_success) {
+ if (!sblock_other) {
/*
* did not find a mirror to fetch the page
* from. scrub_write_page_to_dev_replace()
@@ -1150,13 +1136,17 @@ nodatasum_case:
* filling the block with zeros before
* submitting the write request
*/
+ sblock_other = sblock_bad;
+ success = 0;
+ }
+
+ if (scrub_write_page_to_dev_replace(sblock_other,
+ page_num) != 0) {
+ btrfs_dev_replace_stats_inc(
+ &sctx->dev_root->
+ fs_info->dev_replace.
+ num_write_errors);
success = 0;
- ret = scrub_write_page_to_dev_replace(
- sblock_bad, page_num);
- if (ret)
- btrfs_dev_replace_stats_inc(
- &sctx->dev_root->fs_info->
- dev_replace.num_write_errors);
}
}