aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2005-11-09 00:39:38 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2005-11-09 10:56:39 -0500
commite5de485f00d6e6c15f487869faaf999c708f69b1 (patch)
tree16e7648ba0ebf602597a6a0973813d606f749bde /drivers/md
parentf637b9f9fc195e4f4635faf495fd8b462c21b411 (diff)
[PATCH] md: make manual repair work for raid1
Raid1 currently optimises resync using the intent bitmap etc. This optimisation is not wanted when we explicitly request a repair through sysfs, so add appropriate checks. Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/raid1.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 1cbf51fbd43f..2da9d3ba902d 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -1310,7 +1310,7 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
1310 * This call the bitmap_start_sync doesn't actually record anything 1310 * This call the bitmap_start_sync doesn't actually record anything
1311 */ 1311 */
1312 if (!bitmap_start_sync(mddev->bitmap, sector_nr, &sync_blocks, 1) && 1312 if (!bitmap_start_sync(mddev->bitmap, sector_nr, &sync_blocks, 1) &&
1313 !conf->fullsync) { 1313 !conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {
1314 /* We can skip this block, and probably several more */ 1314 /* We can skip this block, and probably several more */
1315 *skipped = 1; 1315 *skipped = 1;
1316 return sync_blocks; 1316 return sync_blocks;
@@ -1387,7 +1387,8 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
1387 still_degraded = 1; 1387 still_degraded = 1;
1388 continue; 1388 continue;
1389 } else if (!test_bit(In_sync, &conf->mirrors[i].rdev->flags) || 1389 } else if (!test_bit(In_sync, &conf->mirrors[i].rdev->flags) ||
1390 sector_nr + RESYNC_SECTORS > mddev->recovery_cp) { 1390 sector_nr + RESYNC_SECTORS > mddev->recovery_cp ||
1391 test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {
1391 bio->bi_rw = WRITE; 1392 bio->bi_rw = WRITE;
1392 bio->bi_end_io = end_sync_write; 1393 bio->bi_end_io = end_sync_write;
1393 write_targets ++; 1394 write_targets ++;
@@ -1421,8 +1422,9 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
1421 break; 1422 break;
1422 if (sync_blocks == 0) { 1423 if (sync_blocks == 0) {
1423 if (!bitmap_start_sync(mddev->bitmap, sector_nr, 1424 if (!bitmap_start_sync(mddev->bitmap, sector_nr,
1424 &sync_blocks, still_degraded) && 1425 &sync_blocks, still_degraded) &&
1425 !conf->fullsync) 1426 !conf->fullsync &&
1427 !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery))
1426 break; 1428 break;
1427 if (sync_blocks < (PAGE_SIZE>>9)) 1429 if (sync_blocks < (PAGE_SIZE>>9))
1428 BUG(); 1430 BUG();