Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

md/raid10: Don't skip more than 1 bitmap-chunk at a time during recovery.

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.



Cc: stable@kernel.org
Signed-off-by: NeilBrown <neilb@suse.de>

NeilBrown 09b4068a 2ec77fc9

+4 -4
+4 -4
drivers/md/raid10.c
··· 2010 2010 /* There is nowhere to write, so all non-sync 2011 2011 * drives must be failed, so try the next chunk... 2012 2012 */ 2013 - { 2014 - sector_t sec = max_sector - sector_nr; 2015 - sectors_skipped += sec; 2013 + if (sector_nr + max_sync < max_sector) 2014 + max_sector = sector_nr + max_sync; 2015 + 2016 + sectors_skipped += (max_sector - sector_nr); 2016 2017 chunks_skipped ++; 2017 2018 sector_nr = max_sector; 2018 2019 goto skipped; 2019 - } 2020 2020 } 2021 2021 2022 2022 static int run(mddev_t *mddev)