From 7abb162db2a75253d280774a0e1803815b54844c Mon Sep 17 00:00:00 2001 From: Alex Lyakas Date: Tue, 4 Jun 2013 20:42:21 +0300 Subject: [PATCH] --- yaml --- r: 377041 b: refs/heads/master c: 3056e3aec8d8ba61a0710fb78b2d562600aa2ea7 h: refs/heads/master i: 377039: 9f2bc60bf93ec5da1b8358781cdfe4405e96b4a9 v: v3 --- [refs] | 2 +- trunk/drivers/md/raid1.c | 12 +++++++++++- trunk/drivers/md/raid10.c | 12 +++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 22ccccb96043..6a74b3f98736 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6b6204ee92adb53bfd6a77cb5679282ec3820c4b +refs/heads/master: 3056e3aec8d8ba61a0710fb78b2d562600aa2ea7 diff --git a/trunk/drivers/md/raid1.c b/trunk/drivers/md/raid1.c index 851023e2ba5d..f2db7a9d5964 100644 --- a/trunk/drivers/md/raid1.c +++ b/trunk/drivers/md/raid1.c @@ -427,7 +427,17 @@ static void raid1_end_write_request(struct bio *bio, int error) r1_bio->bios[mirror] = NULL; to_put = bio; - set_bit(R1BIO_Uptodate, &r1_bio->state); + /* + * Do not set R1BIO_Uptodate if the current device is + * rebuilding or Faulty. This is because we cannot use + * such device for properly reading the data back (we could + * potentially use it, if the current write would have felt + * before rdev->recovery_offset, but for simplicity we don't + * check this here. + */ + if (test_bit(In_sync, &conf->mirrors[mirror].rdev->flags) && + !test_bit(Faulty, &conf->mirrors[mirror].rdev->flags)) + set_bit(R1BIO_Uptodate, &r1_bio->state); /* Maybe we can clear some bad blocks. */ if (is_badblock(conf->mirrors[mirror].rdev, diff --git a/trunk/drivers/md/raid10.c b/trunk/drivers/md/raid10.c index 018741ba9310..8000ee25650d 100644 --- a/trunk/drivers/md/raid10.c +++ b/trunk/drivers/md/raid10.c @@ -490,7 +490,17 @@ static void raid10_end_write_request(struct bio *bio, int error) sector_t first_bad; int bad_sectors; - set_bit(R10BIO_Uptodate, &r10_bio->state); + /* + * Do not set R10BIO_Uptodate if the current device is + * rebuilding or Faulty. This is because we cannot use + * such device for properly reading the data back (we could + * potentially use it, if the current write would have felt + * before rdev->recovery_offset, but for simplicity we don't + * check this here. + */ + if (test_bit(In_sync, &rdev->flags) && + !test_bit(Faulty, &rdev->flags)) + set_bit(R10BIO_Uptodate, &r10_bio->state); /* Maybe we can clear some bad blocks. */ if (is_badblock(rdev,