From 8b69eca3d629bf0c9f5895b101e0018100c8f5dc Mon Sep 17 00:00:00 2001 From: Jonathan Brassow Date: Thu, 12 Jul 2007 17:29:15 +0100 Subject: [PATCH] --- yaml --- r: 59289 b: refs/heads/master c: fc1ff9588a6d56258ff9576a31aa34f17757c666 h: refs/heads/master i: 59287: 0bc08d0b8fe56314856f58fa5c3ca4e44874d3ed v: v3 --- [refs] | 2 +- trunk/drivers/md/dm-raid1.c | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 6933207a1ab7..4ab445cf0928 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f44db678edcc6f4c2779ac43f63f0b9dfa28b724 +refs/heads/master: fc1ff9588a6d56258ff9576a31aa34f17757c666 diff --git a/trunk/drivers/md/dm-raid1.c b/trunk/drivers/md/dm-raid1.c index dee4221caa73..1a876f9965e0 100644 --- a/trunk/drivers/md/dm-raid1.c +++ b/trunk/drivers/md/dm-raid1.c @@ -134,6 +134,7 @@ struct mirror_set { /* recovery */ region_t nr_regions; int in_sync; + int log_failure; struct mirror *default_mirror; /* Default mirror */ @@ -589,9 +590,9 @@ static void rh_recovery_end(struct region *reg, int success) wake(rh->ms); } -static void rh_flush(struct region_hash *rh) +static int rh_flush(struct region_hash *rh) { - rh->log->type->flush(rh->log); + return rh->log->type->flush(rh->log); } static void rh_delay(struct region_hash *rh, struct bio *bio) @@ -892,12 +893,15 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes) */ rh_inc_pending(&ms->rh, &sync); rh_inc_pending(&ms->rh, &nosync); - rh_flush(&ms->rh); + ms->log_failure = rh_flush(&ms->rh) ? 1 : 0; /* * Dispatch io. */ - while ((bio = bio_list_pop(&sync))) + if (unlikely(ms->log_failure)) + while ((bio = bio_list_pop(&sync))) + bio_endio(bio, bio->bi_size, -EIO); + else while ((bio = bio_list_pop(&sync))) do_write(ms, bio); while ((bio = bio_list_pop(&recover)))