Commit d0e26078 authored by NeilBrown's avatar NeilBrown

md: revert incorrect fix for read error handling in raid1.

commit 4706b349 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 dd00a99e 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: default avatarNeilBrown <neilb@suse.de>
Cc: stable@kernel.org
parent a9366e61
...@@ -1650,11 +1650,12 @@ static void raid1d(mddev_t *mddev) ...@@ -1650,11 +1650,12 @@ static void raid1d(mddev_t *mddev)
r1_bio->sector, r1_bio->sector,
r1_bio->sectors); r1_bio->sectors);
unfreeze_array(conf); unfreeze_array(conf);
} } else
md_error(mddev,
conf->mirrors[r1_bio->read_disk].rdev);
bio = r1_bio->bios[r1_bio->read_disk]; bio = r1_bio->bios[r1_bio->read_disk];
if ((disk=read_balance(conf, r1_bio)) == -1 || if ((disk=read_balance(conf, r1_bio)) == -1) {
disk == r1_bio->read_disk) {
printk(KERN_ALERT "raid1: %s: unrecoverable I/O" printk(KERN_ALERT "raid1: %s: unrecoverable I/O"
" read error for block %llu\n", " read error for block %llu\n",
bdevname(bio->bi_bdev,b), bdevname(bio->bi_bdev,b),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment