if (err == 0) {
                                md_kick_rdev_from_array(rdev);
-                               if (mddev->pers)
-                                       md_update_sb(mddev, 1);
+                               if (mddev->pers) {
+                                       set_bit(MD_CHANGE_DEVS, &mddev->flags);
+                                       md_wakeup_thread(mddev->thread);
+                               }
                                md_new_event(mddev);
                        }
                }
                md_cluster_ops->remove_disk(mddev, rdev);
 
        md_kick_rdev_from_array(rdev);
-       md_update_sb(mddev, 1);
+       set_bit(MD_CHANGE_DEVS, &mddev->flags);
+       if (mddev->thread)
+               md_wakeup_thread(mddev->thread);
+       else
+               md_update_sb(mddev, 1);
        md_new_event(mddev);
 
        return 0;
 
        rdev->raid_disk = -1;
 
-       md_update_sb(mddev, 1);
+       set_bit(MD_CHANGE_DEVS, &mddev->flags);
+       if (!mddev->thread)
+               md_update_sb(mddev, 1);
        /*
         * Kick recovery, maybe this spare has to be added to the
         * array immediately.