dm raid1: fix error count
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. Cc: stable@kernel.org 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>
This commit is contained in:
committed by
Alasdair G Kergon
parent
c7a2bd19b7
commit
d460c65a6a
@@ -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_set *ms = m->ms;
|
||||||
struct mirror *new;
|
struct mirror *new;
|
||||||
|
|
||||||
if (!errors_handled(ms))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* error_count is used for nothing more than a
|
* error_count is used for nothing more than a
|
||||||
* simple way to tell if a device has encountered
|
* 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))
|
if (test_and_set_bit(error_type, &m->error_type))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!errors_handled(ms))
|
||||||
|
return;
|
||||||
|
|
||||||
if (m != get_default_mirror(ms))
|
if (m != get_default_mirror(ms))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user