int chunks_skipped = 0;
        sector_t chunk_mask = conf->geo.chunk_mask;
        int page_idx = 0;
+       int error_disk = -1;
 
        /*
         * Allow skipping a full rebuild for incremental assembly
                return reshape_request(mddev, sector_nr, skipped);
 
        if (chunks_skipped >= conf->geo.raid_disks) {
-               /* if there has been nothing to do on any drive,
-                * then there is nothing to do at all..
+               pr_err("md/raid10:%s: %s fails\n", mdname(mddev),
+                       test_bit(MD_RECOVERY_SYNC, &mddev->recovery) ?  "resync" : "recovery");
+               if (error_disk >= 0 &&
+                   !test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) {
+                       /*
+                        * recovery fails, set mirrors.recovery_disabled,
+                        * device shouldn't be added to there.
+                        */
+                       conf->mirrors[error_disk].recovery_disabled =
+                                               mddev->recovery_disabled;
+                       return 0;
+               }
+               /*
+                * if there has been nothing to do on any drive,
+                * then there is nothing to do at all.
                 */
                *skipped = 1;
                return (max_sector - sector_nr) + sectors_skipped;
                                                       mdname(mddev));
                                        mirror->recovery_disabled
                                                = mddev->recovery_disabled;
+                               } else {
+                                       error_disk = i;
                                }
                                put_buf(r10_bio);
                                if (rb2)