aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorMikulas Patocka <mpatocka@redhat.com>2010-03-05 21:32:22 -0500
committerAlasdair G Kergon <agk@redhat.com>2010-03-05 21:32:22 -0500
commitede5ea0b8b815560dc54c712536fdf0b456b6ad0 (patch)
tree6116cf45cdcfc07af4b59884b9ebc167c43f8f0c /drivers/md
parentfb61264297ca42a2a132f0433f75ccf7fd304ac6 (diff)
dm raid1: always return error if all legs fail
If all mirror legs fail, always return an error instead of holding the bio, even if the handle_errors option was set. At present it is the responsibility of the driver underneath us to deal with retries, multipath etc. The patch adds the bio to the failures list instead of holding it directly. do_failures tests first if all legs failed and, if so, returns the bio with -EIO. If any leg is still alive and handle_errors is set, do_failures calls hold_bio. Reviewed-by: Takahiro Yasui <tyasui@redhat.com> Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/dm-raid1.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c
index 6c1046df81f..de26fde4098 100644
--- a/drivers/md/dm-raid1.c
+++ b/drivers/md/dm-raid1.c
@@ -737,9 +737,12 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes)
737 dm_rh_delay(ms->rh, bio); 737 dm_rh_delay(ms->rh, bio);
738 738
739 while ((bio = bio_list_pop(&nosync))) { 739 while ((bio = bio_list_pop(&nosync))) {
740 if (unlikely(ms->leg_failure) && errors_handled(ms)) 740 if (unlikely(ms->leg_failure) && errors_handled(ms)) {
741 hold_bio(ms, bio); 741 spin_lock_irq(&ms->lock);
742 else { 742 bio_list_add(&ms->failures, bio);
743 spin_unlock_irq(&ms->lock);
744 wakeup_mirrord(ms);
745 } else {
743 map_bio(get_default_mirror(ms), bio); 746 map_bio(get_default_mirror(ms), bio);
744 generic_make_request(bio); 747 generic_make_request(bio);
745 } 748 }