From cff6b98c0d39eb25eb6601d60d420dfbcad7314f Mon Sep 17 00:00:00 2001 From: Jun'ichi Nomura Date: Fri, 9 Sep 2005 16:23:42 -0700 Subject: [PATCH] --- yaml --- r: 8313 b: refs/heads/master c: 844e8d904a7c1446e3f040683b4a0645c3eb168f h: refs/heads/master i: 8311: d1fc7e89feeebdddf2a2fc6398a4cfffa2df3aa1 v: v3 --- [refs] | 2 +- trunk/drivers/md/dm-raid1.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 6996338eb742..986ce71831b3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e5dcdd80a60627371f40797426273048630dc8ca +refs/heads/master: 844e8d904a7c1446e3f040683b4a0645c3eb168f diff --git a/trunk/drivers/md/dm-raid1.c b/trunk/drivers/md/dm-raid1.c index b08df8b9b2ca..863282513753 100644 --- a/trunk/drivers/md/dm-raid1.c +++ b/trunk/drivers/md/dm-raid1.c @@ -375,16 +375,18 @@ static void rh_inc(struct region_hash *rh, region_t region) read_lock(&rh->hash_lock); reg = __rh_find(rh, region); + + atomic_inc(®->pending); + + spin_lock_irq(&rh->region_lock); if (reg->state == RH_CLEAN) { rh->log->type->mark_region(rh->log, reg->key); - spin_lock_irq(&rh->region_lock); reg->state = RH_DIRTY; list_del_init(®->list); /* take off the clean list */ - spin_unlock_irq(&rh->region_lock); } + spin_unlock_irq(&rh->region_lock); - atomic_inc(®->pending); read_unlock(&rh->hash_lock); } @@ -408,6 +410,10 @@ static void rh_dec(struct region_hash *rh, region_t region) if (atomic_dec_and_test(®->pending)) { spin_lock_irqsave(&rh->region_lock, flags); + if (atomic_read(®->pending)) { /* check race */ + spin_unlock_irqrestore(&rh->region_lock, flags); + return; + } if (reg->state == RH_RECOVERING) { list_add_tail(®->list, &rh->quiesced_regions); } else {