md/raid1,raid10: don't compare excess byte during consistency check.
authorNeilBrown <neilb@suse.de>
Sun, 1 Apr 2012 15:39:05 +0000 (01:39 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 3 Apr 2012 05:39:23 +0000 (15:39 +1000)
When comparing two pages read from different legs of a mirror, only
compare the bytes that were read, not the whole page.

In most cases we read a whole page, but in some cases with
bad blocks or odd sizes devices we might read fewer than that.

This bug has been present "forever" but at worst it might cause
a report of two many mismatches and generate a little bit
extra resync IO, so there is no need to back-port to -stable
kernels.

Reported-by: majianpeng <majianpeng@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/raid1.c
drivers/md/raid10.c

index 8c420f178603b914a8c0b2deeff47caf043ee991..d35e4c991e38262425cf4495ed6fe98676210ef8 100644 (file)
@@ -1738,7 +1738,7 @@ static int process_checks(struct r1bio *r1_bio)
                                s = sbio->bi_io_vec[j].bv_page;
                                if (memcmp(page_address(p),
                                           page_address(s),
-                                          PAGE_SIZE))
+                                          sbio->bi_io_vec[j].bv_len))
                                        break;
                        }
                } else
index 3540316886f2bca71a7bd943c4cf98de610ac1ae..fff782189e48f017f3407bb93ec7847a1fe367fd 100644 (file)
@@ -1821,7 +1821,7 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)
                        for (j = 0; j < vcnt; j++)
                                if (memcmp(page_address(fbio->bi_io_vec[j].bv_page),
                                           page_address(tbio->bi_io_vec[j].bv_page),
-                                          PAGE_SIZE))
+                                          fbio->bi_io_vec[j].bv_len))
                                        break;
                        if (j == vcnt)
                                continue;