]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Make 'repair' actually work for raid1.
authorNeil Brown <neilb@suse.de>
Tue, 30 Jan 2007 23:53:52 +0000 (00:53 +0100)
committerAdrian Bunk <bunk@stusta.de>
Sat, 3 Feb 2007 00:56:23 +0000 (01:56 +0100)
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>
drivers/md/md.c
drivers/md/raid1.c

index 2fd2cd4470a678a657a8ca1e7f578c3e966692e5..adf27f23283820e12968bc1e9910a523d49ae858 100644 (file)
@@ -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);
index f0b7caa4a878b08b4c4ea0af2cbaf60d4c9d79c1..59cd546cdecbbd90896843466e17bfa91ffc15ae 100644 (file)
@@ -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);
+
                                }
                        }
        }