|
@@ -7501,6 +7501,19 @@ void md_do_sync(struct md_thread *thread)
|
|
|
rdev->recovery_offset < j)
|
|
|
j = rdev->recovery_offset;
|
|
|
rcu_read_unlock();
|
|
|
+
|
|
|
+ /* If there is a bitmap, we need to make sure all
|
|
|
+ * writes that started before we added a spare
|
|
|
+ * complete before we start doing a recovery.
|
|
|
+ * Otherwise the write might complete and (via
|
|
|
+ * bitmap_endwrite) set a bit in the bitmap after the
|
|
|
+ * recovery has checked that bit and skipped that
|
|
|
+ * region.
|
|
|
+ */
|
|
|
+ if (mddev->bitmap) {
|
|
|
+ mddev->pers->quiesce(mddev, 1);
|
|
|
+ mddev->pers->quiesce(mddev, 0);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
printk(KERN_INFO "md: %s of RAID array %s\n", desc, mdname(mddev));
|