aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-10-10 22:50:13 -0400
committerNeilBrown <neilb@suse.de>2012-10-10 22:50:13 -0400
commit1ed850f356a0a422013846b5291acff08815008b (patch)
tree9dd66a6b204a385574b7a885b6415e58f26a6780 /drivers/md
parenta7854487cd7128a30a7f4f5259de9f67d5efb95f (diff)
md/raid5: make sure to_read and to_write never go negative.
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>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/raid5.c5
1 files changed, 1 insertions, 4 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 9de8221f64ec..ab613efbbead 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -2507,10 +2507,8 @@ handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh,
2507 bi = sh->dev[i].towrite; 2507 bi = sh->dev[i].towrite;
2508 sh->dev[i].towrite = NULL; 2508 sh->dev[i].towrite = NULL;
2509 spin_unlock_irq(&sh->stripe_lock); 2509 spin_unlock_irq(&sh->stripe_lock);
2510 if (bi) { 2510 if (bi)
2511 s->to_write--;
2512 bitmap_end = 1; 2511 bitmap_end = 1;
2513 }
2514 2512
2515 if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags)) 2513 if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags))
2516 wake_up(&conf->wait_for_overlap); 2514 wake_up(&conf->wait_for_overlap);
@@ -2558,7 +2556,6 @@ handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh,
2558 spin_unlock_irq(&sh->stripe_lock); 2556 spin_unlock_irq(&sh->stripe_lock);
2559 if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags)) 2557 if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags))
2560 wake_up(&conf->wait_for_overlap); 2558 wake_up(&conf->wait_for_overlap);
2561 if (bi) s->to_read--;
2562 while (bi && bi->bi_sector < 2559 while (bi && bi->bi_sector <
2563 sh->dev[i].sector + STRIPE_SECTORS) { 2560 sh->dev[i].sector + STRIPE_SECTORS) {
2564 struct bio *nextbi = 2561 struct bio *nextbi =