]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
btrfs: Fix calculate typo caused by ambiguous meaning of logic_end
authorZhao Lei <zhaolei@cn.fujitsu.com>
Tue, 21 Jul 2015 07:42:26 +0000 (15:42 +0800)
committerChris Mason <clm@fb.com>
Sun, 9 Aug 2015 14:07:11 +0000 (07:07 -0700)
For example, in scrub_raid56_parity(), following lines are used
to judge is all data processed:
 place1: if (key.objectid > logic_end) ...
 place2: if (logic_start >= logic_end) ...
 ...
 (place2 is typo, is should be ">", it is copied from other
  place, where logic_end's meaning is different, long story...)

We can fix above typo directly, but the root reason is ambiguous
meaning of logic_end in scrub raid56 parity.

In other place, XXX_end is pointed to data which is not included,
and we need to process segment of [XXX_start, XXX_end).

But for scrub raid56 parity, logic_end is pointed to lattest data
need to process, and introduced many "+ 1" and "- 1" in code as
below:
 length = sparity->logic_end - sparity->logic_start + 1
 logic_end - logic_start + 1
 stripe_logical + increment - 1

This patch changed logic_end's meaning to make it in normal understanding
in raid56 parity functions and data struct alone with above bugfix.

Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/scrub.c

index 6987de6b1ed83547aac4de702b36270254a88df8..185595a7be10c5fb40ad8a963b6600f43fbd6784 100644 (file)
@@ -2702,7 +2702,7 @@ static void scrub_parity_check_and_repair(struct scrub_parity *sparity)
                           sparity->nsectors))
                goto out;
 
-       length = sparity->logic_end - sparity->logic_start + 1;
+       length = sparity->logic_end - sparity->logic_start;
        ret = btrfs_map_sblock(sctx->dev_root->fs_info, WRITE,
                               sparity->logic_start,
                               &length, &bbio, 0, 1);
@@ -2868,7 +2868,7 @@ static noinline_for_stack int scrub_raid56_parity(struct scrub_ctx *sctx,
                            key.type != BTRFS_METADATA_ITEM_KEY)
                                goto next;
 
-                       if (key.objectid > logic_end) {
+                       if (key.objectid >= logic_end) {
                                stop_loop = 1;
                                break;
                        }
@@ -2958,7 +2958,7 @@ next:
 out:
        if (ret < 0)
                scrub_parity_mark_sectors_error(sparity, logic_start,
-                                               logic_end - logic_start + 1);
+                                               logic_end - logic_start);
        scrub_parity_put(sparity);
        scrub_submit(sctx);
        mutex_lock(&sctx->wr_ctx.wr_lock);
@@ -3139,7 +3139,7 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx,
                        logical += base;
                        if (ret) {
                                stripe_logical += base;
-                               stripe_end = stripe_logical + increment - 1;
+                               stripe_end = stripe_logical + increment;
                                ret = scrub_raid56_parity(sctx, map, scrub_dev,
                                                          ppath, stripe_logical,
                                                          stripe_end);
@@ -3287,7 +3287,7 @@ loop:
                                        if (ret && physical < physical_end) {
                                                stripe_logical += base;
                                                stripe_end = stripe_logical +
-                                                               increment - 1;
+                                                               increment;
                                                ret = scrub_raid56_parity(sctx,
                                                        map, scrub_dev, ppath,
                                                        stripe_logical,