mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-10 07:10:27 +00:00
raid5: update analysis state for failed stripe
handle_failed_stripe() makes the stripe fail, eg, all IO will return with a failure, but it doesn't update stripe_head_state. Later handle_stripe() has special handling for raid6 for handle_stripe_fill(). That check before handle_stripe_fill() doesn't skip the failed stripe and we get a kernel crash in need_this_block. This patch clear the analysis state to make sure no functions wrongly called after handle_failed_stripe() Signed-off-by: Shaohua Li <shli@fb.com> Signed-off-by: NeilBrown <neilb@suse.com>
This commit is contained in:
parent
88724bfa68
commit
ebda780bce
@ -3150,6 +3150,8 @@ handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh,
|
|||||||
spin_unlock_irq(&sh->stripe_lock);
|
spin_unlock_irq(&sh->stripe_lock);
|
||||||
if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags))
|
if (test_and_clear_bit(R5_Overlap, &sh->dev[i].flags))
|
||||||
wake_up(&conf->wait_for_overlap);
|
wake_up(&conf->wait_for_overlap);
|
||||||
|
if (bi)
|
||||||
|
s->to_read--;
|
||||||
while (bi && bi->bi_iter.bi_sector <
|
while (bi && bi->bi_iter.bi_sector <
|
||||||
sh->dev[i].sector + STRIPE_SECTORS) {
|
sh->dev[i].sector + STRIPE_SECTORS) {
|
||||||
struct bio *nextbi =
|
struct bio *nextbi =
|
||||||
@ -3169,6 +3171,8 @@ handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh,
|
|||||||
*/
|
*/
|
||||||
clear_bit(R5_LOCKED, &sh->dev[i].flags);
|
clear_bit(R5_LOCKED, &sh->dev[i].flags);
|
||||||
}
|
}
|
||||||
|
s->to_write = 0;
|
||||||
|
s->written = 0;
|
||||||
|
|
||||||
if (test_and_clear_bit(STRIPE_FULL_WRITE, &sh->state))
|
if (test_and_clear_bit(STRIPE_FULL_WRITE, &sh->state))
|
||||||
if (atomic_dec_and_test(&conf->pending_full_writes))
|
if (atomic_dec_and_test(&conf->pending_full_writes))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user