Btrfs: Separate finding-right-mirror and writing-to-target's process in scrub_handle_...
authorZhao Lei <zhaolei@cn.fujitsu.com>
Tue, 20 Jan 2015 07:11:40 +0000 (15:11 +0800)
committerChris Mason <clm@fb.com>
Thu, 22 Jan 2015 02:06:49 +0000 (18:06 -0800)
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>
fs/btrfs/scrub.c

index 68867b2e4620cd6a918d8fa55de94be810ba09a7..c40ffbc9581f781be9872184f0ef19410ce777fa 100644 (file)
@@ -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);
                        }
                }