md/raid5: use atomic_dec_return() instead of atomic_dec() and atomic_read().
authormajianpeng <majianpeng@gmail.com>
Tue, 13 Mar 2012 00:21:25 +0000 (11:21 +1100)
committerNeilBrown <neilb@suse.de>
Tue, 13 Mar 2012 00:21:25 +0000 (11:21 +1100)
Signed-off-by: majianpeng <majianpeng@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/raid5.c

index 3f55145ff224105ad5780ee2a68247766d4e2e8a..99b2bbf8b5d8a107aea489ad88c2fd94dc16f3f3 100644 (file)
@@ -208,11 +208,10 @@ static void __release_stripe(struct r5conf *conf, struct stripe_head *sh)
                        md_wakeup_thread(conf->mddev->thread);
                } else {
                        BUG_ON(stripe_operations_active(sh));
-                       if (test_and_clear_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) {
-                               atomic_dec(&conf->preread_active_stripes);
-                               if (atomic_read(&conf->preread_active_stripes) < IO_THRESHOLD)
+                       if (test_and_clear_bit(STRIPE_PREREAD_ACTIVE, &sh->state))
+                               if (atomic_dec_return(&conf->preread_active_stripes)
+                                   < IO_THRESHOLD)
                                        md_wakeup_thread(conf->mddev->thread);
-                       }
                        atomic_dec(&conf->active_stripes);
                        if (!test_bit(STRIPE_EXPANDING, &sh->state)) {
                                list_add_tail(&sh->lru, &conf->inactive_list);