summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikulas Patocka <mpatocka@redhat.com>2010-03-06 02:32:22 +0000
committerAlasdair G Kergon <agk@redhat.com>2010-03-06 02:32:22 +0000
commitede5ea0b8b815560dc54c712536fdf0b456b6ad0 (patch)
tree6116cf45cdcfc07af4b59884b9ebc167c43f8f0c
parentfb61264297ca42a2a132f0433f75ccf7fd304ac6 (diff)
downloadop-kernel-dev-ede5ea0b8b815560dc54c712536fdf0b456b6ad0.zip
op-kernel-dev-ede5ea0b8b815560dc54c712536fdf0b456b6ad0.tar.gz
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>
-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 6c1046d..de26fde 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)
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);
}
OpenPOWER on IntegriCloud