Commit 4706b349 authored by NeilBrown's avatar NeilBrown

md: Allow read error in a single drive raid1 to be passed up.

If a raid1 only has a single working device and gets a read error, 
we choose to simply return that error up to the filesystem (or whatever)
rather than failing the whole array.

However the codes doesn't quite do that.  We attempt a readbalance
which allocates the same drive, so we retry the read - indefinitely. 

Instead:  If read_balance in the error case chooses the same drive that just
failed, treat it as a failure and don't retry.
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent eda58a85
...@@ -1640,7 +1640,8 @@ static void raid1d(mddev_t *mddev) ...@@ -1640,7 +1640,8 @@ static void raid1d(mddev_t *mddev)
} }
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