diff options
| author | NeilBrown <neilb@suse.de> | 2012-10-10 22:50:13 -0400 |
|---|---|---|
| committer | NeilBrown <neilb@suse.de> | 2012-10-10 22:50:13 -0400 |
| commit | 1ed850f356a0a422013846b5291acff08815008b (patch) | |
| tree | 9dd66a6b204a385574b7a885b6415e58f26a6780 /drivers | |
| parent | a7854487cd7128a30a7f4f5259de9f67d5efb95f (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')
| -rw-r--r-- | drivers/md/raid5.c | 5 |
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 = |
