--- /dev/null
+From aba336bd1d46d6b0404b06f6915ed76150739057 Mon Sep 17 00:00:00 2001
+From: NeilBrown <neilb@suse.de>
+Date: Thu, 31 May 2012 15:39:11 +1000
+Subject: md: raid1/raid10: fix problem with merge_bvec_fn
+
+From: NeilBrown <neilb@suse.de>
+
+commit aba336bd1d46d6b0404b06f6915ed76150739057 upstream.
+
+The new merge_bvec_fn which calls the corresponding function
+in subsidiary devices requires that mddev->merge_check_needed
+be set if any child has a merge_bvec_fn.
+
+However were were only setting that when a device was hot-added,
+not when a device was present from the start.
+
+This bug was introduced in 3.4 so patch is suitable for 3.4.y
+kernels. However that are conflicts in raid10.c so a separate
+patch will be needed for 3.4.y.
+
+Reported-by: Sebastian Riemer <sebastian.riemer@profitbricks.com>
+Signed-off-by: NeilBrown <neilb@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/md/raid1.c | 4 ++++
+ drivers/md/raid10.c | 5 ++++-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+--- a/drivers/md/raid1.c
++++ b/drivers/md/raid1.c
+@@ -2548,6 +2548,7 @@ static struct r1conf *setup_conf(struct
+ err = -EINVAL;
+ spin_lock_init(&conf->device_lock);
+ rdev_for_each(rdev, mddev) {
++ struct request_queue *q;
+ int disk_idx = rdev->raid_disk;
+ if (disk_idx >= mddev->raid_disks
+ || disk_idx < 0)
+@@ -2560,6 +2561,9 @@ static struct r1conf *setup_conf(struct
+ if (disk->rdev)
+ goto abort;
+ disk->rdev = rdev;
++ q = bdev_get_queue(rdev->bdev);
++ if (q->merge_bvec_fn)
++ mddev->merge_check_needed = 1;
+
+ disk->head_position = 0;
+ }
+--- a/drivers/md/raid10.c
++++ b/drivers/md/raid10.c
+@@ -3311,7 +3311,7 @@ static int run(struct mddev *mddev)
+ (conf->raid_disks / conf->near_copies));
+
+ rdev_for_each(rdev, mddev) {
+-
++ struct request_queue *q;
+ disk_idx = rdev->raid_disk;
+ if (disk_idx >= conf->raid_disks
+ || disk_idx < 0)
+@@ -3327,6 +3327,9 @@ static int run(struct mddev *mddev)
+ goto out_free_conf;
+ disk->rdev = rdev;
+ }
++ q = bdev_get_queue(rdev->bdev);
++ if (q->merge_bvec_fn)
++ mddev->merge_check_needed = 1;
+
+ disk_stack_limits(mddev->gendisk, rdev->bdev,
+ rdev->data_offset << 9);