| From 5528d17de1cf1462f285c40ccaf8e0d0e4c64dc0 Mon Sep 17 00:00:00 2001 |
| From: Mikulas Patocka <mpatocka@redhat.com> |
| Date: Tue, 16 Feb 2010 18:42:55 +0000 |
| Subject: dm raid1: fail writes if errors are not handled and log fails |
| |
| From: Mikulas Patocka <mpatocka@redhat.com> |
| |
| commit 5528d17de1cf1462f285c40ccaf8e0d0e4c64dc0 upstream. |
| |
| If the mirror log fails when the handle_errors option was not selected |
| and there is no remaining valid mirror leg, writes return success even |
| though they weren't actually written to any device. This patch |
| completes them with EIO instead. |
| |
| This code path is taken: |
| do_writes: |
| bio_list_merge(&ms->failures, &sync); |
| do_failures: |
| if (!get_valid_mirror(ms)) (false) |
| else if (errors_handled(ms)) (false) |
| else bio_endio(bio, 0); |
| |
| The logic in do_failures is based on presuming that the write was already |
| tried: if it succeeded at least on one leg (without handle_errors) it |
| is reported as success. |
| |
| Reference: https://bugzilla.redhat.com/show_bug.cgi?id=555197 |
| |
| Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> |
| Signed-off-by: Alasdair G Kergon <agk@redhat.com> |
| Cc: maximilian attems <max@stro.at> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/md/dm-raid1.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/md/dm-raid1.c |
| +++ b/drivers/md/dm-raid1.c |
| @@ -659,7 +659,7 @@ static void do_writes(struct mirror_set |
| /* |
| * Dispatch io. |
| */ |
| - if (unlikely(ms->log_failure)) { |
| + if (unlikely(ms->log_failure) && errors_handled(ms)) { |
| spin_lock_irq(&ms->lock); |
| bio_list_merge(&ms->failures, &sync); |
| spin_unlock_irq(&ms->lock); |