md/raid5: add some missing locking in handle_failed_stripe.
authorNeilBrown <neilb@suse.de>
Thu, 11 Oct 2012 02:50:12 +0000 (13:50 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 11 Oct 2012 02:50:12 +0000 (13:50 +1100)
We really should hold the stripe_lock while accessing
'toread' else we could race with add_stripe_bio and corrupt
a list.

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

index 758b77296404789df3d10d25e3b1d85d0ebc617f..36c0a158730b08a9878c24ac71d1927447d2288f 100644 (file)
@@ -2552,8 +2552,10 @@ handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh,
                if (!test_bit(R5_Wantfill, &sh->dev[i].flags) &&
                    (!test_bit(R5_Insync, &sh->dev[i].flags) ||
                      test_bit(R5_ReadError, &sh->dev[i].flags))) {
+                       spin_lock_irq(&sh->stripe_lock);
                        bi = sh->dev[i].toread;
                        sh->dev[i].toread = NULL;
+                       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--;