diff options
author | NeilBrown <neilb@suse.de> | 2009-12-01 01:30:59 -0500 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2009-12-01 01:30:59 -0500 |
commit | d0e260782c3702a009645c3caa02e381dab8798b (patch) | |
tree | 588f7776216df124d9372c7ced833b0bfb6d0a7f /drivers/md/raid1.c | |
parent | a9366e61b03f55a6e009e687ad10e706714c9907 (diff) |
md: revert incorrect fix for read error handling in raid1.
commit 4706b349f was a forward port of a fix that was needed
for SLES10. But in fact it is not needed in mainline because
the earlier commit dd00a99e7a fixes the same problem in a
better way.
Further, this commit introduces a bug in the way it interacts with
the automatic read-error-correction. If, after a read error is
successfully corrected, the same disk is chosen to re-read - the
re-read won't be attempted but an error will be returned instead.
After reverting that commit, there is the possibility that a
read error on a read-only array (where read errors cannot
be corrected as that requires a write) will repeatedly read the same
device and continue to get an error.
So in the "Array is readonly" case, fail the drive immediately on
a read error.
Signed-off-by: NeilBrown <neilb@suse.de>
Cc: stable@kernel.org
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r-- | drivers/md/raid1.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index a053423785c9..e07ce2e033a9 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -1650,11 +1650,12 @@ static void raid1d(mddev_t *mddev) | |||
1650 | r1_bio->sector, | 1650 | r1_bio->sector, |
1651 | r1_bio->sectors); | 1651 | r1_bio->sectors); |
1652 | unfreeze_array(conf); | 1652 | unfreeze_array(conf); |
1653 | } | 1653 | } else |
1654 | md_error(mddev, | ||
1655 | conf->mirrors[r1_bio->read_disk].rdev); | ||
1654 | 1656 | ||
1655 | bio = r1_bio->bios[r1_bio->read_disk]; | 1657 | bio = r1_bio->bios[r1_bio->read_disk]; |
1656 | if ((disk=read_balance(conf, r1_bio)) == -1 || | 1658 | if ((disk=read_balance(conf, r1_bio)) == -1) { |
1657 | disk == r1_bio->read_disk) { | ||
1658 | printk(KERN_ALERT "raid1: %s: unrecoverable I/O" | 1659 | printk(KERN_ALERT "raid1: %s: unrecoverable I/O" |
1659 | " read error for block %llu\n", | 1660 | " read error for block %llu\n", |
1660 | bdevname(bio->bi_bdev,b), | 1661 | bdevname(bio->bi_bdev,b), |