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>
This commit is contained in:
parent
a7854487cd
commit
1ed850f356
|
@ -2507,10 +2507,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);
|
||||
|
@ -2558,7 +2556,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 =
|
||||
|
|
Loading…
Reference in New Issue