aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-04-01 11:39:05 -0400
committerNeilBrown <neilb@suse.de>2012-04-03 01:39:23 -0400
commit5020ad7d143ccfcf8149974096220d59e5572120 (patch)
tree0124b6866ecd63b3a8913a6661e1d96699d60b71 /drivers/md
parentc6d2e084c7411f61f2b446d94989e5aaf9879b0f (diff)
md/raid1,raid10: don't compare excess byte during consistency check.
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>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/raid1.c2
-rw-r--r--drivers/md/raid10.c2
2 files changed, 2 insertions, 2 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 8c420f178603..d35e4c991e38 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -1738,7 +1738,7 @@ static int process_checks(struct r1bio *r1_bio)
1738 s = sbio->bi_io_vec[j].bv_page; 1738 s = sbio->bi_io_vec[j].bv_page;
1739 if (memcmp(page_address(p), 1739 if (memcmp(page_address(p),
1740 page_address(s), 1740 page_address(s),
1741 PAGE_SIZE)) 1741 sbio->bi_io_vec[j].bv_len))
1742 break; 1742 break;
1743 } 1743 }
1744 } else 1744 } else
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 3540316886f2..fff782189e48 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1821,7 +1821,7 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)
1821 for (j = 0; j < vcnt; j++) 1821 for (j = 0; j < vcnt; j++)
1822 if (memcmp(page_address(fbio->bi_io_vec[j].bv_page), 1822 if (memcmp(page_address(fbio->bi_io_vec[j].bv_page),
1823 page_address(tbio->bi_io_vec[j].bv_page), 1823 page_address(tbio->bi_io_vec[j].bv_page),
1824 PAGE_SIZE)) 1824 fbio->bi_io_vec[j].bv_len))
1825 break; 1825 break;
1826 if (j == vcnt) 1826 if (j == vcnt)
1827 continue; 1827 continue;