]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
dm raid1: fix error count
authorJonathan Brassow <jbrassow@redhat.com>
Tue, 6 Jan 2009 03:04:57 +0000 (03:04 +0000)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sun, 18 Jan 2009 18:43:46 +0000 (10:43 -0800)
commit d460c65a6a9ec9e0d284864ec3a9a2d1b73f0e43 upstream.

Always increase the error count when I/O on a leg of a mirror fails.

The error count is used to decide whether to select an alternative
mirror leg.  If the target doesn't use the "handle_errors" feature, the
error count is not updated and the bio can get requeued forever by the
read callback.

Fix it by increasing error_count before the handle_errors feature
checking.

Signed-off-by: Milan Broz <mbroz@redhat.com>
Signed-off-by: Jonathan Brassow <jbrassow@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/md/dm-raid1.c

index ec43f9fa4b2acaffed0bf45f79edc5a115f36804..d0fed2b21b089b68f96f0c51a59c2dfdfc84c2ab 100644 (file)
@@ -197,9 +197,6 @@ static void fail_mirror(struct mirror *m, enum dm_raid1_error error_type)
        struct mirror_set *ms = m->ms;
        struct mirror *new;
 
-       if (!errors_handled(ms))
-               return;
-
        /*
         * error_count is used for nothing more than a
         * simple way to tell if a device has encountered
@@ -210,6 +207,9 @@ static void fail_mirror(struct mirror *m, enum dm_raid1_error error_type)
        if (test_and_set_bit(error_type, &m->error_type))
                return;
 
+       if (!errors_handled(ms))
+               return;
+
        if (m != get_default_mirror(ms))
                goto out;