sector_t sect;
                        int must_sync;
                        int any_working;
-                       int need_recover = 0;
                        struct raid10_info *mirror = &conf->mirrors[i];
                        struct md_rdev *mrdev, *mreplace;
 
                        mrdev = rcu_dereference(mirror->rdev);
                        mreplace = rcu_dereference(mirror->replacement);
 
-                       if (mrdev != NULL &&
-                           !test_bit(Faulty, &mrdev->flags) &&
-                           !test_bit(In_sync, &mrdev->flags))
-                               need_recover = 1;
+                       if (mrdev && (test_bit(Faulty, &mrdev->flags) ||
+                           test_bit(In_sync, &mrdev->flags)))
+                               mrdev = NULL;
                        if (mreplace && test_bit(Faulty, &mreplace->flags))
                                mreplace = NULL;
 
-                       if (!need_recover && !mreplace) {
+                       if (!mrdev && !mreplace) {
                                rcu_read_unlock();
                                continue;
                        }
                                rcu_read_unlock();
                                continue;
                        }
-                       atomic_inc(&mrdev->nr_pending);
+                       if (mrdev)
+                               atomic_inc(&mrdev->nr_pending);
                        if (mreplace)
                                atomic_inc(&mreplace->nr_pending);
                        rcu_read_unlock();
                                r10_bio->devs[1].devnum = i;
                                r10_bio->devs[1].addr = to_addr;
 
-                               if (need_recover) {
+                               if (mrdev) {
                                        bio = r10_bio->devs[1].bio;
                                        bio->bi_next = biolist;
                                        biolist = bio;
                                        for (k = 0; k < conf->copies; k++)
                                                if (r10_bio->devs[k].devnum == i)
                                                        break;
-                                       if (!test_bit(In_sync,
+                                       if (mrdev && !test_bit(In_sync,
                                                      &mrdev->flags)
                                            && !rdev_set_badblocks(
                                                    mrdev,
                                if (rb2)
                                        atomic_dec(&rb2->remaining);
                                r10_bio = rb2;
-                               rdev_dec_pending(mrdev, mddev);
+                               if (mrdev)
+                                       rdev_dec_pending(mrdev, mddev);
                                if (mreplace)
                                        rdev_dec_pending(mreplace, mddev);
                                break;
                        }
-                       rdev_dec_pending(mrdev, mddev);
+                       if (mrdev)
+                               rdev_dec_pending(mrdev, mddev);
                        if (mreplace)
                                rdev_dec_pending(mreplace, mddev);
                        if (r10_bio->devs[0].bio->bi_opf & MD_FAILFAST) {