return false;
 }
 
+static bool rdev_is_spare(struct md_rdev *rdev)
+{
+       return !test_bit(Candidate, &rdev->flags) && rdev->raid_disk >= 0 &&
+              !test_bit(In_sync, &rdev->flags) &&
+              !test_bit(Journal, &rdev->flags) &&
+              !test_bit(Faulty, &rdev->flags);
+}
+
 static int remove_and_add_spares(struct mddev *mddev,
                                 struct md_rdev *this)
 {
        rdev_for_each(rdev, mddev) {
                if (this && this != rdev)
                        continue;
+               if (rdev_is_spare(rdev))
+                       spares++;
                if (test_bit(Candidate, &rdev->flags))
                        continue;
-               if (rdev->raid_disk >= 0 &&
-                   !test_bit(In_sync, &rdev->flags) &&
-                   !test_bit(Journal, &rdev->flags) &&
-                   !test_bit(Faulty, &rdev->flags))
-                       spares++;
                if (rdev->raid_disk >= 0)
                        continue;
                if (test_bit(Faulty, &rdev->flags))