]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
dm raid1: always return error if all legs fail
authorMikulas Patocka <mpatocka@redhat.com>
Sat, 6 Mar 2010 02:32:22 +0000 (02:32 +0000)
committerAlasdair G Kergon <agk@redhat.com>
Sat, 6 Mar 2010 02:32:22 +0000 (02:32 +0000)
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>
drivers/md/dm-raid1.c

index 6c1046df81f6f7738cd74eec6a6d5558a8e23f13..de26fde4098f6bdfe13c41470056a88f74ff38ef 100644 (file)
@@ -737,9 +737,12 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes)
                dm_rh_delay(ms->rh, bio);
 
        while ((bio = bio_list_pop(&nosync))) {
-               if (unlikely(ms->leg_failure) && errors_handled(ms))
-                       hold_bio(ms, bio);
-               else {
+               if (unlikely(ms->leg_failure) && errors_handled(ms)) {
+                       spin_lock_irq(&ms->lock);
+                       bio_list_add(&ms->failures, bio);
+                       spin_unlock_irq(&ms->lock);
+                       wakeup_mirrord(ms);
+               } else {
                        map_bio(get_default_mirror(ms), bio);
                        generic_make_request(bio);
                }