while (bio) { /* submit pending writes */
                        struct bio *next = bio->bi_next;
+                       struct md_rdev *rdev = (void*)bio->bi_bdev;
                        bio->bi_next = NULL;
-                       if (unlikely((bio_op(bio) ==  REQ_OP_DISCARD) &&
-                           !blk_queue_discard(bdev_get_queue(bio->bi_bdev))))
+                       bio->bi_bdev = rdev->bdev;
+                       if (test_bit(Faulty, &rdev->flags)) {
+                               bio->bi_error = -EIO;
+                               bio_endio(bio);
+                       } else if (unlikely((bio_op(bio) ==  REQ_OP_DISCARD) &&
+                                           !blk_queue_discard(bdev_get_queue(bio->bi_bdev))))
                                /* Just ignore it */
                                bio_endio(bio);
                        else
 
        while (bio) { /* submit pending writes */
                struct bio *next = bio->bi_next;
+               struct md_rdev *rdev = (void*)bio->bi_bdev;
                bio->bi_next = NULL;
-               if (unlikely((bio_op(bio) ==  REQ_OP_DISCARD) &&
-                   !blk_queue_discard(bdev_get_queue(bio->bi_bdev))))
+               bio->bi_bdev = rdev->bdev;
+               if (test_bit(Faulty, &rdev->flags)) {
+                       bio->bi_error = -EIO;
+                       bio_endio(bio);
+               } else if (unlikely((bio_op(bio) ==  REQ_OP_DISCARD) &&
+                                   !blk_queue_discard(bdev_get_queue(bio->bi_bdev))))
                        /* Just ignore it */
                        bio_endio(bio);
                else
                        mbio->bi_iter.bi_sector = (r10_bio->devs[i].addr+
                                           choose_data_offset(r10_bio,
                                                              rdev));
-                       mbio->bi_bdev = rdev->bdev;
+                       mbio->bi_bdev = (void*)rdev;
                        mbio->bi_end_io = raid10_end_write_request;
                        bio_set_op_attrs(mbio, op, do_sync | do_fua);
                        mbio->bi_private = r10_bio;
                        mbio->bi_iter.bi_sector = (r10_bio->devs[i].addr +
                                           choose_data_offset(
                                                   r10_bio, rdev));
-                       mbio->bi_bdev = rdev->bdev;
+                       mbio->bi_bdev = (void*)rdev;
                        mbio->bi_end_io = raid10_end_write_request;
                        bio_set_op_attrs(mbio, op, do_sync | do_fua);
                        mbio->bi_private = r10_bio;