raid5: Use slow_path to release stripe when mddev->thread is null
authormajianpeng <majianpeng@gmail.com>
Thu, 14 Nov 2013 04:16:15 +0000 (15:16 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 14 Nov 2013 04:16:15 +0000 (15:16 +1100)
When release_stripe() is called in grow_one_stripe(), the
mddev->thread is null. So it will omit one wakeup this thread to
release stripe.
For this condition, use slow_path to release stripe.

Bug was introduced in 3.12

Cc: stable@vger.kernel.org (3.12+)
Fixes: 773ca82fa1ee58dd1bf88b
Signed-off-by: Jianpeng Ma <majianpeng@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/raid5.c

index f8b9068439267a3539d671e6e59ceb0b47b90547..f013d3662665f65ea67c437e4d1446924a5200b4 100644 (file)
@@ -340,7 +340,8 @@ static void release_stripe(struct stripe_head *sh)
        unsigned long flags;
        bool wakeup;
 
-       if (test_and_set_bit(STRIPE_ON_RELEASE_LIST, &sh->state))
+       if (unlikely(!conf->mddev->thread) ||
+               test_and_set_bit(STRIPE_ON_RELEASE_LIST, &sh->state))
                goto slow_path;
        wakeup = llist_add(&sh->release_list, &conf->released_stripes);
        if (wakeup)