--- /dev/null
+From c6d2e084c7411f61f2b446d94989e5aaf9879b0f Mon Sep 17 00:00:00 2001
+From: majianpeng <majianpeng@gmail.com>
+Date: Mon, 2 Apr 2012 01:16:59 +1000
+Subject: md/raid5: Fix a bug about judging if the operation is syncing or replacing
+
+From: majianpeng <majianpeng@gmail.com>
+
+commit c6d2e084c7411f61f2b446d94989e5aaf9879b0f upstream.
+
+When create a raid5 using assume-clean and echo check or repair to
+sync_action.Then component disks did not operated IO but the raid
+check/resync faster than normal.
+Because the judgement in function analyse_stripe():
+ if (do_recovery ||
+ sh->sector >= conf->mddev->recovery_cp)
+ s->syncing = 1;
+ else
+ s->replacing = 1;
+When check or repair,the recovery_cp == MaxSectore,so syncing equal zero
+not one.
+
+This bug was introduced by commit 9a3e1101b827
+ md/raid5: detect and handle replacements during recovery.
+so this patch is suitable for 3.3-stable.
+
+Signed-off-by: majianpeng <majianpeng@gmail.com>
+Signed-off-by: NeilBrown <neilb@suse.de>
+Cc: Jes Sorensen <Jes.Sorensen@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/md/raid5.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/drivers/md/raid5.c
++++ b/drivers/md/raid5.c
+@@ -3277,12 +3277,14 @@ static void analyse_stripe(struct stripe
+ /* If there is a failed device being replaced,
+ * we must be recovering.
+ * else if we are after recovery_cp, we must be syncing
++ * else if MD_RECOVERY_REQUESTED is set, we also are syncing.
+ * else we can only be replacing
+ * sync and recovery both need to read all devices, and so
+ * use the same flag.
+ */
+ if (do_recovery ||
+- sh->sector >= conf->mddev->recovery_cp)
++ sh->sector >= conf->mddev->recovery_cp ||
++ test_bit(MD_RECOVERY_REQUESTED, &(conf->mddev->recovery)))
+ s->syncing = 1;
+ else
+ s->replacing = 1;