Make 'repair' actually work for raid1.
When 'repair' finds a block that is different one the various parts of the mirror. it is meant to write a chosen good version to the others. However it currently writes out the original data to each. The memcpy to make all the data the same is missing. Also correct a test so that 'repair' causes a repair, rather than anything other then 'repair'. Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Adrian Bunk <bunk@stusta.de>
This commit is contained in:
+1
-1
@@ -2193,7 +2193,7 @@ action_store(mddev_t *mddev, const char *page, size_t len)
|
||||
else {
|
||||
if (cmd_match(page, "check"))
|
||||
set_bit(MD_RECOVERY_CHECK, &mddev->recovery);
|
||||
else if (cmd_match(page, "repair"))
|
||||
else if (!cmd_match(page, "repair"))
|
||||
return -EINVAL;
|
||||
set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
|
||||
set_bit(MD_RECOVERY_SYNC, &mddev->recovery);
|
||||
|
||||
@@ -1215,6 +1215,11 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
|
||||
sbio->bi_sector = r1_bio->sector +
|
||||
conf->mirrors[i].rdev->data_offset;
|
||||
sbio->bi_bdev = conf->mirrors[i].rdev->bdev;
|
||||
for (j = 0; j < vcnt ; j++)
|
||||
memcpy(page_address(sbio->bi_io_vec[j].bv_page),
|
||||
page_address(pbio->bi_io_vec[j].bv_page),
|
||||
PAGE_SIZE);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user