]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
md/raid5: make sure to_read and to_write never go negative.
authorNeilBrown <neilb@suse.de>
Tue, 25 Sep 2012 08:32:08 +0000 (18:32 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 25 Sep 2012 08:32:08 +0000 (18:32 +1000)
to_read and to_write are part of the result of analysing
a stripe before handling it.
Their use is to avoid some loops and tests if the values are
known to be zero.  Thus it is not a problem if they are a
little bit larger than they should be.

So decrementing them in handle_failed_stripe serves little value, and
due to races it could cause some loops to be skipped incorrectly.

So remove those decrements.

Reported-by: "Jianpeng Ma" <majianpeng@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/raid5.c

index f26ca2efee9467a1d97343eb7500d45df3ea3af2..3f4f56543b19b2aa72b6c98a01a557e5fa3b0280 100644 (file)
@@ -2548,10 +2548,8 @@ handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh,
                bi = sh->dev[i].towrite;
                sh->dev[i].towrite = NULL;
                spin_unlock_irq(&sh->stripe_lock);
-               if (bi) {
-                       s->to_write--;
+               if (bi)
                        bitmap_end = 1;
-               }
 
                if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags))
                        wake_up(&conf->wait_for_overlap);
@@ -2599,7 +2597,6 @@ handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh,
                        spin_unlock_irq(&sh->stripe_lock);
                        if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags))
                                wake_up(&conf->wait_for_overlap);
-                       if (bi) s->to_read--;
                        while (bi && bi->bi_sector <
                               sh->dev[i].sector + STRIPE_SECTORS) {
                                struct bio *nextbi =