|
@@ -668,7 +668,14 @@ static int super_load(struct md_rdev *rdev, struct md_rdev *refdev)
|
|
|
return ret;
|
|
|
|
|
|
sb = page_address(rdev->sb_page);
|
|
|
- if (sb->magic != cpu_to_le32(DM_RAID_MAGIC)) {
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Two cases that we want to write new superblocks and rebuild:
|
|
|
+ * 1) New device (no matching magic number)
|
|
|
+ * 2) Device specified for rebuild (!In_sync w/ offset == 0)
|
|
|
+ */
|
|
|
+ if ((sb->magic != cpu_to_le32(DM_RAID_MAGIC)) ||
|
|
|
+ (!test_bit(In_sync, &rdev->flags) && !rdev->recovery_offset)) {
|
|
|
super_sync(rdev->mddev, rdev);
|
|
|
|
|
|
set_bit(FirstUse, &rdev->flags);
|
|
@@ -745,11 +752,8 @@ static int super_init_validation(struct mddev *mddev, struct md_rdev *rdev)
|
|
|
*/
|
|
|
rdev_for_each(r, t, mddev) {
|
|
|
if (!test_bit(In_sync, &r->flags)) {
|
|
|
- if (!test_bit(FirstUse, &r->flags))
|
|
|
- DMERR("Superblock area of "
|
|
|
- "rebuild device %d should have been "
|
|
|
- "cleared.", r->raid_disk);
|
|
|
- set_bit(FirstUse, &r->flags);
|
|
|
+ DMINFO("Device %d specified for rebuild: "
|
|
|
+ "Clearing superblock", r->raid_disk);
|
|
|
rebuilds++;
|
|
|
} else if (test_bit(FirstUse, &r->flags))
|
|
|
new_devs++;
|