aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid10.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2009-02-24 21:18:47 -0500
committerNeilBrown <neilb@suse.de>2009-02-24 21:18:47 -0500
commit78200d45cde2a79c0d0ae0407883bb264caa3c18 (patch)
treebda4b9d8607410d01f819b6789b58d74188c915b /drivers/md/raid10.c
parent09b4068a7fe442efc40e9dcbcf5ff37c3338ab15 (diff)
md/raid10: Don't call bitmap_cond_end_sync when we are doing recovery.
For raid1/4/5/6, resync (fixing inconsistencies between devices) is very similar to recovery (rebuilding a failed device onto a spare). The both walk through the device addresses in order. For raid10 it can be quite different. resync follows the 'array' address, and makes sure all copies are the same. Recover walks through 'device' addresses and recreates each missing block. The 'bitmap_cond_end_sync' function allows the write-intent-bitmap (When present) to be updated to reflect a partially completed resync. It makes assumptions which mean that it does not work correctly for raid10 recovery at all. In particularly, it can cause bitmap-directed recovery of a raid10 to not recovery some of the blocks that need to be recovered. So move the call to bitmap_cond_end_sync into the resync path, rather than being in the common "resync or recovery" path. Cc: stable@kernel.org Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md/raid10.c')
-rw-r--r--drivers/md/raid10.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 118f89e716ea..e1feb87afc6c 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1749,8 +1749,6 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
1749 if (!go_faster && conf->nr_waiting) 1749 if (!go_faster && conf->nr_waiting)
1750 msleep_interruptible(1000); 1750 msleep_interruptible(1000);
1751 1751
1752 bitmap_cond_end_sync(mddev->bitmap, sector_nr);
1753
1754 /* Again, very different code for resync and recovery. 1752 /* Again, very different code for resync and recovery.
1755 * Both must result in an r10bio with a list of bios that 1753 * Both must result in an r10bio with a list of bios that
1756 * have bi_end_io, bi_sector, bi_bdev set, 1754 * have bi_end_io, bi_sector, bi_bdev set,
@@ -1886,6 +1884,8 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
1886 /* resync. Schedule a read for every block at this virt offset */ 1884 /* resync. Schedule a read for every block at this virt offset */
1887 int count = 0; 1885 int count = 0;
1888 1886
1887 bitmap_cond_end_sync(mddev->bitmap, sector_nr);
1888
1889 if (!bitmap_start_sync(mddev->bitmap, sector_nr, 1889 if (!bitmap_start_sync(mddev->bitmap, sector_nr,
1890 &sync_blocks, mddev->degraded) && 1890 &sync_blocks, mddev->degraded) &&
1891 !conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { 1891 !conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {