diff -purN linux-2.6.9-11.34.EL-05/drivers/md/dm-raid1.c linux-2.6.9-11.34.EL-06/drivers/md/dm-raid1.c --- linux-2.6.9-11.34.EL-05/drivers/md/dm-raid1.c 2005-07-29 17:06:50.000000000 -0500 +++ linux-2.6.9-11.34.EL-06/drivers/md/dm-raid1.c 2005-08-01 17:09:36.588526216 -0500 @@ -240,6 +240,7 @@ static void __rh_insert(struct region_ha */ static struct region *__rh_alloc(struct region_hash *rh, region_t region) { + unsigned long flags; struct region *nreg; nreg = mempool_alloc(rh->region_pool, GFP_ATOMIC); @@ -255,9 +256,9 @@ static struct region *__rh_alloc(struct __rh_insert(rh, nreg); if (nreg->state == RH_CLEAN) { - spin_lock(&rh->region_lock); + spin_lock_irqsave(&rh->region_lock, flags); list_add(&nreg->list, &rh->clean_regions); - spin_unlock(&rh->region_lock); + spin_unlock_irqrestore(&rh->region_lock, flags); } return nreg; @@ -327,6 +328,7 @@ static void dispatch_bios(struct mirror_ static void rh_update_states(struct region_hash *rh) { + unsigned long flags; struct region *reg, *next; LIST_HEAD(clean); @@ -336,7 +338,7 @@ static void rh_update_states(struct regi * Quickly grab the lists. */ write_lock_irq(&rh->hash_lock); - spin_lock(&rh->region_lock); + spin_lock_irqsave(&rh->region_lock, flags); if (!list_empty(&rh->clean_regions)) { list_splice(&rh->clean_regions, &clean); INIT_LIST_HEAD(&rh->clean_regions); @@ -354,7 +356,7 @@ static void rh_update_states(struct regi list_for_each_entry (reg, &recovered, list) list_del(®->hash_list); } - spin_unlock(&rh->region_lock); + spin_unlock_irqrestore(&rh->region_lock, flags); write_unlock_irq(&rh->hash_lock); /* @@ -379,6 +381,7 @@ static void rh_update_states(struct regi static void rh_inc(struct region_hash *rh, region_t region) { + unsigned long flags; int rw = READ; struct region *reg; @@ -391,21 +394,21 @@ static void rh_inc(struct region_hash *r reg = __rh_find(rh, region, rw); } - spin_lock_irq(&rh->region_lock); + spin_lock_irqsave(&rh->region_lock, flags); atomic_inc(®->pending); - spin_unlock_irq(&rh->region_lock); + spin_unlock_irqrestore(&rh->region_lock, flags); if (reg->state == RH_CLEAN) { rh->log->type->mark_region(rh->log, reg->key); - spin_lock_irq(&rh->region_lock); + spin_lock_irqsave(&rh->region_lock, flags); reg->state = RH_DIRTY; list_del_init(®->list); /* take off the clean list */ - spin_unlock_irq(&rh->region_lock); + spin_unlock_irqrestore(&rh->region_lock, flags); } - if (rw == WRITE) + if (rw == WRITE) { write_unlock_irq(&rh->hash_lock); - else + } else read_unlock(&rh->hash_lock); } @@ -449,6 +452,7 @@ static void rh_dec(struct region_hash *r static int __rh_recovery_prepare(struct region_hash *rh) { int r; + unsigned long flags; struct region *reg; region_t region; @@ -474,7 +478,7 @@ static int __rh_recovery_prepare(struct write_unlock_irq(&rh->hash_lock); } - spin_lock_irq(&rh->region_lock); + spin_lock_irqsave(&rh->region_lock, flags); reg->state = RH_RECOVERING; /* Already quiesced ? */ @@ -485,7 +489,7 @@ static int __rh_recovery_prepare(struct list_del_init(®->list); list_add(®->list, &rh->quiesced_regions); } - spin_unlock_irq(&rh->region_lock); + spin_unlock_irqrestore(&rh->region_lock, flags); return 1; } @@ -504,15 +508,16 @@ static void rh_recovery_prepare(struct r */ static struct region *rh_recovery_start(struct region_hash *rh) { + unsigned long flags; struct region *reg = NULL; - spin_lock_irq(&rh->region_lock); + spin_lock_irqsave(&rh->region_lock, flags); if (!list_empty(&rh->quiesced_regions)) { reg = list_entry(rh->quiesced_regions.next, struct region, list); list_del_init(®->list); /* remove from the quiesced list */ } - spin_unlock_irq(&rh->region_lock); + spin_unlock_irqrestore(&rh->region_lock, flags); return reg; } @@ -520,11 +525,12 @@ static struct region *rh_recovery_start( /* FIXME: success ignored for now */ static void rh_recovery_end(struct region *reg, int success) { + unsigned long flags; struct region_hash *rh = reg->rh; - spin_lock_irq(&rh->region_lock); + spin_lock_irqsave(&rh->region_lock, flags); list_add(®->list, ®->rh->recovered_regions); - spin_unlock_irq(&rh->region_lock); + spin_unlock_irqrestore(&rh->region_lock, flags); wake(); } @@ -549,9 +555,9 @@ static void rh_delay(struct region_hash } bio_list_add(®->delayed_bios, bio); - if (rw == WRITE) + if (rw == WRITE) { write_unlock(&rh->hash_lock); - else + } else read_unlock(&rh->hash_lock); }