diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/md/raid1.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index e3cfca7cde16..cc24f0cb7ee3 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -391,6 +391,11 @@ static void raid1_end_write_request(struct bio *bio, int error) | |||
391 | if (!uptodate) { | 391 | if (!uptodate) { |
392 | set_bit(WriteErrorSeen, | 392 | set_bit(WriteErrorSeen, |
393 | &conf->mirrors[mirror].rdev->flags); | 393 | &conf->mirrors[mirror].rdev->flags); |
394 | if (!test_and_set_bit(WantReplacement, | ||
395 | &conf->mirrors[mirror].rdev->flags)) | ||
396 | set_bit(MD_RECOVERY_NEEDED, & | ||
397 | conf->mddev->recovery); | ||
398 | |||
394 | set_bit(R1BIO_WriteError, &r1_bio->state); | 399 | set_bit(R1BIO_WriteError, &r1_bio->state); |
395 | } else { | 400 | } else { |
396 | /* | 401 | /* |
@@ -1461,6 +1466,10 @@ static void end_sync_write(struct bio *bio, int error) | |||
1461 | } while (sectors_to_go > 0); | 1466 | } while (sectors_to_go > 0); |
1462 | set_bit(WriteErrorSeen, | 1467 | set_bit(WriteErrorSeen, |
1463 | &conf->mirrors[mirror].rdev->flags); | 1468 | &conf->mirrors[mirror].rdev->flags); |
1469 | if (!test_and_set_bit(WantReplacement, | ||
1470 | &conf->mirrors[mirror].rdev->flags)) | ||
1471 | set_bit(MD_RECOVERY_NEEDED, & | ||
1472 | mddev->recovery); | ||
1464 | set_bit(R1BIO_WriteError, &r1_bio->state); | 1473 | set_bit(R1BIO_WriteError, &r1_bio->state); |
1465 | } else if (is_badblock(conf->mirrors[mirror].rdev, | 1474 | } else if (is_badblock(conf->mirrors[mirror].rdev, |
1466 | r1_bio->sector, | 1475 | r1_bio->sector, |
@@ -1491,8 +1500,13 @@ static int r1_sync_page_io(struct md_rdev *rdev, sector_t sector, | |||
1491 | if (sync_page_io(rdev, sector, sectors << 9, page, rw, false)) | 1500 | if (sync_page_io(rdev, sector, sectors << 9, page, rw, false)) |
1492 | /* success */ | 1501 | /* success */ |
1493 | return 1; | 1502 | return 1; |
1494 | if (rw == WRITE) | 1503 | if (rw == WRITE) { |
1495 | set_bit(WriteErrorSeen, &rdev->flags); | 1504 | set_bit(WriteErrorSeen, &rdev->flags); |
1505 | if (!test_and_set_bit(WantReplacement, | ||
1506 | &rdev->flags)) | ||
1507 | set_bit(MD_RECOVERY_NEEDED, & | ||
1508 | rdev->mddev->recovery); | ||
1509 | } | ||
1496 | /* need to record an error - either for the block or the device */ | 1510 | /* need to record an error - either for the block or the device */ |
1497 | if (!rdev_set_badblocks(rdev, sector, sectors, 0)) | 1511 | if (!rdev_set_badblocks(rdev, sector, sectors, 0)) |
1498 | md_error(rdev->mddev, rdev); | 1512 | md_error(rdev->mddev, rdev); |