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);