From: NeilBrown Date: Wed, 25 Feb 2009 02:18:47 +0000 (+1100) Subject: md/raid10: Don't skip more than 1 bitmap-chunk at a time during recovery. X-Git-Tag: v2.6.28.8~83 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6bd24b2f85a3290c1b68f7a9185bd87bf506a441;p=thirdparty%2Fkernel%2Fstable.git md/raid10: Don't skip more than 1 bitmap-chunk at a time during recovery. commit 09b4068a7fe442efc40e9dcbcf5ff37c3338ab15 upstream. When doing recovery on a raid10 with a write-intent bitmap, we only need to recovery chunks that are flagged in the bitmap. However if we choose to skip a chunk as it isn't flag, the code currently skips the whole raid10-chunk, thus it might not recovery some blocks that need recovering. This patch fixes it. In case that is confusing, it might help to understand that there is a 'raid10 chunk size' which guides how data is distributed across the devices, and a 'bitmap chunk size' which says how much data corresponds to a single bit in the bitmap. This bug only affects cases where the bitmap chunk size is smaller than the raid10 chunk size. Signed-off-by: NeilBrown Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 05949b29552fd..b2fde773c253c 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -2011,13 +2011,13 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i /* There is nowhere to write, so all non-sync * drives must be failed, so try the next chunk... */ - { - sector_t sec = max_sector - sector_nr; - sectors_skipped += sec; + if (sector_nr + max_sync < max_sector) + max_sector = sector_nr + max_sync; + + sectors_skipped += (max_sector - sector_nr); chunks_skipped ++; sector_nr = max_sector; goto skipped; - } } static int run(mddev_t *mddev)