From: Hannes Reinecke <hare@suse.de>
Date: Fri, 27 Jul 2012 11:37:19 +0200
Subject: Abort pending request for RAID10
References: bnc#773251
Patch-Mainline: not yet

RAID10 delays the write until the bitmap has been updated.
So it really should check if the device is still working
before sending requests, otherwise it'll happily sending
I/O to a known faulty device.

Signed-off-by: Hannes Reinecke <hare@suse.de>

diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 459a625..7fff6b1 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -737,8 +737,23 @@ static void flush_pending_writes(conf_t *conf)
 
 		while (bio) { /* submit pending writes */
 			struct bio *next = bio->bi_next;
+			mdk_rdev_t *rdev = (void*)bio->bi_bdev;
+
 			bio->bi_next = NULL;
-			generic_make_request(bio);
+			bio->bi_bdev = rdev->bdev;
+
+			if (test_bit(Faulty, &rdev->flags)) {
+				/*
+				 * Do not send requests down
+				 * a faulty device.
+				 */
+				if (test_bit(Timeout, &rdev->flags))
+					bio_endio(bio, -ETIMEDOUT);
+				else
+					bio_endio(bio, -EIO);
+			} else {
+				generic_make_request(bio);
+			}
 			bio = next;
 		}
 	} else
@@ -1109,11 +1124,12 @@ static int make_request(mddev_t *mddev, struct bio * bio)
 
 		atomic_inc(&r10_bio->remaining);
 		spin_lock_irqsave(&conf->device_lock, flags);
-		bio_list_add(&conf->pending_bio_list, mbio);
-		spin_unlock_irqrestore(&conf->device_lock, flags);
 		trace_block_bio_remap(bdev_get_queue(mbio->bi_bdev),
 				      mbio, disk_devt(mddev->gendisk),
 				      r10_bio->sector);
+		mbio->bi_bdev = (void *)conf->mirrors[d].rdev;
+		bio_list_add(&conf->pending_bio_list, mbio);
+		spin_unlock_irqrestore(&conf->device_lock, flags);
 	}
 
 	if (atomic_dec_and_test(&r10_bio->remaining)) {
